Scrapy爬虫基本使用
一、Scrapy爬蟲的第一個實例
演示HTML地址
演示HTML頁面地址:http://python123.io/ws/demo.html
文件名稱:demo.html
產生步驟
步驟1:建議一個Scrapy爬蟲工程
生成的工程目錄
python123demo/------------------------->外層目錄
scrapy.cfg ------------------------->部署Scrapy爬蟲的配置文件(將這樣的爬蟲放大特定的服務器上,并且在服務器配置好相關的操作接口,對于本機使用的爬蟲來講,不需要改變部署的配置文件)
python123demo/------------------->Scrapy框架的用戶自定義python代碼(Scrapy框架對應的所有文件所在的目錄)
__init__.py--------------------->初始化腳本,用戶不需要編寫
items.py------------------------>Items代碼模板(繼承類),Items類代碼模板,需要繼承Scrapy庫提供的Item的類,對于一般的例子,不需要用戶編寫這個文件
middlewares.py-------------->Middlewares代碼模板(繼續類),用戶希望擴展middlewares的功能,需要把這些功能寫到這個文件中
pipelines.py------------------->Pipelines代碼模板(繼承類)
settings.py--------------------->Scrapy爬蟲的配置文件,如果希望優化爬蟲功能。需要修改settings.py文件中對應的配置項
spiders/------------------------->Spiders代碼模板目錄(繼承類),目錄下存放的是python123demo這個工程中所建立的爬蟲,其中的爬蟲是要符合爬蟲模塊的約束
__init__.py--------------->初始文件,無需修改
—pycache__/----------->緩存目錄,無需修改
步驟2:在工程中產生一個Scrapy爬蟲
命令約定用戶需要給出爬蟲的名字以及所爬取的網站
D:\pycodes>cd python123demo
D:\pycodes\python123demo>scrapy genspider demo python123.io#生成一個名稱為demo的spider,也就是一個爬蟲
Created spider 'demo' using template 'basic' in module:
python123demo.spiders.demo
查看demo.py文件
# -*- coding: utf-8 -*- import scrapyclass DemoSpider(scrapy.Spider):#這個類必須是繼承scrapy.Spider類的子類name = 'demo'#當前爬蟲的名字叫demoallowed_domains = ['python123.io']#最開始用戶提交給命令行的域名,指的這個爬蟲在爬取網站的時候,只能爬取這個域名以下的相關文件start_urls = ['http://python123.io/']#以列表包含的一個或多個url,就是scrapy框架所要爬取頁面的初始頁面def parse(self, response):#解析頁面的空方法pass?
parse()用于處理響應,他可以解析從網絡中爬取的內容,并且形成字典類型,同時還能夠對網絡中爬取的內容發現其中隱含的新的需要爬取的URL步驟3:配置產生的spider爬蟲
修改demo.py文件,使他能夠按照我們的要求去訪問我們希望訪問的那個鏈接,并且對相關的鏈接內容進行爬取
對鏈接的解析部分定義的功能是將返回的html頁面存成文件
# -*- coding: utf-8 -*- import scrapyclass DemoSpider(scrapy.Spider):name = 'demo'#allowed_domains = ['python123.io']start_urls = ['http://python123.io/ws/demo.html']def parse(self, response):fname = response.url.split('/')[-1]with open(fname,'wb') as f:f.write(response.body)self.log('Saved file %s.' % name)?
步驟4:運行爬蟲,獲取網頁。
D:\pycodes\python123demo>scrapy crawl demo
D:\pycodes\python123demo>scrapy crawl demo 2019-08-06 11:43:58 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: python123demo) 2019-08-06 11:43:58 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.9.0, Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0j 20 Nov 2018), cryptography 2.4.2, Platform Windows-10-10.0.17134-SP0 2019-08-06 11:43:58 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'python123demo', 'NEWSPIDER_MODULE': 'python123demo.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['python123demo.spiders']} 2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats','scrapy.extensions.telnet.TelnetConsole','scrapy.extensions.logstats.LogStats'] 2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware','scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware','scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware','scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware','scrapy.downloadermiddlewares.useragent.UserAgentMiddleware','scrapy.downloadermiddlewares.retry.RetryMiddleware','scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware','scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware','scrapy.downloadermiddlewares.redirect.RedirectMiddleware','scrapy.downloadermiddlewares.cookies.CookiesMiddleware','scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware','scrapy.downloadermiddlewares.stats.DownloaderStats'] 2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware','scrapy.spidermiddlewares.offsite.OffsiteMiddleware','scrapy.spidermiddlewares.referer.RefererMiddleware','scrapy.spidermiddlewares.urllength.UrlLengthMiddleware','scrapy.spidermiddlewares.depth.DepthMiddleware'] 2019-08-06 11:43:58 [scrapy.middleware] INFO: Enabled item pipelines: [] 2019-08-06 11:43:58 [scrapy.core.engine] INFO: Spider opened 2019-08-06 11:43:59 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2019-08-06 11:43:59 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 2019-08-06 11:43:59 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://python123.io/robots.txt> from <GET http://python123.io/robots.txt> 2019-08-06 11:44:00 [scrapy.core.engine] DEBUG: Crawled (404) <GET https://python123.io/robots.txt> (referer: None) 2019-08-06 11:44:00 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://python123.io/ws/demo.html> from <GET http://python123.io/ws/demo.html> 2019-08-06 11:44:00 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://python123.io/ws/demo.html> (referer: None) 2019-08-06 11:44:00 [scrapy.core.scraper] ERROR: Spider error processing <GET https://python123.io/ws/demo.html> (referer: None) Traceback (most recent call last):File "d:\users\bj\appdata\local\programs\python\python36\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbackscurrent.result = callback(current.result, *args, **kw)File "D:\pycodes\python123demo\python123demo\spiders\demo.py", line 14, in parseself.log('Saved file %s.' % name) NameError: name 'name' is not defined 2019-08-06 11:44:00 [scrapy.core.engine] INFO: Closing spider (finished) 2019-08-06 11:44:00 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 888,'downloader/request_count': 4,'downloader/request_method_count/GET': 4,'downloader/response_bytes': 1901,'downloader/response_count': 4,'downloader/response_status_count/200': 1,'downloader/response_status_count/301': 2,'downloader/response_status_count/404': 1,'finish_reason': 'finished','finish_time': datetime.datetime(2019, 8, 6, 3, 44, 0, 978216),'log_count/DEBUG': 5,'log_count/ERROR': 1,'log_count/INFO': 7,'response_received_count': 2,'scheduler/dequeued': 2,'scheduler/dequeued/memory': 2,'scheduler/enqueued': 2,'scheduler/enqueued/memory': 2,'spider_exceptions/NameError': 1,'start_time': datetime.datetime(2019, 8, 6, 3, 43, 59, 189943)} 2019-08-06 11:44:00 [scrapy.core.engine] INFO: Spider closed (finished)?
二、yield關鍵字的使用
yield是python3中33個關鍵字中的一個,也是非常重要的一個關鍵字
這個關鍵字與生成器這個概念息息相關
yield<---------------------------------->生成器
生成器是一個不斷產生值的函數
包含yield語句的函數是一個生成器
生成器在每次運行的時候,會產生一個值(yield語句),產生值之后,生成器被凍結,直到這個函數被再次喚醒的時候,生成器繼續執行,產生一個新的值
生成器喚醒時,所使用的局部變量的值跟之前執行所使用的的值是一致的。
生成器寫法
def gen(n):
for i in range(n):
yield i**2
生成器的使用一般與循環搭配在一起,可以用一個for循環來調用生成器
>>> def gen(n): ... for i in range(n): ... yield i**2 ... >>> for i in gen(5): ... print(i," ",end="") ... 0 1 4 9 16#每次返回一個值,再次被調用時,才產生第二個值,使用的存儲空間仍然是一個元素的存儲空間
在for循環中,每次調用生成器時,生成器會返回一個值,這個值被打印出來,同時由于for循環產生的循環遍歷會把調用gen產生的所有的值都能喚醒一次
普通寫法
>>> def square(n): ... ls = [i**2 for i in range(n)] ... return ls ... >>> for i in square(5): ... print(i," ",end="") ... 0 1 4 9 16#列表將n=5之內的所有結果存儲起來,通過列表返回
為何要有生成器?
生成器相比一次列出所有內容的優勢
更節省存儲空間
響應更迅速
使用更靈活
三、Scrapy爬蟲的基本使用
Scrapy爬蟲的使用步驟
步驟1:創建一個工程和Spider模板
步驟2:編寫Spider
步驟3:編寫Item Pipeline(對Spider提取信息的后續處理做相關的定義)
步驟4:優化配置策略
Scrapy爬蟲的數據類型
Request類
class scrapy.http.Request()
Request對象表示一個HTTP請求
由Spider生成,由Downloader執行
Response類
class scrapy.http.Response()
Response對象表示一個HTTP響應。
由Downloader生成,由Spider處理。
Item類(由Spider產生的信息封裝的類)
class scrapy.item.Item()
Item對象表示一個從HTML頁面中提取的信息內容
由Spider生成,由Item Pipeline處理
Item類似字典類型,可以按照字典類型操作
Scrapy爬蟲提取信息的方法
Scrapy爬蟲支持多種HTML信息提取方法
Beautlful Soup
lxml
re
XPath Selector
CSS?Selector
CSS?Selector的基本使用
<HTML>.css('a::attr(href)').extract()? 注:a是標簽名字,href標簽屬性
CSS?Selector由W3C組織(是國際公認的,也是比較權威的推進HTML頁面標準化的組織)維護并規范
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/suitcases/p/11304320.html
總結
以上是生活随笔為你收集整理的Scrapy爬虫基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近项目中遇到的一个算法挑战
- 下一篇: 怎么样能找到国外的群?