因?yàn)橄胍@取一些關(guān)于古詩(shī)詞的數(shù)據(jù)曲梗,但并沒(méi)有找到滿(mǎn)意的數(shù)據(jù)庫(kù)文件哮缺,所以就想通過(guò)爬蟲(chóng)來(lái)獲取弄跌,十分苦悶的是,對(duì)于Python爬蟲(chóng)尝苇,之前從來(lái)沒(méi)有接觸過(guò)铛只,還好在git上找到了代碼:GushiwenSpider 埠胖,感激之情無(wú)以言表,然而尷尬的是淳玩,源碼就在手上直撤,愣是運(yùn)行的一塌糊涂。
為了做現(xiàn)在的項(xiàng)目蜕着,所以電腦里有Python2.7谋竖,就沒(méi)有安裝最新版,先是安裝了pip承匣,修改了環(huán)境變量蓖乘,項(xiàng)目以scrapy開(kāi)源框架,所以需要安裝scrapy韧骗。
但實(shí)際情況是驱敲,并不能自動(dòng)下載所需要的whl文件,所以在下載某個(gè)包出錯(cuò)的時(shí)候宽闲,可以用一個(gè)非常有用的網(wǎng)址:Unofficial Windows Binaries for Python Extension Packages
把需要的whl文件手動(dòng)下載安裝众眨。
部署好后做一下測(cè)驗(yàn):scrapy shell .......
項(xiàng)目里面還用到了scrapy_redis,scrapy-redis的原理是巧妙的利用redis隊(duì)列容诬,實(shí)現(xiàn) request queue和 items queue娩梨,利用redis的 set實(shí)現(xiàn)request的去重,將scrapy從單臺(tái)機(jī)器擴(kuò)展多臺(tái)機(jī)器览徒,實(shí)現(xiàn)較大規(guī)模的爬蟲(chóng)集群狈定。
安裝Redis,然后切換目錄到C:\redis運(yùn)行
redis-server.exe redis.windows.conf
這時(shí)候另啟一個(gè)cmd窗口习蓬,原來(lái)的不要關(guān)閉纽什,不然就無(wú)法訪(fǎng)問(wèn)服務(wù)端了。
切換到redis目錄下運(yùn)行redis-cli.exe -h 127.0.0.1 -p 6379躲叼。
測(cè)試:
設(shè)置鍵值對(duì)set myKey abc
取出鍵值對(duì)get myKey
用scrapy crawl ......? 啟動(dòng)項(xiàng)目
用scrapy check檢測(cè)爬蟲(chóng)是否正常
然而也不知道是因?yàn)榕老x(chóng)項(xiàng)目運(yùn)行的不正確還是redis不正確芦缰,其他幾個(gè)爬蟲(chóng)文件并不能爬到數(shù)據(jù),于是進(jìn)度開(kāi)始停滯不前枫慷。
在網(wǎng)上找了關(guān)于爬蟲(chóng)的視頻教程让蕾,準(zhǔn)備學(xué)習(xí)一下原理:
手頭并沒(méi)有其他的爬蟲(chóng)項(xiàng)目,于是就拿這個(gè)古詩(shī)詞的爬蟲(chóng)項(xiàng)目解析了或听,望編寫(xiě)這個(gè)項(xiàng)目的大佬見(jiàn)諒探孝,再次表達(dá)感激之情。
items.py是項(xiàng)目的目標(biāo)文件
Item是保存爬取到的數(shù)據(jù)的容器誉裆;其使用方法和python字典類(lèi)似顿颅, 并且提供了額外保護(hù)機(jī)制來(lái)避免拼寫(xiě)錯(cuò)誤導(dǎo)致的未定義字段錯(cuò)誤。
pipelines.py是項(xiàng)目的管道文件
管道文件:
當(dāng)Item在Spider中被收集之后足丢,它將會(huì)被傳遞到Item Pipeline粱腻,一些組件會(huì)按照一定的順序執(zhí)行對(duì)Item的處理绍填。
每個(gè)item pipeline組件(有時(shí)稱(chēng)之為“Item Pipeline”)是實(shí)現(xiàn)了簡(jiǎn)單方法的Python類(lèi)。他們接收到Item并通過(guò)它執(zhí)行一些行為栖疑,同時(shí)也決定此Item是否繼續(xù)通過(guò)pipeline讨永,或是被丟棄而不再進(jìn)行處理。以下是item pipeline的一些典型應(yīng)用:
1.驗(yàn)證爬取的數(shù)據(jù)(檢查item包含某些字段)遇革,如果有做相應(yīng)處理
2.查重(并丟棄)卿闹,在init方法里創(chuàng)建一個(gè)集合,每個(gè)數(shù)據(jù)存到集合里面萝快,如果集合里有這個(gè)數(shù)據(jù)就可以不往里面寫(xiě)了锻霎,管道就是一個(gè)個(gè)接收item的,所以可以做去重處理揪漩,url請(qǐng)求去重是在調(diào)度器實(shí)現(xiàn)旋恼,數(shù)據(jù)去重在管道實(shí)現(xiàn)。
3.將爬取結(jié)果保存到數(shù)據(jù)庫(kù)中
settings.py是項(xiàng)目的設(shè)置文件.
Rules的一些說(shuō)明:
rules: 是Rule對(duì)象的集合奄容,用于匹配目標(biāo)網(wǎng)站并排除干擾
parse_start_url: 用于爬取起始響應(yīng)冰更,必須要返回Item,Request中的一個(gè)昂勒。
因?yàn)?i>rules是Rule對(duì)象的集合蜀细,所以這里也要介紹一下Rule。它有幾個(gè)參數(shù):link_extractor戈盈、callback=None奠衔、cb_kwargs=None、follow=None塘娶、process_links=None归斤、process_request=None
其中的link_extractor既可以自己定義,也可以使用已有LinkExtractor類(lèi)刁岸,主要參數(shù)為:
allow:滿(mǎn)足括號(hào)中“正則表達(dá)式”的值會(huì)被提取脏里,如果為空,則全部匹配难捌。
deny:與這個(gè)正則表達(dá)式(或正則表達(dá)式列表)不匹配的URL一定不提取膝宁。
allow_domains:會(huì)被提取的鏈接的domains。
deny_domains:一定不會(huì)被提取鏈接的domains根吁。
restrict_xpaths:使用xpath表達(dá)式,和allow共同作用過(guò)濾鏈接合蔽。還有一個(gè)類(lèi)似的restrict_css
Item Loader一些補(bǔ)充:
Item Loaders提供了一種便捷的方式填充抓取到的 Items 击敌。從另一方面來(lái)說(shuō), Items 提供保存抓取數(shù)據(jù)的容器拴事, 而 Item Loaders提供的是填充容器的機(jī)制沃斤。
要使用Item Loader, 你必須先將它實(shí)例化. 可以使用類(lèi)似字典的對(duì)象來(lái)進(jìn)行實(shí)例化, 或者不使用對(duì)象也可以, 當(dāng)不用對(duì)象進(jìn)行實(shí)例化的時(shí)候,Item會(huì)自動(dòng)使用 ItemLoader.default_item_class 屬性中指定的Item 類(lèi)在Item Loader constructor中實(shí)例化.
name 字段被從頁(yè)面中兩個(gè)不同的XPath位置提取:
1.//div[@class="product_name"]
2.//div[@class="product_title"]
換言之,數(shù)據(jù)通過(guò)用add_xpath()的方法,把從兩個(gè)不同的XPath位置提取的數(shù)據(jù)收集起來(lái). 這是將在以后分配給name字段中的數(shù)據(jù)?
最終, 當(dāng)所有數(shù)據(jù)被收集起來(lái)之后, 調(diào)用ItemLoader.load_item()方法, 實(shí)際上填充并且返回了之前通過(guò)調(diào)用add_xpath(),add_css(),and add_value()所提取和收集到的數(shù)據(jù)的Item.
直到剛才圣蝎,我終于找出了我運(yùn)行不出結(jié)果的原因,這半個(gè)月以來(lái)衡瓶,我一直以為徘公,項(xiàng)目里給的數(shù)據(jù)庫(kù)表結(jié)構(gòu)長(zhǎng)成如下的樣子:
這使我百思不得其解,然而我只是覺(jué)得其中的玄妙并不是我等凡人所能領(lǐng)會(huì)的哮针,照做就可以了关面,一直覺(jué)得是運(yùn)行不出是代碼的某部分可能與Windows或Python2.7不兼容之類(lèi)的導(dǎo)致,直到剛才某一剎那十厢,我把excel的下拉框向上移了一下......原來(lái)與這個(gè)代碼不兼容的等太,是我的智商。
參考: