使用Spider提取数据(爬取起点中文网)
生活随笔
收集整理的這篇文章主要介紹了
使用Spider提取数据(爬取起点中文网)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- 首先介紹Scrapy中最重要的組件爬蟲(chóng)(Spider),它用于構(gòu)建HTTP請(qǐng)求并從網(wǎng)頁(yè)中提取數(shù)據(jù);接著介紹使用Item封裝數(shù)據(jù);最后介紹使用Pipeline組件對(duì)數(shù)據(jù)進(jìn)行處理,如數(shù)據(jù)清理、去重及持久化存儲(chǔ)等。
1.使用Spider提取數(shù)據(jù)
- Scrapy網(wǎng)絡(luò)爬蟲(chóng)編程的核心就是爬蟲(chóng)(Spider)組件,它其實(shí)是一個(gè)繼承于Spider的類,主要功能是封裝一個(gè)發(fā)送給網(wǎng)站服務(wù)器的HTTP請(qǐng)求,解析網(wǎng)站返回的網(wǎng)頁(yè)提取數(shù)據(jù)。
- 如何避免爬蟲(chóng)網(wǎng)站識(shí)別出來(lái)導(dǎo)致被禁呢?可以重寫(xiě)(override)start_requests()方法,手動(dòng)生成一個(gè)功能更強(qiáng)大的Request對(duì)象。因?yàn)閭窝b瀏覽器、自動(dòng)登錄等功能都是在Request對(duì)象中設(shè)置的。
- 引擎是怎么知道要將下載好的頁(yè)面發(fā)送給parse()方法而不是其他方法?能否自定義這個(gè)方法?引擎之所以能自動(dòng)定位,是因?yàn)樵赗equest對(duì)象中,指定了解數(shù)據(jù)的回調(diào)函數(shù),而默認(rèn)情況下,Request指定的解析函數(shù)就是parse()方法。
- Request對(duì)象設(shè)置了3個(gè)參數(shù):
- url:請(qǐng)求訪問(wèn)的網(wǎng)址。headers:請(qǐng)求頭信息。callback:回調(diào)函數(shù)。這是確定解析數(shù)據(jù)的函數(shù)為qidian_parse()。引擎會(huì)將下載好的頁(yè)面(Response對(duì)象)發(fā)送給該方法,執(zhí)行數(shù)據(jù)解析功能。
- 在命令行中輸入爬蟲(chóng)命令:
打開(kāi)生成的.csv文件,如圖所示
- 通過(guò)設(shè)置Request的headers和callback參數(shù)就輕松實(shí)現(xiàn)了爬蟲(chóng)偽裝和自定義解析函數(shù)的功能。看來(lái)Requst對(duì)象大有玄機(jī),通過(guò)設(shè)定各種參數(shù)還能實(shí)現(xiàn)更多有用的功能。下面就來(lái)詳細(xì)了解一下Request對(duì)象
Request對(duì)象
- Request對(duì)象用來(lái)描述一個(gè)HTTP請(qǐng)求,它通常在Spider中生成并由下載器執(zhí)行。
- Request的定義形式:
- 其中url是必填項(xiàng),其他為選填項(xiàng),下面逐個(gè)介紹這些參數(shù)。
- url:HTTP請(qǐng)求的網(wǎng)址
- methode:HTTP請(qǐng)求的方法,如GET、POST、PUT等,默認(rèn)為GET,必須大寫(xiě)英文字母。
- body:HTTP的請(qǐng)求體,類型為str或者unicode。
- headers:HTTP的請(qǐng)求頭,類型為字典型。
- cookies:請(qǐng)求的Cookie值,類型為字典型或列表型,可以實(shí)現(xiàn)自動(dòng)登錄的效果。
- encoding:請(qǐng)求的編碼方式,默認(rèn)為UTF-8。
- 以下參數(shù)設(shè)置Scrapy框架內(nèi)部的事物。
-
- callback:指定回調(diào)函數(shù),即確定頁(yè)面解析函數(shù),默認(rèn)為parse()。頁(yè)面下載完成后,回調(diào)函數(shù)將會(huì)被調(diào)用,如果在處理期間發(fā)生異常,則會(huì)調(diào)用errback()函數(shù)。
-
- meta:字典類型,用于數(shù)據(jù)的傳遞。它可以將數(shù)據(jù)傳遞給其他組件,也可傳遞給Response對(duì)象,本章的項(xiàng)目案例中會(huì)使用該參數(shù)。
-
- priority:請(qǐng)求的優(yōu)先級(jí),默認(rèn)為0,優(yōu)先級(jí)高的會(huì)優(yōu)先下載。
-
- dont_filter:如果對(duì)同一個(gè)url多次提交相同的請(qǐng)求,可以使用此項(xiàng)來(lái)忽略重復(fù)的請(qǐng)求,避免重復(fù)下載,其值默認(rèn)為False。如果設(shè)置為T(mén)rue,即使是重復(fù)的請(qǐng)求,也會(huì)強(qiáng)制下載,例如爬取實(shí)時(shí)變化的股票信息數(shù)據(jù)。
-
- errback:在處理請(qǐng)求時(shí)引發(fā)任何異常時(shí)調(diào)用的函數(shù),包括HTTP返回的404頁(yè)面不存在的錯(cuò)誤。
- Request中的參數(shù)看上去有很多,但除了url外,其他參數(shù)都有默認(rèn)值,大部分情況下不必設(shè)置。
- 介紹完Request,下面繼續(xù)研究Spider的核心:解析函數(shù)(默認(rèn)為parse()函數(shù))。它主要實(shí)現(xiàn)兩方面的功能:
- 使用Scrapy的選擇器提取頁(yè)面中的數(shù)據(jù),將其封裝后交給引擎。
- 提取頁(yè)面中的鏈接,構(gòu)造新的Request請(qǐng)求并提交給Scrapy引擎。
使用選擇器提取數(shù)據(jù)(selector類)
- Scrapy提取數(shù)據(jù)有自己的一套機(jī)制,被稱為選擇器(Selector類),它能夠自有“選擇”有xpath或css表達(dá)式指定的HTML文檔中的某些部分。Scrapy的選擇器短小簡(jiǎn)潔、解析快、準(zhǔn)確性高,使用其內(nèi)置的方法可以快速地定位和提取數(shù)據(jù)。
- 1.定位數(shù)據(jù)
- xpath(query):查找與xpath表達(dá)式匹配的節(jié)點(diǎn) ,并返回一個(gè)SelectotList對(duì)象。SelectorList對(duì)象類似于一個(gè)列表,包含了所有匹配到的節(jié)點(diǎn)。參數(shù)query是Xpath表達(dá)式的字符串。
- css(query):查找與CSS表達(dá)式匹配的節(jié)點(diǎn),并返回一個(gè)SelectorList對(duì)象。參數(shù)query是CSS表達(dá)式的字符串。
- 2.提取數(shù)據(jù)
- extract():提取文本數(shù)據(jù),返回unicode字符串列表。使用xpath()或者css()方法將匹配到的節(jié)點(diǎn)包裝為SelectorList對(duì)象后,可以使用extract()方法提取SelectorList對(duì)象中的文本,并將其存放于列表中。
- extract_first():SelectorList獨(dú)有的方法,提取SelectorList對(duì)象中第一個(gè)文本數(shù)據(jù),返回unicode字符串。
- re(regex):使用正則表達(dá)式提取數(shù)據(jù),返回所有匹配的unicode字符串列表。
- re_first():SelectorList獨(dú)有的方法,提取第一個(gè)與正則表達(dá)式匹配的字符串。
Response對(duì)象與Xpath
- 我們完全沒(méi)有必要手動(dòng)構(gòu)造一個(gè)選擇器對(duì)象來(lái)實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)信息的查找與提取。因?yàn)镾crapy將下載下來(lái)的網(wǎng)頁(yè)信息封裝到Response對(duì)象傳遞給解析函數(shù)時(shí),會(huì)自動(dòng)構(gòu)造一個(gè)選擇器作為Response對(duì)象的屬性,這樣就能通過(guò)Response對(duì)象非常方便地查找與提取網(wǎng)頁(yè)數(shù)據(jù)。
- 下面來(lái)分析一下解析函數(shù),函數(shù)框架如下:
參數(shù)response接收封裝有網(wǎng)頁(yè)信息的Response對(duì)象,這時(shí)就可以使用下面的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)的定位。
response.selector.xpath(query) response.selector.css(query)- 由于在Response中使用XPath和CSS查詢十分普遍,因此Response對(duì)象提供了兩個(gè)使用的快捷方式,他們能自動(dòng)創(chuàng)建選擇器并調(diào)用選擇器xpath()或css()方法來(lái)定位數(shù)據(jù)。簡(jiǎn)化后的方法如下:
- 下面來(lái)看一下完整的解析函數(shù)的是實(shí)現(xiàn)代碼。
- 在第4行代碼中,使用Response的xpath()方法定位到小說(shuō)信息的div元素。list_selector是一個(gè)選擇器列表,存儲(chǔ)有多個(gè)選擇器對(duì)象,一個(gè)選擇器對(duì)應(yīng)一個(gè)div元素。
- 第8行獲取小說(shuō)名稱,首先使用xpath定位到小說(shuō)名稱的文本元素,返回一個(gè)選擇器列表;然后使用extract()方法提取出文本并保存于列表中;最后再?gòu)牧斜碇蝎@取文本并賦值給name。
- 第8行代碼也可以使用extract_first()方法直接得到列表中的第一個(gè)文本,代碼修改為:
- 第15-19行代碼中,使用字典hot_dict保存爬取到一條小說(shuō)的信息。
- 在第21行代碼中,通過(guò)yield提交給hot_dict給引擎后 ,解析函數(shù)繼續(xù)執(zhí)行解析任務(wù)。引擎接收到數(shù)據(jù)后將其交由其他組件處理,這樣做的好處是節(jié)省了大量?jī)?nèi)存(只有一條數(shù)據(jù)),提高了執(zhí)行效率(解析一條,處理一條 )。如果將yield替換成return,解析函數(shù)將會(huì)立即停止。
利用settings.py將爬蟲(chóng)偽裝成瀏覽器
- 在Request中,設(shè)置參數(shù)header可以將爬蟲(chóng)偽裝成瀏覽器,以避免被網(wǎng)站偵測(cè)到。其實(shí),更普遍、更科學(xué)的做法是將其配置在settings.py中,Request對(duì)象每次調(diào)用時(shí),Scrapy會(huì)自動(dòng)將其加入。對(duì)于一個(gè)項(xiàng)目中有多個(gè)爬蟲(chóng)程序來(lái)說(shuō),能有效避免重復(fù)設(shè)置的麻煩。具體實(shí)現(xiàn)方法為:
- (1)在settings.py中啟動(dòng)并設(shè)置User-Agent。
- (2)爬蟲(chóng)類中刪除相應(yīng)代碼后的代碼如下
Response對(duì)象與CSS
- Response也支持使用CSS表達(dá)式來(lái)解析數(shù)據(jù)。
- CSS(Cascading Style Sheets,層疊樣式表),用于表現(xiàn)HTML或XML的樣式。CSS表達(dá)式的語(yǔ)法比XPath簡(jiǎn)潔,但是功能不如XPath強(qiáng)大,大多作為XPath的輔助。
- 常用的CSS表達(dá)式
- 下面還是以起點(diǎn)中文網(wǎng)小說(shuō)熱搜榜為例,改用CSS表達(dá)式實(shí)現(xiàn)數(shù)據(jù)的解析。實(shí)現(xiàn)代碼如下:
- 以上代碼中,僅將數(shù)據(jù)解析從XPath表達(dá)式替換為CSS表達(dá)式,其余沒(méi)有變化。
- 在第4行代碼中,list_selector使用CSS表達(dá)式定位到小說(shuō)信息的div元素。
- 在第6行代碼中,獲取小說(shuō)名稱的CSS表達(dá)式為h4>a::text,即定位到h4子節(jié)點(diǎn)a標(biāo)簽的文本,返回選擇器列表,再使用extract_first()方法提取出第1個(gè)文本。
- 在第12行代碼中,獲取小說(shuō)類型的CSS表達(dá)式為 .author a::text,即定位到class屬性值為author下所有a標(biāo)簽的文本,返回選擇器列表;然后使用extract()方法提取文本存儲(chǔ)于列表中;最后使用下標(biāo)獲取列表中的第1個(gè)文本。
進(jìn)一步了解Response對(duì)象
- Response用來(lái)描述一個(gè)HTTP響應(yīng),它只是一個(gè)基類。當(dāng)下載器下載完網(wǎng)頁(yè)后,下載器會(huì)根據(jù)HTTP響應(yīng)頭部的Content-Type自動(dòng)創(chuàng)建Response的子類對(duì)象。子類主要有:
- TextResponse;
- HtmlResponse;
- XmlResponse。
- 其中,TextResponse是HtmlResponse和XmlResponse的子類。我們通常爬取的網(wǎng)頁(yè),即HTML文檔,下載器創(chuàng)建的便是HtmlResponse。
- 下面以HtmlResponse為例,介紹它的屬性。
- url:響應(yīng)的url,只讀,如https://www.baidu.com
- status:HTTP響應(yīng)的狀態(tài)碼,如200、403、404。
- headers:HTTP的響應(yīng)頭,類型為自典型。
- body:HTTP的響應(yīng)體。
- meta:用于接收傳遞的數(shù)據(jù)。使用request.meta將數(shù)據(jù)傳遞出去后,可以使用response.meta獲取數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的使用Spider提取数据(爬取起点中文网)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 技术分享 | Redis 集群架构解析
- 下一篇: Java中的测不准原理