python爬虫网络出错怎么办_Python爬虫常见问题
第一個(gè)問題:JS加密如何突破
(1) 熟練掌握Chrome的開發(fā)者工具的各個(gè)功能,Elements, Network,Source
(2) 認(rèn)真觀察,善于思考。Network查看加載流程,找可疑的xhr請求,設(shè)置xhr斷點(diǎn),通過Call Stack 回溯js執(zhí)行過程,邊回溯邊查看上下文代碼。能讀懂js,知道js的相關(guān)知識,比如js里面的window變量。
(3) 以上是通過debug js找到j(luò)s加密解密的代碼,然后通過Python重新實(shí)現(xiàn),這個(gè)過程很長,可能耗費(fèi)你幾天的時(shí)間,一旦網(wǎng)站改變一下js算法你的Python實(shí)現(xiàn)就不能用了。
(4) 用Selenium可簡單突破,并且網(wǎng)站隨便該都無所謂。唯一遺憾的是,Selenium的運(yùn)行效率較差。但是,作為一個(gè)能用js加密來保護(hù)數(shù)據(jù)的網(wǎng)站,單價(jià)的運(yùn)行效率應(yīng)該足以滿足網(wǎng)站的訪問頻率限制。這時(shí)候,更多的思考是如何增加資源(IP、賬號)來提高抓取效率。
第二個(gè)問題、多線程、協(xié)程,多進(jìn)程的選擇
(1)爬蟲是IO密集型任務(wù),大部分時(shí)間花在網(wǎng)絡(luò)訪問上,所以多進(jìn)程不適合網(wǎng)絡(luò)爬蟲,而多線程、異步IO協(xié)程更適合,而異步IO是最適合的,它相比多線程,協(xié)程間的切換代價(jià)更小,我們提倡使用異步IO而非多線程。異步IO的模塊主要是:aysncio, aiohttp, aiomysql 等。
(2)網(wǎng)頁爬下來后從中提取想要的數(shù)據(jù)是CPU密集型的,這時(shí)候可以用多進(jìn)程并發(fā)提取。
(3)我們推薦的爬蟲策略是,爬蟲只管爬,把爬下來的html保存起來,存到數(shù)據(jù)庫。然后單獨(dú)寫提取數(shù)據(jù)的提取器,單獨(dú)運(yùn)行提取器。好處是,提取不影響爬取,爬的效率更高,并且提取程序可以隨時(shí)修改,有新的提取需求時(shí)不需要重新抓取。比如,最初寫爬蟲時(shí)只想提取網(wǎng)頁中的兩項(xiàng)數(shù)據(jù),運(yùn)行一段時(shí)間后,發(fā)現(xiàn)另外3項(xiàng)數(shù)據(jù)也很有用,如果保存了html,只需改改提取器重新跑一遍就好了。
第三個(gè)問題、如果想要保留加粗或者圖片原始位置,只能通過挖掘規(guī)律再寫正則表達(dá)式來針對性處理嗎?
網(wǎng)頁數(shù)據(jù)提取主要兩種方法:正則表達(dá)式,xpath。通過xpath可以獲得某個(gè)html標(biāo)簽節(jié)點(diǎn)。比如,一篇blog網(wǎng)頁,它的主體內(nèi)容都在某個(gè)標(biāo)簽里面,可能是某個(gè)div。用xpath得到這個(gè)div,轉(zhuǎn)換為html,就是包含了格式及其圖片的部分,你保存這段html代碼而非純文本就好了。
第四個(gè)問題、爬蟲的增量爬取、斷點(diǎn)續(xù)爬、去重等
(1)通過網(wǎng)址池的概念去管理所有的URL
(2)增量爬取就是不重復(fù)下載已經(jīng)下載過的,讓網(wǎng)址池記住那些已經(jīng)下載過的URL;
(3)斷點(diǎn)續(xù)爬,就是上次還沒有爬取的URL這次接著爬,還是讓網(wǎng)址池記住那些還沒被爬取的URL
(4)爬蟲的去重,讓網(wǎng)址池記錄URL的狀態(tài)以避免重復(fù)爬取。
第五個(gè)問題、爬蟲的部署問題,在公司是不是分布式爬蟲系統(tǒng)比較多會涉及部署問題
爬蟲的部署,不一定是分布式的。大規(guī)模的爬蟲,突破了目標(biāo)網(wǎng)站限制的爬蟲才會涉及到分布式,分布式的好處是抓取速度提高,但是管理會比較復(fù)雜。
第六個(gè)問題、網(wǎng)頁的自動解析?這個(gè)話題就包含很多子任務(wù)了: 怎么自動抽取文章的內(nèi)容,如何處理各種各樣的時(shí)間格式,怎樣處理翻頁
(1)文章內(nèi)容的提取,基本的是每種網(wǎng)頁建立一個(gè)提取模板(正則表達(dá)式),好處是提取精準(zhǔn),壞處是工作量大,一旦稍微改版就失敗。通過算法建立單一提取程序,基本上都可以提取,但是可能會有寫雜質(zhì),比如文末的相關(guān)閱讀。好處是,一勞永逸,不受改版限制。
(2)時(shí)間的提取,除了正則表達(dá)式之外似乎沒有特別有效的方法。
(3)翻頁的話,如果只是抓取,把該頁的url提取出來繼續(xù)抓;如何在提取內(nèi)容時(shí)要把多頁內(nèi)容合并成一個(gè)網(wǎng)頁,那就要特別處理。
第七個(gè)問題、爬新聞類的網(wǎng)站時(shí),如何做好同一新聞,各網(wǎng)站相互轉(zhuǎn)載,爬取時(shí)文本去重
比較著名的算法是,Google的simhash,但具體實(shí)踐中比較復(fù)雜。網(wǎng)傳百度的做法是把文章的最長一句話(或多句)做hash,這個(gè)hash值就是文章的唯一性代表(指紋),這個(gè)方法準(zhǔn)確率很高,但是召回率比較低,一旦這最長的幾句話改一個(gè)字就不能召回;我改進(jìn)了該方法,對n句最長的話分別做hash,一個(gè)文章由n個(gè)指紋(如圖人的是個(gè)指頭指紋都不一樣)確定唯一性。準(zhǔn)確率和召回率都還不錯。
第八個(gè)問題、異步爬蟲的設(shè)計(jì)
(1)一個(gè)好的URL管理策略,見猿人學(xué)上的網(wǎng)址池相關(guān)文章;
網(wǎng)址池是一個(gè)“生產(chǎn)者-消費(fèi)者”模型,爬蟲從中取出url去下載,下載的html中提取新的url放入池中,告訴url池剛才拿出的url是否下載成功;再從池中取出url進(jìn)行下載。。。url池是核心部件,它記錄url的不同狀態(tài):
(a)下載成功
(b)下載失敗n次
(c)正在下載
每次往池子添加url時(shí)都要檢查url在池中的狀態(tài),避免重復(fù)下載。
(2)一個(gè)好的異步協(xié)程管理策略,見猿人學(xué)網(wǎng)站上的大規(guī)模異步新聞爬蟲的文章。
每次從urlpool中提取n個(gè)url,生成n個(gè)異步下載的協(xié)程,通過一個(gè)變量記錄協(xié)程的個(gè)數(shù)(也就是正在下載網(wǎng)頁的個(gè)數(shù))。
大規(guī)模異步新聞爬蟲:實(shí)現(xiàn)功能強(qiáng)大、簡潔易用的網(wǎng)址池(URL Pool)
大規(guī)模異步新聞爬蟲: 用asyncio實(shí)現(xiàn)異步爬蟲
異步URL管理 異步實(shí)現(xiàn) 見這個(gè)兩個(gè)URL
有用的話記得點(diǎn)個(gè)贊同哈嘿嘿!
總結(jié)
以上是生活随笔為你收集整理的python爬虫网络出错怎么办_Python爬虫常见问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android sdk 安装_Appiu
- 下一篇: python手机自动化测试脚本语言_Py