python基礎例項 韋瑋 pdf_韋瑋:Python網路爬蟲實戰解析

weixin_39610956發表於2020-11-24

2016年12月27日晚8點半,CSDN特邀IT專家、《Python系列實戰教程》系列圖書作者韋瑋帶來了主題為“Python網路爬蟲反爬破解策略實戰”的Chat交流。以下是主持人小冰對交流精彩片段的記錄。

問:能不能把使用代理池和ua代理池爬取一個網站案例完善程式碼給一下,有時候知道怎麼寫,但不知道放在哪個位置。

答:有的,豆瓣爬蟲(loginpjt.zip的百度雲連結)程式碼就是完整的,這裡面應該包括了代理ip池跟使用者代理池+驗證碼處理。

問: Xpath表示式在什麼情況使用,例如我用urllib和Re爬取完第一級介面,然後想用Xpath做,他就實現不了。

答:做網路爬蟲的時候,首先應該選用的就是Xpath表示式,因為其效率比較高。凡是XML程式碼基本上都可以使用Xpath表示式進行提取,若是其他資訊需要提取,但是使用Xpath不能滿足需求的時候,那麼我們會考慮,正規表示式(即Re模組)去做。你用urllib和Re爬取完第一級介面,然後想用Xpath做,是可以實現的,只不過您的方式不對而已。如果使用urllib進行爬取的內容,請使用etree處理一下內容,即可使用Xpath進行資訊提取,若使用Scrapy框架進行爬取的內容,可以直接使用Xpath表示式,不需要轉換。

問:我用crawl爬蟲時,不能夠到一個指定的介面下爬取,例如貼吧裡面搜尋一個關鍵詞,然後從這頁面用自動爬蟲,就不行。

答:可以的,同樣還是方式不對的問題。可以這樣做,首先觀察貼吧的網址構造,一般都是使用get的請求方式進行。然後你構造出對應的網址,使用scrapy爬蟲進行爬取,爬了這一個頁面之後,請在這一個頁面的最後,使用scrapy.http下的Request()再發起一個請求,設定一個回撥函式,通過callback指定,然後在新回撥函式中處理下一級頁面。

問:正規表示式可以詳細的講講嗎?有時候不知道寫成什麼樣的表示式去爬內容。

答:正規表示式的知識點比較多,總的來說可以分為原子、正規表示式函式、模式修正符幾塊的內容。您可以參考我年後即將上線的一本書《Python網路爬蟲實戰》第五章的內容,也可以在網上尋找一些資料,也可以聽我的一些視訊課程解決。

問:代理池是一個靠譜的思路嗎?我試過就像只有1%左右有效的代理,並且速度都很慢?如果抓取量大一點,使用代理根本無法完成任務。是否有其他的方法應對IP限制?

答:代理池是一個靠譜的思路。之所以試了之後有效率在1%的左右,是因為你的代理IP沒有經過篩選。經過實際中的試驗,國內的代理IP大部分失效,請使用國外的代理IP,即將請求的通過get欄位限制IP資源的提取即可。除此之外,穩定的IP資源還可以從這些方面獲取:1、從不同idc商購買雲伺服器,自然有IP。2、通過手機網路實現IP,比如如果是公司,那麼你批量購買手機卡,不同的手機卡有不同的IP。3、從高校拿IP,高校IP資源多。4、Adsl撥號,不建議,因為比較不穩定也比較麻煩。用國外代理IP,別用國內的。另外,實時請求,不要固定這些IP。import urllib.request

IPPOOLS=urllib.request.urlopen("http://tpv.daxiangdaili.com/ip/?tid=559126871522487&num=1&foreign=only").read().decode("utf-8","ignore")

通過這個進行實時請求。然後foreign代表國外IP。另外,頻率要注意,一臺伺服器不要短時間內進行大量請求。(頻率看網站而定的,一般是首先儘量用爬蟲去爬他,多次觀察閾值。)還有就是,ua池必須建立起來,不然很容易出問題。

問:現在有些驗證碼變成一個按鈕,從左拖動到右邊的方式,這種有應對方法嗎?

答:有方法的,這種情況,必須用phantomjs,用phantomjs實現把滑動條拖動,然後進行登入。登入以後,把cookie傳給scrapy,交由scrapy繼續處理。因為phantomjs效率比較低,所以不建議全程使用。

問:新手剛開始玩爬蟲,發現入門或者說上手很簡單,但找不到有興趣的練手及提升的專案。不知道老師是否可以介紹一些,相對容易且有趣的練手提升的專案。

答:對的,是這樣。我建議你爬同程網的機票,蠻有挑戰性的,我有個學員也做了一下這個實驗,也可以把他的程式碼分享給大家看看,tongcheng.py的百度雲連結。

問: 1)我的ip代理經常被封,有可靠的途經獲得這些高質量ip代理嗎。2)如何對爬蟲進行監控,爬的站點太多了難免有掉隊的,如何在一個範圍內快速報警,通知到服務已經不行了,求監控經驗。3)如果使用前端內嵌別人網站,求跨域經驗。

答:1)有的,IP問題在問題5解答了。2)首先,一定要進行異常處理,異常處理可以保證你的爬蟲出問題的時候,自動跳過該次,進行下一次。其次,監控爬蟲目前沒有開源的工具,但是,你可以用py程式碼,不久發一個請求,看看某些爬蟲正常嗎,不正常,關掉,或者自動傳送訊息到管理。3)將自己的程式碼內嵌到其他網站嗎?這個達不到吧? 沒有許可權。

問: 如果想搞多執行緒甚至分散式爬蟲,該怎麼處理呢?有的時候需要爬多個網站資料,資料量涉及到TB量級,方案改如何設計呢? 資料上來了,普通的IP執行緒池,太少了的話,肯定不行了,IP的執行緒池,該如何設計好呢?

答:資料上來以後,主要是這幾個問題,1. 網路資料的下載太慢;2. 資料的篩選太慢;3. 資料的儲存太慢。此時,必須分散式,分散式請用scrapy+docker+redis的方案就能解決。Docker解決分散式處理問題,redis解決資料儲存問題。另外,IP方面用剛才的IP代理就行。還有,執行緒安排方面,把握平衡原則就好,就是,網路資料下載、資料篩選、資料寫入這三個模組的時間消耗盡量一致,若某一個模組時間消耗久,加多執行緒,反之亦然。

問:python爬蟲比java爬蟲 有什麼優勢呢?python爬蟲框架用scrapy了,python的scrapy比起自己用xpath,正則等有什麼優勢呢?python 智慧學習有哪些優勢呢?python寫webapi效能如何?python Django和Flask框架對比如何?該選擇哪個?

答:1. python比較簡明,java比較嚴謹。綜合來說,python網路處理方面是比較強悍的。2. Scrapy是個框架,裡面正則跟xpath都能用,xpath主要比較快,但是能力沒有re強悍,xpath只能處理XML,re啥都能處理。3. python 寫webapi 效能很好,比如selenium。但是怎麼說呢,終究還是不如scrapy、urllib等爬蟲效率高。4. Django通用,Flask比較輕。如果是我,通用網站我肯定用Django,小網站我可能會用Flask,綜合建議Django。資料量小的話,可以直接使用資料庫的資料約束進行。

問:隨著爬蟲抓取資料越來越多,去重url很重要,但是由於眾多爬蟲,速度需要跟的上,請問下這樣的情況下可以採用什麼方式來做這件事?

答:資料量大的話,可以使用布隆過濾器進行。資料約束一般unique跟primary key。但是很遺憾,目前Python3暫時沒有布隆過濾器這個模組。此處參考bloom.py 和 BitVector.py 的百度雲連結。布隆過濾器效能還是很高的。沒辦法降低,因為他就是靠犧牲準確率,來提高時間和空間的效率。而且它的報錯率很低,放心。而且,不回漏報,只會誤報。

問:老師有嘗試做過對app反編譯抓資料嗎?抓App資料除了appium外老師有其他的一些推薦沒?

答:app的資料抓取方案如下:1. 抓包分析,就分析那些對應的網址,看看能不能直接構造出來。2. 通過安卓模擬器解決這個問題,但是效率太低。3. 通過Appium等工具,但效率吧,還是不高。所以1一定是首推。

問:老師現在公司是以抓取資料為主業嗎?就是想了解以抓取為基礎的商業業務有哪些?

答:工作目前主要以資料分析為主。以抓取為基礎的商業業務有:1. 資料分析行業;2. 電子商務行業;3. 其他需要競爭對手的資料的行業,比如去哪兒等第三方訂票平臺。

(以上內容轉自GitChat,版權歸GitChat所有,轉載請聯絡GitChat,微訊號:GitChat,原文: 《韋瑋:Python網路爬蟲實戰解析》)

本文轉載自非同步社群。

原文連結:https://www.epubit.com/articleDetails?id=NC7E3EF935A70000186104300151F1595

相關文章