(八) 爬虫教程 |Scrapy框架的使用
一、Scrapy框架的介紹
Scrapy是一個(gè)基于Twisted 的異步處理框架,是純 Python 實(shí)現(xiàn)的爬蟲(chóng)框架,其架構(gòu)清晰,模塊之間的耦合程度低,可擴(kuò)展性極強(qiáng),可以靈活完成各種需求。
1.1架構(gòu)介紹
- 1.Engine:引擎,處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理、觸發(fā)事物
- Item:項(xiàng)目,它定義了怕去結(jié)果的數(shù)據(jù)結(jié)構(gòu),爬取的數(shù)據(jù)會(huì)被賦值成該Item對(duì)象
- Scheduler:調(diào)度器,接受引擎發(fā)過(guò)來(lái)的請(qǐng)求并將其加入隊(duì)列中,在引擎再次請(qǐng)求的時(shí)候即哪個(gè)請(qǐng)求提供給引擎
- Downloader:下載器,下載網(wǎng)頁(yè)內(nèi)容,并將網(wǎng)頁(yè)內(nèi)容返回給蜘蛛
- Spider:蜘蛛,定義了爬蟲(chóng)的邏輯和網(wǎng)頁(yè)的解析規(guī)則,他主要負(fù)責(zé)解析響應(yīng)并生成提取結(jié)果和新的請(qǐng)求
- Item Pipeline:項(xiàng)目管道,負(fù)責(zé)處理由蜘蛛從網(wǎng)頁(yè)中抽取的項(xiàng)目,它的主要任務(wù)是清洗、驗(yàn)證和存儲(chǔ)數(shù)據(jù)
- Downloader Middlewares:下載器中間件,位于引擎和下載器之間的鉤子框架,主要處理引擎與下載器之間的請(qǐng)求及相應(yīng)
- Spider Middlewares:蜘蛛的中間件,位于引擎和蜘蛛之間的鉤子框架,主要處理蜘蛛輸入的響應(yīng)和輸出的結(jié)果以及新的請(qǐng)求
1.2.數(shù)據(jù)流
Scrapy中的數(shù)據(jù)流由引擎控制,通過(guò)多個(gè)組件的相互協(xié)作、不同完成工作的不同、組件對(duì)異步處理的支持,Scrapy最大限度也利用了網(wǎng)絡(luò)寬帶,大大提高了數(shù)據(jù)爬取和處理的效率。數(shù)據(jù)流的過(guò)程如下:
- 1.Engine首先打開(kāi)一個(gè)網(wǎng)站,找到處理該網(wǎng)站的Spider,并向該Spider請(qǐng)求第一個(gè)要爬取的URL
- 2.Engine從Spider中獲取到第一個(gè)要爬取的URL,并通過(guò)Scheduler以Request的形式調(diào)度
- 3.Engine向Scheduler請(qǐng)求下一個(gè)要爬取的URL
- 4.Scheduler返回下一個(gè)要爬取的URL給Engine,Engine將URL通過(guò)Downloader
- 5.一旦頁(yè)面下載完畢,Downloader生成頁(yè)面的Response,并將其通過(guò)Downloader Middlewares
- 6.Engine從下載器中接收到Response,并將其通過(guò)Spider Middlewares發(fā)送給Spider處理
- 7.Spider處理Response,并返回爬取到的Item及新的Request給Engine
- 8.Engine將Spider返回的Item給Item Pipeline,將新的Request給Scheduler
- 9.重復(fù)(2)-(8)的步驟,直到Scheduler中沒(méi)有更多的Request,Engine關(guān)閉該網(wǎng)站,爬取結(jié)束
二、Scrapy安裝
Scrapy 一個(gè)十分強(qiáng)大的爬蟲(chóng)框架 ,依賴(lài)的庫(kù)比較多 ,至少需要依賴(lài)的庫(kù)有 Twisted 14.0、lxml 3.4、pyOpenSSL0.14。在不同的平臺(tái)環(huán)境下,它所依賴(lài)的庫(kù)也各不相同,所以在安裝之前,最好確保把這些基本庫(kù)安裝好。
- 1.首先我們安裝好Anaconda,此前我有些過(guò)關(guān)于關(guān)于conda的使用博客可以參考
- 2.安裝好conda,就可以直接通過(guò)命令安裝Scrapy
2.1.驗(yàn)證安裝
安裝之后,在命令行下輸入scrapy,出現(xiàn)類(lèi)似如下圖,就證明Scrapy安裝完成
三、Scrapy入門(mén)
3.1創(chuàng)建項(xiàng)目
- 1.我們?cè)诮K端中輸入此命令,這個(gè)命令可以在任意文件夾運(yùn)行
- 2.這個(gè)命令將會(huì)創(chuàng)建一個(gè)名為once的文件夾
- 3.如果提示權(quán)限問(wèn)題,可以加sudo運(yùn)行該命令
-
文件夾結(jié)構(gòu)如下所示:
- scrapy.cfg Scrapy部署時(shí)的配置文件
- once 項(xiàng)目的模塊,需要從這里引入
- __ init__.py
- item.py Item的定義,定義爬取的數(shù)據(jù)結(jié)構(gòu)
- middlewares.py Middlewares的定義,定義爬取時(shí)的中間件
- pipelines.py Pipelines的定義,定義數(shù)據(jù)管道
- settings.py 配置文件
- spiders 配置文件
3.2創(chuàng)建Spider
Spider是自己定義的類(lèi),Scrapy 用它來(lái)從網(wǎng)頁(yè)里抓取內(nèi)容,并解析抓取的結(jié)果。不過(guò)這個(gè)類(lèi)必須繼承 Scrapy 提供的Spider類(lèi)scrapy.Spider ,還要定義 Spider 的名稱(chēng)和起始請(qǐng)求,以及怎樣處理爬取的結(jié)果的方法
- 1.首先進(jìn)入scrapy爬蟲(chóng)
- 2.然后在執(zhí)行如下命令(生成一個(gè)名稱(chēng)為baidutieba的spider),生成的baidutieba.py在文件once文件里面的spiders目錄下
這里有三個(gè)屬性 — name、allowed_domains、start_urls還有一個(gè)方法parse
- name:它是每個(gè)項(xiàng)目唯一的名字,用來(lái)區(qū)分不同的Spider
- allowed_domains:它是允許爬取的域名,如果初始或后續(xù)的請(qǐng)求鏈接不是這個(gè)域名下的,則請(qǐng)求鏈接會(huì)被過(guò)濾掉
- start_urls:它包含了Spider在啟動(dòng)時(shí)爬去的url列表,初始請(qǐng)求是由它來(lái)定義的
- parse:它是Spider的一個(gè)方法。默認(rèn)情況下,被調(diào)用時(shí)start_urls里面的鏈接構(gòu)成的請(qǐng)求完成下載執(zhí)行后,返回的響應(yīng)就會(huì)作為唯一的參數(shù)傳遞給這個(gè)函數(shù)。該方法負(fù)責(zé)解析返回的響應(yīng)、提取數(shù)據(jù)或者進(jìn)一步生成要處理的請(qǐng)求
三、項(xiàng)目文件詳情
- BOT_NAME:項(xiàng)目名
- SPIDER_MODULES:Scrapy搜索spider的模塊列表 默認(rèn): [xxx.spiders]
- NEWSPIDER_MODULE:使用 genspider 命令創(chuàng)建新spider的模塊。默認(rèn): ‘xxx.spiders’
- USER_AGENT:默認(rèn)是注釋的,如果不寫(xiě)很容易被判斷為電腦USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36’
- ROBOTSTXT_OBEY:如果啟用,Scrapy將會(huì)采用 robots.txt策略
- CONCURRENT_REQUESTS:Scrapy downloader 并發(fā)請(qǐng)求(concurrent requests)的最大值,默認(rèn): 16
- DOWNLOAD_DELAY:下載器在下載同一個(gè)網(wǎng)站下一個(gè)頁(yè)面前需要等待的時(shí)間,該選項(xiàng)可以用來(lái)限制爬取速度,減輕服務(wù)器壓力。同時(shí)也支持小數(shù):0.25 以秒為單位
- 下載延遲設(shè)置只有一個(gè)有效
- CONCURRENT_REQUESTS_PER_DOMAIN:對(duì)單個(gè)網(wǎng)站進(jìn)行并發(fā)請(qǐng)求的最大值。
- CONCURRENT_REQUESTS_PER_IP = 16:對(duì)單個(gè)IP進(jìn)行并發(fā)請(qǐng)求的最大值。如果非0,則忽略 CONCURRENT_REQUESTS_PER_DOMAIN 設(shè)定,使用該設(shè)定。 也就是說(shuō),并發(fā)限制將針對(duì)IP,而不是網(wǎng)站。該設(shè)定也影響 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,下載延遲應(yīng)用在IP而不是網(wǎng)站上。
- COOKIES_ENABLED :禁用Cookie(默認(rèn)情況下啟用)
- TELNETCONSOLE_ENABLED:禁用Telnet控制臺(tái)(默認(rèn)啟用)
- DEFAULT_REQUEST_HEADERS:覆蓋默認(rèn)請(qǐng)求標(biāo)頭
- SPIDER_MIDDLEWARES:啟用或禁用蜘蛛中間件
- DOWNLOADER_MIDDLEWARES:啟用或禁用下載器中間件
- EXTENSIONS:啟用或禁用擴(kuò)展程序
- ITEM_PIPELINES:配置項(xiàng)目管道
- AUTOTHROTTLE_ENABLED:啟用和配置AutoThrottle擴(kuò)展(默認(rèn)情況下禁用)
- AUTOTHROTTLE_START_DELAY:初始下載延遲
- AUTOTHROTTLE_MAX_DELAY:在高延遲的情況下設(shè)置的最大下載延遲
- AUTOTHROTTLE_TARGET_CONCURRENCY:Scrapy請(qǐng)求的平均數(shù)量應(yīng)該并行發(fā)送每個(gè)遠(yuǎn)程服務(wù)器
- AUTOTHROTTLE_DEBUG:啟用顯示所收到的每個(gè)響應(yīng)的調(diào)節(jié)統(tǒng)計(jì)信息
- 啟用和配置HTTP緩存(默認(rèn)情況下禁用):
- #HTTPCACHE_ENABLED
- HTTPCACHE_EXPIRATION_SECS
- HTTPCACHE_DIR
- HTTPCACHE_IGNORE_HTTP_CODES
- HTTPCACHE_STORAGE
四、實(shí)戰(zhàn) - Scrapy爬取百度貼吧頁(yè)面
- 1.首先,我們打開(kāi)項(xiàng)目中剛才生成的baidutieba.py文件編寫(xiě)爬取代碼
- 2.進(jìn)入spiders,執(zhí)行以下命令
- 3.回車(chē)運(yùn)行,我們可以發(fā)現(xiàn)once目錄下生成了一個(gè)hello.txt的文件,里面就是百度貼吧網(wǎng)頁(yè)源碼
總結(jié)
以上是生活随笔為你收集整理的(八) 爬虫教程 |Scrapy框架的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ZZULIOJ 1190: 按出生日期排
- 下一篇: 赞美是朵花,赠人玫瑰,手有余香