Scrapy終端是一個(gè)交互終端,我們可以在未啟動(dòng)spider的情況下嘗試及調(diào)試代碼页响,也可以用來(lái)測(cè)試XPath或CSS表達(dá)式段誊,查看他們的工作方式,方便我們爬取的網(wǎng)頁(yè)中提取的數(shù)據(jù)没陡。
如果安裝了 IPython 索赏,Scrapy終端將使用 IPython (替代標(biāo)準(zhǔn)Python終端)潜腻。 IPython 終端與其他相比更為強(qiáng)大,提供智能的自動(dòng)補(bǔ)全童番,高亮輸出,及其他特性剃斧。(推薦安裝IPython)
Python學(xué)習(xí)資料或者需要代碼幼东、視頻加Python學(xué)習(xí)群:960410445
1 啟動(dòng)Scrapy Shell
進(jìn)入項(xiàng)目的根目錄,執(zhí)行下列命令來(lái)啟動(dòng)shell:
scrapyshell"https://hr.tencent.com/position.php?&start=0#a"
Scrapy Shell根據(jù)下載的頁(yè)面會(huì)自動(dòng)創(chuàng)建一些方便使用的對(duì)象策橘,例如 Response 對(duì)象娜亿,以及Selector 對(duì)象 (對(duì)HTML及XML內(nèi)容)。
當(dāng)shell載入后沛婴,將得到一個(gè)包含response數(shù)據(jù)的本地 response 變量督赤,輸入response.body將輸出response的包體躲舌,輸出response.headers可以看到response的包頭。
輸入response.selector時(shí)没卸, 將獲取到一個(gè)response 初始化的類(lèi) Selector 的對(duì)象约计,此時(shí)可以通過(guò)使用response.selector.xpath()或response.selector.css()來(lái)對(duì) response 進(jìn)行查詢。
Scrapy也提供了一些快捷方式, 例如response.xpath()或response.css()同樣可以生效(如之前的案例)耕挨。
2 Selectors選擇器
Scrapy Selectors 內(nèi)置 XPath 和 CSS Selector 表達(dá)式機(jī)制
Selector有四個(gè)基本的方法尉桩,最常用的還是xpath:
xpath(): 傳入xpath表達(dá)式,返回該表達(dá)式所對(duì)應(yīng)的所有節(jié)點(diǎn)的selector list列表
extract(): 序列化該節(jié)點(diǎn)為Unicode字符串并返回list
css(): 傳入CSS表達(dá)式翰苫,返回該表達(dá)式所對(duì)應(yīng)的所有節(jié)點(diǎn)的selector list列表沽瘦,語(yǔ)法同 BeautifulSoup4
re(): 根據(jù)傳入的正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行提取析恋,返回Unicode字符串list列表
response.xpath('//title')
3 Item Pipeline
當(dāng)Item在Spider中被收集之后,它將會(huì)被傳遞到Item Pipeline筑凫,這些Item Pipeline組件按定義的順序處理Item并村。
每個(gè)Item Pipeline都是實(shí)現(xiàn)了簡(jiǎn)單方法的Python類(lèi),比如決定此Item是丟棄而存儲(chǔ)棚潦。以下是item pipeline的一些典型應(yīng)用:
驗(yàn)證爬取的數(shù)據(jù)(檢查item包含某些字段膝昆,比如說(shuō)name字段)
查重(并丟棄)
將爬取結(jié)果保存到文件或者數(shù)據(jù)庫(kù)中
編寫(xiě)item pipeline很簡(jiǎn)單荚孵,item pipiline組件是一個(gè)獨(dú)立的Python類(lèi),其中process_item()方法必須實(shí)現(xiàn):
Pipeline實(shí)現(xiàn)文件的寫(xiě)入打開(kāi)操作
以下pipeline將所有(從所有'spider'中)爬取到的item骄呼,存儲(chǔ)到一個(gè)獨(dú)立地txt文件
啟用一個(gè)Item Pipeline組件
為了啟用Item Pipeline組件蜓萄,必須將它的類(lèi)添加到 settings.py文件ITEM_PIPELINES 配置哆致,就像下面這個(gè)例子:
ITEM_PIPELINES = {'tianya.pipelines.TianyaPipeline':300,}
分配給每個(gè)類(lèi)的整型值,確定了他們運(yùn)行的順序耻蛇,item按數(shù)字從低到高的順序胞此,通過(guò)pipeline,通常將這些數(shù)字定義在0-1000范圍內(nèi)(0-1000隨意設(shè)置夺蛇,數(shù)值越低酣胀,組件的優(yōu)先級(jí)越高)
4 Spider
Spider類(lèi)定義了如何爬取某個(gè)(或某些)網(wǎng)站。包括了爬取的動(dòng)作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁(yè)的內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)(爬取item)甚脉。 換句話說(shuō)牺氨,Spider就是您定義爬取的動(dòng)作及分析某個(gè)網(wǎng)頁(yè)(或者是有些網(wǎng)頁(yè))的地方。
class scrapy.Spider是最基本的類(lèi)夷狰,所有編寫(xiě)的爬蟲(chóng)必須繼承這個(gè)類(lèi)郊霎。
主要用到的函數(shù)及調(diào)用順序?yàn)椋?/p>
__init__(): 初始化爬蟲(chóng)名字和start_urls列表
start_requests() 調(diào)用make_requests_from url():生成Requests對(duì)象交給Scrapy下載并返回response
parse(): 解析response,并返回Item或Requests(需指定回調(diào)函數(shù))瘫证。Item傳給Item pipline持久化 庄撮, 而Requests交由Scrapy下載洞斯,并由指定的回調(diào)函數(shù)處理(默認(rèn)parse()),一直進(jìn)行循環(huán)么抗,直到處理完所有的數(shù)據(jù)為止亚铁。
源碼參考
主要屬性和方法
name
定義spider名字的字符串徘溢。
例如,如果spider爬取 mywebsite.com 然爆,該spider通常會(huì)被命名為 mywebsite
allowed_domains
包含了spider允許爬取的域名(domain)的列表曾雕,可選。
start_urls
初始URL元祖/列表切诀。當(dāng)沒(méi)有制定特定的URL時(shí),spider將從該列表中開(kāi)始進(jìn)行爬取检盼。
start_requests(self)
該方法必須返回一個(gè)可迭代對(duì)象(iterable)翘单。該對(duì)象包含了spider用于爬缺脑(默認(rèn)實(shí)現(xiàn)是使用 start_urls 的url)的第一個(gè)Request柬唯。
當(dāng)spider啟動(dòng)爬取并且未指定start_urls時(shí),該方法被調(diào)用失晴。
parse(self, response)
當(dāng)請(qǐng)求url返回網(wǎng)頁(yè)沒(méi)有指定回調(diào)函數(shù)時(shí)拘央,默認(rèn)的Request對(duì)象回調(diào)函數(shù)。用來(lái)處理網(wǎng)頁(yè)返回的response拆又,以及生成Item或者Request對(duì)象栏账。
log(self, message[, level, component])
使用 scrapy.log.msg() 方法記錄(log)message。 更多數(shù)據(jù)請(qǐng)參見(jiàn)logging
5 案例:騰訊招聘網(wǎng)自動(dòng)翻頁(yè)采集
創(chuàng)建一個(gè)新的爬蟲(chóng):
scrapy genspider tencent "tencent.com"
編寫(xiě)items.py
獲取職位名稱(chēng)竖般、詳細(xì)信息涣雕、
編寫(xiě)tencent.py
編寫(xiě)pipeline.py文件
在 setting.py 里設(shè)置ITEM_PIPELINES
ITEM_PIPELINES = {"mySpider.pipelines.TencentJsonPipeline":300}
執(zhí)行爬蟲(chóng):
scrapy crawl tencent.py