-
1 # java戰鬥機
-
2 # Bean蠶豆
我的看法是首先需要有Python的基礎,在有基礎的前提下,利用框架是最快,可以短時間實現爬蟲。在這裡我推薦scrapy,scrapy是基於python開發的開源網路爬蟲框架,scrapy簡單易用、靈活、易擴充套件、跨平臺等特性,使得scrapy受廣大用友的歡迎。
使用scrapy也很簡單,只需要重點編寫spider這一個檔案就可以裡,其實是我們網頁資料處理的部分,以詩詞網-爬取詩詞為例。我們可以在spider裡這樣寫:
上面的程式碼整體上就兩部分內容,一部分是提取網頁中的URL,另一部分是提取詩詞詳情頁面我們需要爬取的內容,在這裡我選擇爬取的資料是詩詞的作者、內容、網站打的標籤等一些內容。
是不是很方便,如果你不用儲存資料,到這裡其實差不多夠了,定義一下Item欄位就可以實現資料的爬取,如果需要儲存到資料庫,這個時候需要在Pipeline裡定義一個類,用於儲存資料
如上圖所示,定義的mongodb的類,這樣我們就可以實現資料儲存到Mongodb中。
-
3 # 騰訊技術工程
此處的爬蟲並不是百度或者google這樣需要沿著某條路徑採集網際網路上所有資訊的機器人,而是針對某個特定的網頁,從中提取出我們需要的資訊。比如我們在中關村上查到了一臺手機的詳情頁,想把其中的cpu資訊、作業系統、解析度等等欄位提出出來。即此處的爬蟲是指標對特定網頁結構、規模很小、抓取路徑收斂的情況而言。下文我們以一個例項,看看如何從頭寫一個python爬蟲。
抓取頁面基本方法瀏覽器中看到的頁面,實際上是透過一系列的http請求載入並渲染伺服器的資源。同理只要我們能夠用python發出http請求,透過get或post的方法獲得伺服器返回的html片段、html頁面或json資料串,就可以從中抓取到想要的內容。
python中對http請求的封裝是在urllib和urllib2兩個庫裡。
urllib提供了一些工具方法,用於對傳送請求時的字串進行轉義或編碼。
傳送get/post請求則需要用到urllib2中提供的幾個類
在掌握瞭如何在python中構造http請求後,下一步需要做的就是結合具體的網頁,分析出web頁面的請求方式、引數傳遞方式和必要的header資訊(如cookie等)。chrome控制檯的network分析基本上可以滿足需求,但一款抓包利器無疑可以提升我們的效率。推薦使用fiddler進行抓包和解包,可以更清晰第看到http中所用的不同請求方式。
字串查詢、正則表示式、html解析http請求的response通常包含兩種:json字串,或html程式碼片段,資訊的提取就轉變成了字串處理。此時無論是透過字串查詢、正則表示式匹配,只要能定位到目標欄位即可。
但更好的方法是對html的Dom樹進行解析,尤其是存在多個目標欄位需要抓取時,解析html的方式能夠對特殊格式的欄位資訊進行批次解析。
這裡使用python自帶的htmlparser進行解析,htmlparser對html片段進行深度優先的遍歷,在遍歷的過程中可以識別出開始標籤、結束標籤和標籤中的內容,因此提供了一種基於標籤tag的程式設計方式。看下面的例子
需要提取手機的作業系統、核心數、cpu型號等資訊,根據html的標籤、屬性名稱,程式碼如下:
針對中關村上的某個手機詳細
handle_data可以提取html標籤中的資料,但handle_data存在兩個問題。
(1)當標籤內容為空時,handle_data自動跳過該標籤。這裡的標籤為空是指標籤中不包含任意字串內容、不包含其他的子標籤。注意,當標籤中含有&nb等空白字串時,handle_data可以解析出其中的data。比如以下結構中,電話號碼一列允許為空,透過html_parser解析後只得到4個<td>的標籤內容。
由於會跳過內容為空的標籤的解析,就會打亂html的結構,由於資料的缺失返回的list長度不定,導致無法將list中每項內容與html中的內容對應起來。
(2)標籤中包含子標籤時,內容會被分割到不同的handle_data函式中,比如
由於handle_data是針對每個標籤返回資料,以上的td裡包含了一個span子標籤,handle_data分為2次返回資料。即第一次呼叫handle_data返回狀態:,第二次呼叫handle_data返回已拒絕。我們希望<td>標籤中的內容作為整體返回,而現在被分割成了兩塊,同樣會破壞結構。
解決以上兩個問題的關鍵方法在於,使用cache快取字串,把對資料的處理從handle_data推遲到handle_endtag。只有遇到end_tag時,才能確定標籤閉合,使資料完整。
爬蟲被遮蔽後怎麼辦伺服器會透過一些策略遮蔽惡意爬蟲,以避免對伺服器資源的消耗,如檢查同一IP的訪問頻率、訪問間隔等。
所以我們也應該使用一些簡單策略,使我們的爬蟲看起來更像是人的行為,以繞開伺服器的檢測機制。常用的方法包括延長相鄰請求的間隔,相鄰間隔使用隨機時長。
在請求的header欄位中包含了user-agent欄位,伺服器透過檢測user-agent欄位確定客戶端的型別。如果不指定user-agent欄位,請求時指令碼會預設填充該欄位,如下圖
# python中預設的user-agent欄位
網上有一些說法user-agent的值會影響爬蟲是否能夠抓取web內容,為了避免爬蟲被遮蔽,將user-agent的值設為瀏覽器的型別:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
但在實際抓取的幾個web站點中,user-agent的值對爬蟲被遮蔽沒有影響,在使用時不用刻意設定user-agent的值。
以上的方法都是避免爬蟲被遮蔽掉。但萬一很不幸爬蟲已經被遮蔽了,發出請求返回的結果是輸入驗證碼的頁面,此時該如何解決呢?
對於支援https協議的站點,此時可以嘗試的一種方案是:改用https協議。
專案中遇到爬蟲被百度遮蔽的現象,嘗試了很多方法都無效。後來將原來連結中的http協議換成https爬蟲又開始工作了。原理雖然不清楚,但簡單可行。
帶驗證碼的登入很多web內容只有在登入後才有許可權訪問,伺服器透過建立session並下發sessionid來維持與客戶端的連結狀態。客戶端在每次傳送請求時,都在cookie中攜帶sessionid等欄位資訊。sessionid是無法複用的,也即在瀏覽器中登入後所獲得的sessionid直接拿到python指令碼中使用,返回的結果仍然是跳轉到登入頁面的。因為透過http下發的sessionid是捆綁到埠號的,也就是與伺服器維持通訊的是客戶端上的某個程序,把瀏覽器中的sessionid拿到python指令碼中,由於更換了程序sessionid當然失效了。
既然無法繞開登入,我們就在python指令碼中完成登入的過程,拿到登入後返回的cookie、sessinoid等。這裡有兩個難點需要解決,1)伺服器登入邏輯的分析與猜測;2)解決登入時存在的驗證碼識別問題。
登入除了需要post提交使用者名稱、密碼和sessionid之外,通常也會隱式提交部分引數,可以用chrome瀏覽器的除錯模式檢視post提交的引數及對應的值,登入成功之後,我們就可以拿到返回的cookie值了。
登入時的驗證碼可以透過OCR自動識別,嘗試了google的tesseract-ocr準確率並不高。所以推薦手動輸入驗證碼,幫助爬蟲完成登入,畢竟授權只需要一次輸入。
手動輸入驗證碼的思路如下,在請求sessionid的同時儲存驗證碼的圖片,人工讀取驗證碼的內容,與username和password一起提交。示例程式碼如下:
需要抓取javascript載入的結果詳細參考外部連結:https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/
這篇文章中的思路是,透過使用web kit library建立本地的javascript執行環境,模擬瀏覽器對頁面的載入渲染,從而抓取javascript處理後的頁面內容。
這個例子中javascript所載入的結果,也是透過ajax重新向伺服器發起請求返回的,直接傳送ajax請求並抓取結果即可。在本地搭建javascript的執行環境有些畫蛇添足,但也是一種可以參考的思路。
本文總結了使用python自帶庫完成爬蟲的方法,並且列出了爬蟲在實際中可能遇到的幾個問題,比如爬蟲被遮蔽、需要輸入驗證碼進行登入等。實踐中的難點在於分析和猜測伺服器的登入邏輯,並且提取必需的引數完成登入鑑權。
-
4 # 千鋒頭號粉絲
杭州零基礎入門學習python難不難?()
隨著人工智慧的火熱,python的熱度也在不斷升高,越來越多的人想要學習python,他們中的很多人並沒有基礎,python學習難嗎成為他們擔憂的問題。下面,就給大家解讀一下這個問題。
零基礎學習python難不難?簡單的來說,Python語言最大的特點就是簡單明瞭,同時上手容易、功能強大,是不少人都比較喜歡的語言,對於初學者零基礎人員來說,Python也是非常合適的選擇。
零基礎如何學習好python呢?給大家幾點建議:
1.找淺顯易懂,例程比較好的教程,從頭到尾看下去。不要看很多本,專注於一本。把裡面的例程都手打一遍,搞懂為什麼。
2.去找實際專案練手。最好是要有真實的專案做。可以找幾個同學一起做個網站之類。注意,真實專案不一定非要是商業專案。
3.找到一個已經會python的人。問他一點學習規劃的建議,然後在遇到卡殼的地方找他指點。這樣會事半功倍。
4.另外,除了學習程式語言,也兼顧補一點計算機基礎,和英語。
5.不但要學寫程式碼,還要學會看程式碼,更要會除錯程式碼。讀懂你自己程式的報錯資訊。再去找些github上的程式,讀懂別人的程式碼。
6.學會查文件,用好搜尋引擎和開發者社群。
回覆列表
欲速則不達,沒有一定的Python程式設計基礎是學不好後邊的,想走的遠還是得一步一個腳印,
給你看看這幾個爬蟲教程,你看看能不能學會吧,如果學不會可以參考下邊的小白學Python教程,在進行爬蟲實訓
教程一、海量資訊的網路如何看的更多看的更快,那就像我一樣開掛吧!Fidder是一個http協議除錯代理工具,可以輕鬆記錄、截獲PC、移動端(Android、Iphone、WindowPhone等)與網際網路之間的Http通訊。實現手段:抓取鬥魚App資料包,分析協議、模擬手機App發出的Http請求。
【知識點】
1、如何使用Fidder對Android、IOS等應用進行抓包
2、Http網路資料抓包與分析
3、Python爬蟲框架Scrapy
4、非同步請求、Ajax資料請求
5、多執行緒圖片下載
教程二、網路爬蟲又被稱為做網路蜘蛛、網路機器人,主要用於網路資源的收集工作。在進行網路輿情分析時,首要獲取輿情資訊內容,這就需要用到網路爬蟲(蜘蛛程式)這個工具,它是一個能自動提取網頁內容的程式,透過搜尋引擎從網際網路上爬取網頁地址並抓取相應的網頁內容,是搜尋引擎(Search Engine)的重要組成部分。
利用python語言的urllib2來實現網路爬蟲的基本原理和實現。並透過爬蟲框架Scrapy來初步實現一個爬蟲例項,展示搜尋引擎是如何搜尋到所有的網頁原理。清晰講解一個爬蟲的誕生全過程,讓你也擁有自己的網路蜘蛛俠。
【課程知識點】
1、爬取網頁的含義
2、URL的構成介紹
3、利用urllib2和URL地址爬取網頁
4、百度貼吧小爬蟲展示及原始碼分析
5、爬取所有的內涵段子案例