使用python,scrapy寫(xiě)(定制)爬蟲(chóng)的經(jīng)驗(yàn)刽锤,資料镊尺,雜。(轉(zhuǎn))

~ 寫(xiě)在正文之前:文章轉(zhuǎn)移到翻這個(gè)墻中并思,希望繼續(xù)關(guān)注啦庐氮。(2017.11.5)

本文轉(zhuǎn)載自:http://my.oschina.net/u/1024140/blog/188154?fromerr=AEvPN6XJ

近期找工作略不順。技術(shù)無(wú)用宋彼。晚上寫(xiě)下了這點(diǎn)東西弄砍。
首先說(shuō)下最近在找工作的x的大概相關(guān)技術(shù)加點(diǎn)路線颅筋。py 3年+,linux日常熟練输枯,限于不擅web、手機(jī)app開(kāi)發(fā)占贫,一直無(wú)太好的可展示的東西桃熄。前段時(shí)間從一家小公司離職。年前投下型奥,沒(méi)啥的話瞳收,年后再看下。先投的py爬蟲(chóng)的厢汹,沒(méi)合適的再看運(yùn)維和py相關(guān)其他螟深。
正文開(kāi)始前略吐槽下,我之前工作的小公司烫葬,在我去之前界弧,還是多線程urllib爬正則解析,網(wǎng)頁(yè)編碼解析從GBK搭综,UTF8依次猜垢箕。他有點(diǎn)強(qiáng)讓我走了。

我開(kāi)始大量使用scrapy時(shí)兑巾,scrapy已是0.16版条获。這個(gè)版本相對(duì)比較成熟,該版本持續(xù)了近一年時(shí)間蒋歌,13年夏發(fā)布0.18版帅掘。在網(wǎng)上搜scrapy資料,中文的相對(duì)較少堂油,為數(shù)不多的幾篇也多寫(xiě)于scrapy較早的版本(提醒看資料注意發(fā)布時(shí)間)修档。從舊資料看,早期的scrapy称诗,還沒(méi)有dns解析緩存萍悴,url去重等功能。到0.16時(shí)寓免,scrapy已基本成型癣诱,差的幾個(gè)功能(如HTTP長(zhǎng)連接,仿瀏覽器緩存機(jī)制(RFCXXXX)的CACHE)陸續(xù)在0.18袜香,0.20里面上實(shí)現(xiàn)了撕予。Scrapinghub(寫(xiě)scrapy的人搞得公司)上的產(chǎn)品也更豐富了。
scrapy的優(yōu)點(diǎn)在于成熟完善蜈首,定制開(kāi)發(fā)快实抡。
scrapy對(duì)比其他我所知的定制爬蟲(chóng)解決方案欠母。主要對(duì)比python內(nèi)的幾個(gè)方案。
JAVA:nutch吆寨,hetrix...etc赏淌。這幾個(gè)更適合做通用爬蟲(chóng)或少量的定制爬蟲(chóng),相對(duì)scrapy優(yōu)點(diǎn)是資料比較多啄清,成熟六水。不過(guò)用java系的寫(xiě)大量定制爬蟲(chóng)應(yīng)該比較痛苦。
Ruby:不了解辣卒,僅聽(tīng)說(shuō)ruby有個(gè)爬蟲(chóng)庫(kù)掷贾。
Node.js:遇到有個(gè)初創(chuàng)團(tuán)隊(duì)用node.js寫(xiě)的,負(fù)責(zé)人有scrapy(<0.16)荣茫,gevent經(jīng)驗(yàn)想帅。不了解。
python:gevent及其他py的爬蟲(chóng)框架啡莉。稍后會(huì)詳細(xì)描述這部分港准。

對(duì)于gevent上寫(xiě)爬蟲(chóng)的各位,我只能說(shuō)你們有實(shí)力咧欣,你們?yōu)楹我燧喿硬嫒ぃ銈兛隙ㄓ凶约旱睦碛傻模扑]參考下scrapy造輪子该押。gevent寫(xiě)爬蟲(chóng)大概的方案是gevent+requests+一個(gè)隊(duì)列庫(kù)(redis,beanstalk.etc.)疗杉。需要注意的點(diǎn)和坑有如下一些。
0,gevent使用協(xié)程蚕礼,monkey_patch后一些調(diào)試方法不可用烟具。
1,requests的編碼檢測(cè)是不符標(biāo)準(zhǔn)的奠蹬,他有兩個(gè)編碼朝聋,一個(gè)是http head里面的編碼,另一個(gè)是依據(jù)網(wǎng)頁(yè)body的編碼囤躁。標(biāo)準(zhǔn)是網(wǎng)頁(yè)內(nèi)容聲明的編碼優(yōu)先于http頭的編碼冀痕,requests沒(méi)有做這個(gè)考慮,總是使用head里面的編碼狸演。在head和body編碼聲明不一致時(shí)可能出現(xiàn)編碼錯(cuò)誤言蛇。
2,gevent的同步機(jī)制略少,某些情況下協(xié)程同步效率低宵距。這個(gè)是我在寫(xiě)http代理調(diào)度器(類(lèi)似Crawlera)的東西時(shí)遇到的腊尚。http代理調(diào)度器我下面會(huì)提及。
3,其他各種細(xì)節(jié)满哪。太多婿斥。如requests開(kāi)gzip劝篷,requests連接池等等。太多太多民宿。
gevent相對(duì)于scrapy的優(yōu)點(diǎn)有:
1,如果涉及到底層定制 娇妓,gevent比scrapy所用的twisted簡(jiǎn)單。我曾想給scrapy嵌一個(gè)http代理調(diào)度功能活鹰,發(fā)現(xiàn)略難峡蟋,需要很了解twisted。
2,如果你只需要很少的幾個(gè)簡(jiǎn)單爬蟲(chóng)华望,你可能覺(jué)得gevent用著更順手(但scrapy也很容易)。對(duì)于純下載網(wǎng)頁(yè)仅乓,用gevent實(shí)現(xiàn)比scrapy快赖舟,畢竟scrapy還有其他功能,但這有個(gè)前提夸楣,你有很高很高的帶寬宾抓,要先達(dá)到scrapy的下載頁(yè)面速率上限。

python還有其他幾個(gè)爬蟲(chóng)框架豫喧,我都大致看過(guò)源碼石洗。有個(gè)框架有個(gè)讓你人工輸驗(yàn)證碼的demo(名字忘了)。其他沒(méi)什么特別的了紧显。
scrapy經(jīng)驗(yàn)讲衫,資料
資料:官方文檔,http權(quán)威指南孵班,一些博文涉兽。
看文檔時(shí)仔細(xì)點(diǎn),很多功能都有篙程。
scrapy github賬號(hào)的各類(lèi)repo(https://github.com/scrapinghub)有很多好東西枷畏,如:
1,scrapyjs,splash:爬蟲(chóng)遇到的js問(wèn)題的解決方法(JS解析會(huì)在下面提及)
2,webstruct...etc:機(jī)器學(xué)習(xí),模糊匹配等用來(lái)解析網(wǎng)頁(yè)內(nèi)容的虱饿。
3,etc...
scrapy有個(gè)SEP類(lèi)似PEP的拥诡,可以一看,也在github的倉(cāng)庫(kù)氮发。
留意scrapy的博客http://blog.scrapinghub.com/
wiki:https://github.com/scrapy/scrapy/wiki
scrapy公司(http://scrapinghub.com/)的產(chǎn)品:
1,定制爬蟲(chóng)(讓scrapy公司幫你寫(xiě)爬蟲(chóng)然后交付你)
2,scrapy cloud(提供跑爬蟲(chóng)的服務(wù)器(scrapyd))
3,autoscraping(點(diǎn)擊需要內(nèi)容即可實(shí)現(xiàn)爬取)
4,crawlera,解決爬網(wǎng)站的ip限制問(wèn)題(我有一個(gè)類(lèi)似功能的本地版http代理調(diào)度器及大量代理)渴肉。

一些常見(jiàn)問(wèn)題,經(jīng)驗(yàn):
0,了解scrapy已經(jīng)做過(guò)的功能爽冕,優(yōu)化等宾娜。。扇售。防止重復(fù)造輪子前塔,如嚣艇,去重,編碼檢測(cè)华弓,dns緩存食零,http長(zhǎng)連接,gzip等等。
1,JS相關(guān)寂屏。
這個(gè)是被問(wèn)的最多的贰谣。看具體情況解決迁霎≈ǜВ可模擬相關(guān)js執(zhí)行、繞過(guò)考廉,或直接調(diào)瀏覽器去訪問(wèn)秘豹。自己用一個(gè)JS引擎+模擬一個(gè)瀏覽器環(huán)境難度太大了(參見(jiàn)V8的DEMO)。
調(diào)瀏覽器有很多方法昌粤。難以細(xì)說(shuō)既绕,關(guān)鍵字如下,selenium涮坐,phantomjs凄贩,casperjs,ghost袱讹,webkit疲扎,scrapyjs,splash捷雕。一些細(xì)節(jié)如關(guān)掉CSS渲染评肆,圖片加載等。只有scrapyjs是完全異步的非区,相對(duì)是速度最快的瓜挽,scrapyjs將webkit的事件循環(huán)和twisted的事件循環(huán)合在一起了。其他的方案要么阻塞征绸,要么用多進(jìn)程久橙。簡(jiǎn)單的js需求(對(duì)效率要求不高)隨意選,最優(yōu)方案是scrapyjs+定制webkit(去掉不需要的功能)管怠。調(diào)瀏覽器開(kāi)頁(yè)面是比較耗資源的(主要是cpu)
2,內(nèi)容解析淆衷。
XPATH就可以了,感興趣可以看下pyquery渤弛,css選擇器祝拯。
如果想獲得網(wǎng)頁(yè)對(duì)應(yīng)的txt,可以調(diào)瀏覽器,有個(gè)類(lèi)似plain_txt的接口可以獲取網(wǎng)頁(yè)保存成txt佳头。
模糊匹配參考scrapy github里面幾個(gè)庫(kù)鹰贵,機(jī)器學(xué)習(xí)不一定好用(效果問(wèn)題,人工問(wèn)題-需要訓(xùn)練)康嘉。還有寫(xiě)些正則去模糊匹配碉输。
新聞?lì)愃频恼奶崛∮衦eadability,boilerplate。
3,分布式亭珍。
首先考慮按任務(wù)(目標(biāo))切分敷钾,然后讓不同目標(biāo)的爬蟲(chóng)在不同機(jī)器上跑
完全的對(duì)等分布式(多爬蟲(chóng)爬一個(gè)目標(biāo)),把任務(wù)隊(duì)列替換掉爬蟲(chóng)改改即可肄梨。github里面有幾個(gè)現(xiàn)有的實(shí)現(xiàn)參考阻荒。
分布式需求可能是偽命題。想清楚為何要分布式众羡。硬件夠不夠侨赡,像什么拿一個(gè)不支持持久化的url隊(duì)列的爬蟲(chóng)說(shuō)量大需要分布式的,我只能默念纱控,你為何這么吊。
4,部署菜秦,調(diào)度
部署推薦scrapyd甜害。這也是官方推薦的方法。
大量爬蟲(chóng)的調(diào)度球昨,這個(gè)目前(13-10)沒(méi)有現(xiàn)成的合適方法尔店,期望是實(shí)現(xiàn)爬蟲(chóng)的某些配置放數(shù)據(jù)庫(kù),提供web后臺(tái) 主慰,然后按配置周期嚣州、定時(shí)運(yùn)行爬蟲(chóng),終止共螺,暫停爬蟲(chóng)等等该肴。可以實(shí)現(xiàn)藐不,但要自己寫(xiě)不少東西匀哄。
5,ip限制問(wèn)題
買(mǎi)的起大量ip的可買(mǎi)(買(mǎi)大量同網(wǎng)段爬可能導(dǎo)致整網(wǎng)段被封)。
找大量免費(fèi)的開(kāi)放http代理雏蛮,篩選可用的涎嚼,免費(fèi)開(kāi)放代理不可靠,寫(xiě)個(gè)調(diào)度機(jī)制挑秉,自動(dòng)根據(jù)成功次數(shù)法梯,延遲等選擇合適代理,這個(gè)功能難以在scrapy內(nèi)實(shí)現(xiàn)犀概,參考scrapinghub的crawlera立哑,我完成了一個(gè)本地版夜惭。
6,url去重。
如果有千萬(wàn)級(jí)的URL需要去重刁憋,需要仔細(xì)看下scrapy的去重機(jī)制和bloom filter(布隆過(guò)濾器)滥嘴。bloomfilter有個(gè)公式可以算需要多少內(nèi)存。另bloomfilter + scrapy在github有現(xiàn)有實(shí)現(xiàn)可以參考至耻。
7,存儲(chǔ)若皱。
mongodb,mongodb不滿足某些功能時(shí)考慮hbase,參考http://blog.scrapinghub.com/2013/05/13/mongo-bad-for-scraped-data/
8,硬件扛不住別玩爬蟲(chóng)尘颓。走触。。曾在I3 4G 1T上跑爬蟲(chóng)疤苹』ス悖卡在磁盤(pán)io(量大,磁盤(pán)io差卧土,內(nèi)存低)惫皱,出現(xiàn)內(nèi)存占用飆升。很難調(diào)試(調(diào)試爬蟲(chóng)看實(shí)際跑耗時(shí)較長(zhǎng))尤莺,初步以為是爬蟲(chóng)有問(wèn)題內(nèi)存占用高導(dǎo)致數(shù)據(jù)庫(kù)卡旅敷。調(diào)試結(jié)果確認(rèn)為,配置低量太大颤霎,導(dǎo)致數(shù)據(jù)庫(kù)慢媳谁,數(shù)據(jù)庫(kù)慢之后爬蟲(chóng)任務(wù)隊(duì)列占滿內(nèi)存并開(kāi)始寫(xiě)磁盤(pán),又循環(huán)導(dǎo)致數(shù)據(jù)庫(kù)慢友酱。
9晴音,爬蟲(chóng)監(jiān)控
scrapyd自帶簡(jiǎn)單的監(jiān)控,不夠的話用scrapy的webservice自己寫(xiě)缔杉,暫無(wú)(13.10)現(xiàn)成的
9,=锤躁。=想到再補(bǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末或详,一起剝皮案震驚了整個(gè)濱河市进苍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸭叙,老刑警劉巖觉啊,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沈贝,居然都是意外死亡杠人,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗡善,“玉大人辑莫,你說(shuō)我怎么就攤上這事≌忠” “怎么了各吨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)袁铐。 經(jīng)常有香客問(wèn)我揭蜒,道長(zhǎng),這世上最難降的妖魔是什么剔桨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任屉更,我火速辦了婚禮,結(jié)果婚禮上洒缀,老公的妹妹穿的比我還像新娘瑰谜。我一直安慰自己,他們只是感情好树绩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布萨脑。 她就那樣靜靜地躺著,像睡著了一般饺饭。 火紅的嫁衣襯著肌膚如雪渤早。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天砰奕,我揣著相機(jī)與錄音蛛芥,去河邊找鬼提鸟。 笑死军援,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的称勋。 我是一名探鬼主播胸哥,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赡鲜!你這毒婦竟也來(lái)了空厌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤银酬,失蹤者是張志新(化名)和其女友劉穎嘲更,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體揩瞪,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赋朦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宠哄。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壹将,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毛嫉,到底是詐尸還是另有隱情诽俯,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布承粤,位于F島的核電站暴区,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏密任。R本人自食惡果不足惜颜启,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浪讳。 院中可真熱鬧缰盏,春花似錦、人聲如沸淹遵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)透揣。三九已至济炎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辐真,已是汗流浹背须尚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侍咱,地道東北人耐床。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像楔脯,于是被迫代替她去往敵國(guó)和親撩轰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容