零基礎如何學爬蟲技術?
在互聯網企業做市場分析,常常需要或許大量的數據。但是在VBA、寫代碼等方面等同於零基礎。想要從頭開始自學爬蟲技術可能嗎?應該是什麼樣的步驟?有哪些資源現在可以用?
一分鐘學會網路數據抓取:
從爬蟲入門到放棄,鬼知道你都在這期間經歷了什麼?
老司機都忙著反爬蟲,沒空來跟你閑扯,等你學會新的爬蟲程序了,不好意思,老司機們又給你添堵來了,給你添堵就是他們的工作,所以,還是別學了,趁早放棄
好吧,還沒走
那就教你兩招對付皮皮蝦的攻略,不需要任何編程基礎,是人就懂
還沒走?
好吧,你也就就這麼點出息了,跟皮皮蝦過招很光榮么?
還沒走?
好吧,沒救了,那咱們開始吧:
你可以使用任何熟悉的編程語言來進行網路數據信息的抓取,但是當你所需要獲取的數據有限時,這樣做就顯得沒有什麼必要了,此時,一分鐘技巧剛剛好:只需利用google sheet就可以實現了:
1,新建一個空白文檔:
2,前提是時用chrome,打開我們的案例目標網頁:Games sales,單擊右鍵選擇inspect,之後使用組合鍵Command-Shift-C ,用來激活selector,如此一來,你的游標移到哪個元素上,對應的信息就會在Inspection panel內顯示:
組合鍵:Command-Shift-C
3,將網址複製粘貼到文檔中:
假設我們需要抓取的信息是:價格
那麼接下來只需要使用一個公式就可以實現數據抓取了:
首先將網頁中所需信息的那段代碼copy下來:
在文檔中,實現抓取的函數是:=IMPORTXML(「URL」,」Xpath expression」)
其中,Xpath
expression就是你粘貼過來的那部分代碼,需要注意的是,代碼中「」號需要變成『』號:
如此一來,簡單的數據抓取便實現了:
實際上excel也有類似的功能,就等你去探索嘍。
還有另外一個常見的函數:=IMPORTHTML(「URL」,」QUERY」, Index)
這個函數可以實現整個表格的抓取:
-------------------------------
歡迎關注原作者 Allie - 知乎
以及 @矽谷密探,矽谷情報一手掌握~
第一:Python爬蟲學習系列教程(來源於某博主:http://cuiqingcai.com/1052.html)
Python版本:2.7
整體目錄:
一、爬蟲入門
1. Python爬蟲入門一之綜述
2. Python爬蟲入門二之爬蟲基礎了解
3. Python爬蟲入門三之Urllib庫的基本使用
4. Python爬蟲入門四之Urllib庫的高級用法
5. Python爬蟲入門五之URLError異常處理
6. Python爬蟲入門六之Cookie的使用
7. Python爬蟲入門七之正則表達式
二、爬蟲實戰
1. Python爬蟲實戰一之爬取糗事百科段子
2. Python爬蟲實戰二之爬取百度貼吧帖子
3. Python爬蟲實戰三之實現山東大學無線網路掉線自動重連
4. Python爬蟲實戰四之抓取淘寶MM照片
5. Python爬蟲實戰五之模擬登錄淘寶並獲取所有訂單
6. Python爬蟲實戰六之抓取愛問知識人問題並保存至資料庫
7. Python爬蟲實戰七之計算大學本學期績點
8. Python爬蟲實戰八之利用Selenium抓取淘寶匿名旺旺
三、爬蟲利器
1. Python爬蟲利器一之Requests庫的用法
2. Python爬蟲利器二之Beautiful Soup的用法
3. Python爬蟲利器三之Xpath語法與lxml庫的用法
4. Python爬蟲利器四之PhantomJS的用法
5. Python爬蟲利器五之Selenium的用法
6. Python爬蟲利器六之PyQuery的用法
四、爬蟲進階
1. Python爬蟲進階一之爬蟲框架概述
2. Python爬蟲進階二之PySpider框架安裝配置
3. Python爬蟲進階三之爬蟲框架Scrapy安裝配置
4. Python爬蟲進階四之PySpider的用法
第二(第一的姊妹篇):Python爬蟲入門教程(來源於博主:blog.csdn.net/column/details/why-bug.html)
Python版本:2.7
教程目錄:
[Python]網路爬蟲(一):抓取網頁的含義和URL基本構成
[Python]網路爬蟲(二):利用urllib2通過指定的URL抓取網頁內容
[Python]網路爬蟲(三):異常的處理和HTTP狀態碼的分類
[Python]網路爬蟲(四):Opener與Handler的介紹和實例應用
[Python]網路爬蟲(五):urllib2的使用細節與抓站技巧
[Python]網路爬蟲(六):一個簡單的百度貼吧的小爬蟲
[Python]網路爬蟲(七):Python中的正則表達式教程
[Python]網路爬蟲(八):糗事百科的網路爬蟲(v0.3)源碼及解析(簡化更新)
[Python]網路爬蟲(九):百度貼吧的網路爬蟲(v0.4)源碼及解析
[Python]網路爬蟲(十):一個爬蟲的誕生全過程(以山東大學績點運算為例)
[Python]網路爬蟲(11):亮劍!爬蟲框架小抓抓Scrapy閃亮登場!
[Python]網路爬蟲(12):爬蟲框架Scrapy的第一個爬蟲示例入門教程
第三:你已經看完上面(第一或者第二)的教程:再推薦知乎用戶@陳唯源 的實戰練習博客
Python爬蟲學習記錄(1)——Xiami全站播放數
Python爬蟲學習記錄(2)——LDA處理歌詞
百度音樂帶標籤,作曲,演唱者,類別的歌詞數據
Python爬蟲學習記錄(4)——傳說中的足彩倍投法。。好像也不是那麼靠譜
2011~2013.5全球所有足球比賽比分數據以及足彩各公司盤口
Python爬蟲學習記錄(3)——用Python獲取蝦米加心歌曲,並獲取MP3下載地址
Python爬蟲學習記錄(5)——python mongodb + 爬蟲 + web.py 的acfun視頻排行榜
Python爬蟲學習記錄(0)——Python 爬蟲抓站 記錄(蝦米,百度,豆瓣,新浪微博)
第四:最後推薦知乎用戶@gaga salamer 的實戰練習博客
爬蟲教程(1)基礎入門
爬蟲教程(2)性能進階
知乎用戶信息爬蟲(規模化爬取)
用scrapy爬取豆瓣電影新片榜
用scrapy對豆瓣top250頁面爬取(多頁面爬取)
用scrapy自動爬取下載圖片
用scrapy自動下載石原sama的豆瓣影人圖集(727張圖片,自動下載)
希望以上的教程可以幫助到大家。
很多人問我如何學習Python爬蟲,為此我整理編寫了一本Python爬蟲相關的電子書,主要包括Python入門、Python爬蟲入門到進階、Python爬蟲面試總結等等。可以在微信公眾號【一個程序員的日常】後台回復關鍵詞【1】獲取這本電子書。
震驚了,8次滑鼠點擊,教會你網頁數據爬蟲
既然零基礎,給你講完python, 講完正則,講完網頁結構,估計黃花大閨女都嫁人了。
介紹一招,20秒上手爬蟲數據,用的工具,Excel
不用VBA,甚至都不用公式
甚至不用打開網頁,查看網路元素
也是作為@矽谷密探的補充,畢竟不是所有人都能輕鬆的上Google啊
Here we go
1.雙擊圖標,打開Excel,
累計滑鼠點擊次數:2
2.依次點擊,數據-從網站
累計滑鼠點擊次數:4
3.在彈出的對話框中,輸入目標網址,Games sales ,點擊轉到,go
累計滑鼠點擊次數:5
4.等待網頁載入,點擊你需要的數據區域,點擊導入,import
累計滑鼠點擊次數:7
5,然後會彈出一個數據存放區域的對話框,隨便找個地方,點擊ok
累計滑鼠點擊次數:8
6.等待數據載入,本次無需點擊
累計滑鼠點擊次數:8
7.大約等待10秒鐘,可以看到了,大概爬取了600行的數據。
累計滑鼠點擊次數:8
怎麼樣,你學會了嗎
要是還看不懂
我選擇狗帶。
相關Live
* 培養數據分析的思維方式
相關回答
* 怎麼培養數據分析的能力? - 知乎
* 業餘時間如何學數據分析? - 知乎
* 如何用一個循環語句輸出九九乘法表? - 知乎
* Excel 有什麼神奇用途? - 知乎
-------分割線-------
歡迎關注我的微信公眾賬號:決明子 Jueming_zi
這裡有關於攝影,繪畫,藝術,以及我想說給你們聽的故事
http://weixin.qq.com/r/iUgiOm3EeDAHrSlZ9x2b (二維碼自動識別)
【4月8日最新更新!】
看到樓上都沒有提到Web Scraper,順路介紹一下吧
達成效果:5分鐘上手,1個小時包會的零基礎爬蟲技術;
無需編程,無需翻牆,不敲代碼,只要一個Chrome(谷歌瀏覽器),適用於95%的網站抓取,輕鬆學會後受益終身;
最近在3.3計劃的校友群里安利了十幾人零基礎爬蟲技術,分享下錄製的教學視頻內容:
一、抓取工具簡介
把數據抓取技術和軟體分成了三個象限:
1)適應情況,能否抓取大部分網頁內容;高票Excel的抓取功能簡直是黑科技,但對於DIV形式網頁,或者通過「滾屏下拉」動態載入更多數據的網頁來說就比較棘手了;
2)生存能力,不被反爬蟲技術甄別;矛與盾是永恆的話題,最近採集IT桔子時,被反爬蟲機制識別後直接封IP到臨時黑名單,連瀏覽器也無法打開主站了;
3)學習成本,大部分小夥伴一個月用不到一次數據抓取技術,投入較多時間成本不划算;
那麼,Web Scraper的適用範圍有哪些?
翻譯一些該工具官網 (Web Scraper) 上的自賣自誇介紹供參考:
1)通過不同的選擇器類型,可以鏈接到分頁頁面並抓取「文本型,表格型,圖片,鏈接」等多種數據類型
2)不像其他的數據抓取工具只從html元素中抓取(有一種傲嬌的感覺),Web Scraper可以支持動態載入數據類型,包含:
- 等待頁面中的動態數據載入完全
- 自動點擊分頁按鈕(第1頁,第2頁...)抓取更多數據
- 自動點擊「載入更多按鈕」來抓取更多數據
- 自動滾動下拉頁面載入更多數據
3)「老師能不能再具體一點?」 來看三個樣例吧:
知乎粉絲列表:
https://www.zhihu.com/people/chen-da-xin-84/followers?page=1
麥淘:
http://m.maitao.com/classify/null?ids=1
IT桔子:
https://www.itjuzi.com/search?key=%E4%BA%B2%E5%AD%90
二、工具準備(預計10分鐘)
下面我們正式進入主題,首先需要兩個工具:
- 谷歌chrome瀏覽器
鏈接:谷歌瀏覽器下載-百度軟體中心 - Web Scraper插件
- 可以翻牆的同學通過官方渠道 http://chrome.google.com/webstore/detail/web-scraper/jnhgnonknehpejjnehehllkliplmbmhn
- 無法翻牆同學通過鏈接 http://chrome-extension-downloader.com/?extension=jnhgnonknehpejjnehehllkliplmbmhn#
打開鏈接(可能要刷新幾次),點擊 Download extension可以下載一個crx文件
或百度網盤鏈接:http://pan.baidu.com/s/1pKUvbyN 密碼:idqg
下載後需要手動安裝插件:【怎麼安裝Chrome插件】安裝Chrome第三方插件_百度經驗
三、上手體驗(預計5分鐘)
評論區有小夥伴反應無法點擊F12召喚Web Scraper,可能是筆記本或Mac電腦的原因
- Windows, Linux: Ctrl+Shift+I (love的I) or F12
- Mac: Cmd+Opt+I
- 如果為左右分屏模式,需要點擊右上角的三個小點,切換為上下分屏模式
神秘代碼:
{"_id":"test","startUrl":"https://www.zhihu.com/people/chen-da-xin-84/followers?page=2","selectors":[{"parentSelectors":["_root"],"type":"SelectorText","multiple":true,"id":"Username","selector":"div.UserItem-title a.UserLink-link","regex":"","delay":"500"}]}
開抓:
- 點擊Scrape
- 設置抓取規則(默認即可),點擊Start Scraping ;
啊哈,在彈窗顯示知乎粉絲頁面後,抓取結果就直接出來了,如圖:
3. 快樂地導出數據吧,點擊export data as CSV,即導出為CSV格式
四、製作自己的第一隻蟲(預計10分鐘)
- 在chrome中打開需要抓取的目標網址,按F12在Web Scraper中重新創建一個站點 Create sitemap; 輸入站點名(自定義)和網址(輸入目標網址)後,點擊Create sitemap的確認按鈕;
- 在新建選擇器中,點擊 Add new selector 新建選擇器;
- Delay 寫500ms,預留一定的頁面載入時間;
- 選擇器的配置:
- Type選擇Text文本形
- 勾選Multiple按鈕,表示本頁中需要抓取多個元素
- 點擊 Selector 的 select按鈕,直接點擊網頁上的元素即可!!!
綠色代表可採集的數據,點擊後變成紅色為鎖定狀態(具體可參見教程第16分鐘)
點擊第二個採集數據,程序自動判定所有同類型元素並紅色鎖定後,點擊「Done selecting」
5.點擊 Save Selector 並按照第三步中的抓取步驟進行後續採集操作(scrape → start scraping)
教學視頻:
數據抓取入門_野生技術協會_科技_bilibili_嗶哩嗶哩bilibili.com視頻五、進階技巧1-頁面採集多元素
聰明的同學已經嘗試在一個頁面里採集多個數據了,但往往發現是亂序,如圖:
這就涉及到一個元素集(Element)的概念,首先我們把第一步驟提到的選擇器刪掉,新建一個type為Element的選擇器,並選中多個列表項數據,並勾選複選按鈕,如圖:
保存後,點擊新建的選擇器,進入該選擇器的下一級路徑,採集用戶名和個人描述
點擊Select後,爬蟲插件自動高亮了上一級-元素集的第一個元素,只需要點選中其中的元素即可(注意這次不需要選multiple了)
添加好採集器後,點擊Selector graph查看樹形結構(點擊圖片可查看清晰大圖)
開抓,並獲得理想的結果!
五、進階技巧2-自動翻頁/點擊載入更多
和上一步介紹的元素集概念相似,對於下拉動態載入更多數據,以及需要點擊才能載入更多的情況,介紹兩個新type-滾動下拉元素集(Element scroll down) 和 點擊元素集(element click),來看第一部分提到的其他兩個案例吧:
1)麥淘(滾動下拉):
2)IT桔子(需要點擊」載入更多「):
六、高階技巧-採集子鏈接內頁面
1)對於子鏈接的採集,通過type為點擊元素集(Element Click)和鏈接(Link)類型,
所有用LInk類型的情況都可以用Element Click的方式抓取;
但Link類型可以抓取網址鏈接;兩者的使用範圍區分可見下圖:
案例1網址:巨潮資訊網 教程:如何批量下載 A 股招股說明書?
案例2還是之前的麥淘網址:http://m.maitao.com/classify/null?ids=1
2)然後在Link或Element Click的下一級路徑中(子鏈接)中建立選擇器;
看實例:
案例1為了抓取每個子鏈接中右上角的下載地址,建立以下樹形結構選擇器:
第一個LInk類型的Detail為抓取子頁面鏈接(此處可替換為Element Click);
第二個Link類型的沒有下一級路徑,只為抓取右上角的下載鏈接;
進階視頻:
數據抓取II-進階_野生技術協會_科技_bilibili_嗶哩嗶哩bilibili.com視頻做新媒體運營,很多時候會需要用到數據來幫助工作,比如你新進到一家公司做新媒體內容編輯,那你需要盤點公司已有的內容資產,避免重複生產內容。這時候就需要把網頁上的數據給扒下來,放在一起,才會一目了然。從網頁上扒數據,最好用的方法當然是爬蟲工具啦。很多人都以為爬蟲很難學吧?我一開始也這麼認為的,直到我遇到了 Web Scraper 這個工具,才知道原來爬網頁數據也可以這麼簡單。在這篇文章中,我就現身說法,講解一個小白是怎麼快速上手 Web Scraper 的。
在講爬蟲教程之前,先給大家推薦一個好用的數據記錄工具:有哪些「神奇」的數據獲取方式?同樣能夠幫數據分析小白節省時間、提高效率。
好的,那咱們正式開始介紹 Web Scraper 的使用教程吧!
步驟一:下載 Web Scraper
Web Scraper 是 Chrome 瀏覽器上的一個插件,你需要翻牆進入 Chrome 應用商店,下載 Web Scraper 插件。
步驟二:打開 Web Scraper
先打開一個你想爬數據的網頁,比如我想爬今日頭條上「吳曉波頻道」這個賬戶的文章標題、時間、評論數,那我就先打開它,再一一進行操作。
然後用快捷鍵 Ctrl + Shift + I / F12 打開 Web Scraper。
步驟三:新建一個 Sitemap
點擊 Create New Sitemap,裡面有兩個選項,import sitemap是指導入一個現成的 sitemap,咱小白一般沒有現成的,所以一般不選這個,選 create sitemap 就好。然後進行這兩個操作:
- Sitemap Name:代表你這個 Sitemap 是適用於哪一個網頁的,所以你可以根據網頁來自命名,不過需要使用英文字母,比如我抓的是今日頭條的數據,那我就用 toutiao 來命名;
- Sitemap URL:把網頁鏈接複製到 Start URL 這一欄,比如圖片里我把「吳曉波頻道」的主頁鏈接複製到了這一欄。
步驟四:設置這個 Sitemap
整個 Web Scraper 的抓取邏輯是這樣:設置一級 Selector,選定抓取範圍;在一級 Selector 下設置二級 Selector,選定抓取欄位,然後抓取。
咱們換個接地氣的例子,假如你要獲取福建人的姓名、性別和年齡這三個要素,那麼你得這麼做:首先要定位到福建省,然後再在福建省裡面去定位姓名、性別、年齡。
在這裡,一級 Selector 表示你要在中國這個大的國家圈出福建省,二級Selector 表示你要在福建省的人口中圈定姓名、性別、年齡這三個要素。
對於文章而言,一級 Selector 就是你要把這一塊文章的要素圈出來,這個要素可能包含了 標題、作者、發布時間、評論數等等,然後我們再在二級 Selector 中挑出我們要的要素,比如標題、作者、閱讀數。
下面我們來拆解這個設置一級、二級 Selector 的工作流:
1. 點擊 Add new selector 創建一級 Selector,按照以下步驟操作:
- 輸入id:id 代表你抓取的整個範圍,比如這裡是文章,我們可以命名為 wuxiaobo-articles;
- 選擇 Type:Type 代表你抓取的這部分的類型,比如元素/文本/鏈接,因為這個是整個文章要素範圍選取,我們需要用 Element 來先整體選取(如果這個網頁需要滑動載入更多,那就選 Element Scroll Down);
- 勾選 Multiple:勾選 Multiple 前面的小框,因為你要選的是多個元素而不是單個元素,當我們勾選的時候,爬蟲插件會幫助我們識別多篇同類的文章;
- 保留設置:其餘未提及部分保留默認設置。
2. 點擊 select 選擇範圍,按照以下步驟操作:
- 選擇範圍:用滑鼠選擇你要爬取數據的範圍,綠色是待選區域,用滑鼠點擊後變為紅色,才是選中了這塊區域;
- 多選:不要只選一個,下面的也要選,否則爬出來的數據也只有一行;
- 完成選擇: 記得點 Done Selecting;
- 保存:點擊 Save Selector。
3. 設置好了這個一級的 Selector 之後,點進去設置二級的 Selector,按照以下步驟操作:
- 新建 Selector:點擊 Add new selector ;
- 輸入 id:id 代表你抓取的是哪個欄位,所以可以取該欄位的英文,比如我要選「作者」,我就寫「writer」;
- 選擇 Type:選 Text,因為你要抓取的是文本;
- 勿勾選 Multiple:不要勾選 Multiple 前面的小框,因為我們在這裡要抓取的是單個元素;
- 保留設置:其餘未提及部分保留默認設置。
4. 點擊 select,再點擊你要爬取的欄位,按照以下步驟操作:
- 選擇欄位:這裡爬取的欄位是單個的,用滑鼠點擊該欄位即可選定,比如要爬標題,那就用滑鼠點擊某篇文章的標題,當欄位所在區域變紅即為選中;
- 完成選擇:記得點 Done Selecting;
- 保存:點擊 Save Selector。
5. 重複以上操作,直到選完你想爬的欄位。
步驟五:爬取數據
之所以說 Web Scraper 是傻瓜式爬蟲工具,就是因為只需要設置完所有的 Selector,就可以開始爬數據了,怎麼樣,是不是簡單?
那麼怎麼開始爬數據呢?只需要一個簡單的操作:點擊 Scrape,然後點 Start Scraping,會彈出一個小窗,然後辛勤的小爬蟲就開始工作了。你會得到一個列表,上面有你想要的所有數據。
如果你希望把這些數據做一個排序,比如按照閱讀量、贊數、作者等指標排序,讓數據更一目了然,那麼你可以點擊 Export Data as CSV,把它導入 Excel 表裡。
導入 Excel 表格之後,你就可以對數據進行篩選了。
以上就是快速上手 Web Scraper 的所有操作過程,連我這種懶癌 + 手殘都能在 5 分鐘之內搞定,相信你也可以指哪兒爬哪兒,完全 OK 的啦。
如果想要更系統地學習新媒體營銷,請立即免費申請加入「新媒體自習室」課程。
強答,
Python爬蟲還算比較簡單的。我學習Python爬蟲的步驟大概是:
1. 學習Python基本語法,並熟練使用
2. 學習Python中關於爬蟲的幾個重要的內置庫:urllib/http/Cookie等
3. 學習正則表達式,beautifulsoup等解析網頁的工具或包
4. 利用上幾步學習的至少爬取比較簡單的網站,比如一些應用市場等等,不需要登陸
5. 學習利用工具分析網頁請求流程、學習模擬登陸,拿新浪微博、知乎等需要登陸的網站進行練習
6. 學習Python中關於多線程、多進程的東西,將以前寫的代碼改為多線程版本,提高效率
7. 學習Python中的爬蟲框架,或者自己寫一個爬蟲框架。
更高級的,還有驗證碼識別、js動態請求、js執行、代理IP等等。
推薦一個我自己的專欄:擼代碼,學知識 - 知乎專欄,裡邊有一些爬蟲的基礎,以及自己嘗試寫的一個小型爬蟲框架。
安利自己的入門教程之前,首先安利 @xlzd的爬蟲系列,這是我的入門系列:
https://xlzd.me/tag/crawler/1/
然後安利一下自己寫的更小白版本的教程:
Python爬蟲|Python爬蟲入門(一):爬蟲基本結構簡單實例 - 知乎專欄
Python爬蟲|Python爬蟲入門(二):請求 - 知乎專欄
Python爬蟲|Python爬蟲入門(三):解析 - 知乎專欄
Python爬蟲|Python爬蟲入門(四):儲存 - 知乎專欄
然後推薦一下組裡爬蟲工程師大佬@爬蟲 的更高端的系列:
爬蟲之從入門到放棄 - 知乎專欄
推薦的順序是,首先是我的零基礎小白版本,了解一下原理,然後 @xlzd的系列,了解一下全局以及理清楚思路,然後 @爬蟲的專欄,了解更深更完整的框架和重難點。
結束這三個部分之後,可以看知乎上關於如何進階的回答~首先要自己會寫代碼。
學習爬蟲可以從下面一些知識點入手學習。1、http相關知識。
2、瀏覽器攔截、抓包。
3、python2 中編碼知識,python3 中bytes 和str類型轉換。
4、抓取javascript 動態生成的內容。
4、模擬post、get,header等
5、cookie處理,登錄。
6、代理訪問。
7、多線程訪問、python 3 asyncio 非同步。
8、正則表達式、xpath等
等等。。。。
還有scrapy requests等第三方庫的使用。
請看看
Python爬蟲聯想詞視頻和代碼 - 通過python學會編程 - 知乎專欄
?( ?????????? ????? )哦吼吼 可以看我的專欄呀
- 爬蟲的介紹
- 什麼是爬蟲
- 爬蟲能幹什麼
- HTTP協議的講解
- 爬蟲的原理
- 爬蟲環境的搭建
- IDE
- 各種包的安裝
- 爬蟲之網頁下載
- 如何抓包
- 如何用程序模擬請求
- 爬蟲之解析
- 正則表達式的基本使用
- XPATH的基本使用
- CSS的基本使用
- headers的詳細講解
- Accept
- User-Agent
- Referer
- Cookie
- If-modified-since
- 爬蟲之存儲
- mongodb的基本使用
- 爬蟲之非同步載入
- 非同步載入網頁的抓包
- 模擬發送
- 爬蟲之多線程
- 如何讓爬蟲更快
- scrapy的基本介紹
- 如何爬取大型網站
- scrapy的介紹
- cookie
- scrapy的正確編寫方式
- scrapy之下載中間件
- 各種下載中間件的使用
- 如何編寫自己的下載中間件
- scrapy之技巧
- 如何調試scrapy
- form response
- scrapy之分散式
- 爬蟲總結及反爬技巧
爬蟲從入門到精通系統教程---目錄 - 知乎專欄
爬蟲之從入門到放棄 - 知乎專欄
給你講講我的學習經歷。
先說我個人素質吧,有點兒語言基礎,大學學的那點兒C語言,以及Excel錄製宏裡面改改VBA代碼。
我也是初學者,以下回答僅作參考。
我從一開始就聽別人說過Python做爬蟲很方便,主要這語言簡單,同時爬蟲框架完善,所以想都沒想就去學Python爬蟲了。
然後就去網易雲課堂里找學習材料(沒打廣告,反正我也沒人看),有一個得分4.9還是多少的爬新浪新聞頁的那個,跟著裡面學,裡面的人寫什麼我就寫什麼,不懂的就查資料,什麼是html啦,什麼是網站協議之類的。然後跟著他把代碼敲完了,真的就爬到一個頁面了。此時,我用了半天時間。
然後我就到知乎上查找有關Python爬蟲的回答,看牛人們都是怎麼一步一步做下去的,其中看到一本書叫《Python網路數據採集》,然後就去下了pdf版,花了半天時間看了個大概前3章還有錯誤處理那章。然後就想找個網站實際操作一下。我選擇的是比較感興趣的p2p行業人人貸的借款人界面。
然後就是對照著書和視頻依葫蘆畫瓢,同時參照著裡面某些包比如bs4的幫助文檔 ,真的就能爬一個完整的界面了。但是問題來了,又不只是爬一個界面啊,視頻和書里沒講怎麼爬多個界面。這時候就需要學點專業的Python知識了。我就去找了廖雪峰的教程,看了我需要的那幾塊,分別是循環,函數,列表什麼的。看完之後就知道怎麼爬多個頁面了。設計爬取多個頁面。整個過程花了1到2天時間。
然後就涉及到效率問題了,1秒1頁簡直太慢了,所以我就想到了多線程和多進程,去廖雪峰教程里學習多線程和多進程,當然這遠遠不夠,還參照網上別的資料和幫助文檔,搞出了多線程,但速率好像並沒有提升,又去搞多進程,提升顯著,1秒100頁都不是問題。這段過程花了2到3天。
速度是快上去了,不過不到1分鐘就被封IP了,我就又在知乎上查找如何就對爬蟲封IP方法。構建IP池。我目前在這一步。所以,我只比零基礎快了一周。
嘿嘿,一起加油!
學習任何新事物,都需要先搭建起學習框架。
通常我們會從「基礎知識」、「案例實操」兩個板塊切入,構建起自己的學習閉環。
關於「基礎知識」
對於想快速了解知識關鍵要點的新手,以下是比較推薦的學習素材:
MOOC課程:Python語言程序設計、Python網路爬蟲與信息提取
參考書籍:《利用Python進行數據分析》、《Python編程:從入門到實踐》
如果時間充裕,且希望能系統性掌握Python相關知識,可以參考 @路人甲 對該問題的回復。他已經羅列了非常多的參考資料。
關於「案例實操」
驗證自己是否真正理解知識並能應用的最佳方式,就是通過案例完成實踐操作。
分享案例
作為爬蟲新手,如何利用Python爬取NBA球員數據。
1、搭建工作環境
傳統方式:對於Win用戶,需要自己在本地搭建運行環境。
準備工作:
搭建Python3.6環境
- 用Anaconda
安裝Package
- Requests庫
- BeautifulSoup4(bs4)庫
- Numpy和Pandas庫(用於數據存儲和清洗)
說明:
以上工具,除Python環境外,皆為Python的第三方庫。Windows環境下通過cmd的pip install命令安裝。
對於Mac用戶,雖然沒有那麼複雜,但同樣會需要花費時間與精力。
大家會發現,按以上步驟搭建工作環境,是個特別費時費力的事兒,P2、P3的兼容性問題也很突出。
那麼有沒有更好的方法呢?答案是,有的。
像科賽網,針對數據科學家人群,重點打造的K-Lab在線數據分析協作平台。它涵蓋了Python、R等多種主流語言,完成90%以上數據分析挖掘相關庫的部署,避免了搭建本地環境配置時遇到的各種問題,幫助數據人才真正實現「在線」做數據分析,提高效率,專註價值創造。
2、搭建工作流
1)選取目標官網:NBA中文數據網站
2)導入庫
#引入主要的爬取工具:
import requests
from bs4 import BeautifulSoup
#以下是數據的清洗和存儲所需的輔助工具
import re
import numpy as np
import pandas as pd
完成導入後,獲取每個球員各個賽季單場比賽的基礎數據(CSV文檔格式):
3)找到頁面,批量爬取
樣例:LeBron James的詳情頁,該網站數據源相對規整,URL設置易找規律,方便抓取。
說明:為了實現自動批量抓取,爬取時一般需要讓爬蟲先爬取列表頁,再根據列表頁的索引鏈接爬取相應的詳情頁。但在該項目並不需要如此,從鏈接1、鏈接2可以看出其中規律。
將需要關注的參數用粗體表示:
- page:表示數據的頁碼,每頁顯示20條數據。
- GameType:season表示常規賽,playoff表示季後賽。
- Player id:網站自定義的球員編號。
爬取時,我們只需要改動這些數據就能實現全站資源的爬取,非常適合新手。
4)解析頁面
推薦在Chrome瀏覽器的開發者模式下解析頁面,它能快速定位到所需內容。
圖中藍標顯示的Table標籤便是需要抓取的表格。
關於table標籤:
table標籤有兩個子標籤thead、tbody。
- thead子標籤:存儲表頭信息,包含一個tr子標籤(表頭只有一行)。tr又包含多個th子標籤,每個th存儲一格表頭信息。
- tbody子標籤:存儲表格主題,包含多個tr子標籤。tr又包含多個td子標籤,每個td存儲一格表格信息。
5)將表格內容搬運到本地
首先,通過fillframe函數,將網頁上的表格轉換成一個pandas的DataFrame表格對象。
def fillframe(tbody,index):
#這裡只使用tbody標籤,表頭通過index傳入,index是一個list
frame=pd.DataFrame()
if tbody:
all_tr=tbody.find_all("tr")
for tr in all_tr:
dic={}
all_td=tr.find_all("td")
i=-1
for td in all_td:
if i==-1:
#可以發現,網頁表格中每行的第一格都是空的,所以我們需要將其跳過。
i+=1
continue
else:
dic[index[i]]=td.string
i+=1
frame=pd.concat([frame,pd.DataFrame(dic,index=[0])],ignore_index=True)
return frame
其次,用fillindex函數將fillframe函數生成index。
def fillindex(thead):
index=[]
if thead:
all_th=thead.tr.find_all("th")
i=-1
for th in all_th:
if i==-1:
i+=1
continue
else:
index.append(th.string)
i+=1
return index
經過以上操作,不難發現,網頁上表格的表頭可能有歧義。比如它將投籃的命中數和三分的命中數兩項數據的索引都設置為了命中。為了保險起見,建議手動設置index。
index=["球員","賽季","結果","比分","首發","時間","投籃","命中","出手","三分", "三分命中","三分出手","罰球","罰球命中","罰球出手","籃板","前場","後場","助攻","搶斷","蓋帽","失誤","犯規","得分"]
6)開始爬取頁面,並提取table
提取過程中,由於每個球員的數據條目數不同,不能確定球員數據的頁數。
可以考慮給spider函數設置為「在頁面無法正常讀取或讀取的頁面中找不到table標籤時返回False值」。
def spider(page,player_id,gametype,index):
url="http://www.stat-nba.com/query.php?page="+str(page)+"QueryType=gameGameType="+str(gametype)+"Player_id="+str(player_id)+"crtcol=seasonorder=1"
r=requests.get(url,timeout=30)
if r.status_code==200:
demo=r.text
soup=BeautifulSoup(demo,"html.parser")
data=soup.find("div",{"class":"stat_box"})
if not data: #找不到數據表格時退出
return False
table=data.find("table")
if table:
tbody=table.find("tbody")
return fillframe(tbody,index)
else: #數據表格為空時退出
return False
else: #頁面讀取失敗時退出
return False
其次,用update函數保存更新已爬取好的DataFrame。
def update(frame,path,filename):
try: #嘗試讀取文件filename
frame0=pd.read_csv(path+"\"+filename)
except: #如果文件已經存在,則更新它
frame.to_csv(path+"\"+filename,index=False,encoding="utf-8")
else: #否則創建名為filename的文件
frame0=pd.concat([frame0,frame],ignore_index=True)
frame0.to_csv(path+"\"+filename,index=False,encoding="utf-8")
最後,著手設計主函數,來控制循環以及存儲數據。
frame_player=pd.DataFrame()
gametype="season"
for player_id in range(1862,1863):
#這裡僅爬取一位球員(James)測試,需要正式爬取請改為range(1,4450)
page=0
flag=True
while flag:
result=spider(page,player_id,gametype,index)
if type(result)==bool and not result: #返回False時
flag=False
break
else: #爬取成功時讀取表格
frame_player=pd.concat([frame_player,result],ignore_index=True)
page+=1
7)測試階段:爬取一位球員數據,結果如下:
frame_player.head()
接下來,就可以使用之前定義的update函數將frame_player保存到本地,也可以在每次while循環結束時運行一次update函數以起到實時更新的效果。
注意:實時更新完以後需執行frame_player=DataFrame()語句,將frame_player清空以避免數據重複。
以上便是完整的爬取數據操作過程。
8)常見問題解答
由於網站自身的編碼原因,爬取時可能會遇到所有中文字元都成為亂碼,如下:
frame_player.head()
對該數據集,可以手動輸入Index來解決表頭亂碼。
爬取球員英文姓名解決球員姓名亂碼,具體的函數如下:
def getname(player_id):
r2=requests.get("http://www.stat-nba.com/player/"+str(player_id)+".html",timeout=30)
if r2.status_code==200:
demo2=r2.text
soup2=BeautifulSoup(demo2,"html.parser")
name_source=soup2.find("div",{"class":"playerinfo"}).find("div",{"class":"name"})
if re.findall("[A-z]* [A-z]*",name_source.contents[0]):
name=re.findall("[A-z]* [A-z]*",name_source.contents[0])[0]
else:
name=np.nan
else:
name=np.nan
return name
PS:爬蟲還有很多可以優化的空間,比如控制每次發送請求的時間間隔防止IP被封,爬取球隊名稱做映射來解決比分中的亂碼。
我們已在科賽網上創建該爬蟲項目,可以看到完整的實現代碼。
建議新手萌登陸官網在線實現運行,不僅僅只停留在閱讀層面。
操作步驟
登錄「kesci.com」- 點擊「K-Lab」- 點擊「項目」- 在「關鍵詞」框內輸入「爬取」即可查看該項目的爬蟲完整代碼,一鍵Fork、在線運行。
祝大家食用愉快!
1秒100頁,你這就算是DNS攻擊。我一開始擼爬蟲的時候也是不去設置時延,一心想的是越快越好。我現在都是5-10秒爬一個頁面,一來數據也不急著一下子全部拿到,二來不能去影響他人的正常體驗。
這就涉及到一個道德的問題。
技術方面我不多談,就說說這個時延。
對於這個問題,最佳的答案就是:Python入門網路爬蟲之精華版 lining0806/PythonSpiderNotes
Python入門網路爬蟲之精華版
Python學習網路爬蟲主要分3個大的版塊:抓取,分析,存儲
另外,比較常用的爬蟲框架Scrapy,這裡最後也詳細介紹一下。
首先列舉一下本人總結的相關文章,這些覆蓋了入門網路爬蟲需要的基本概念和技巧:寧哥的小站-網路爬蟲
當我們在瀏覽器中輸入一個url後回車,後台會發生什麼?比如說你輸入http://www.lining0806.com/,你就會看到寧哥的小站首頁。
簡單來說這段過程發生了以下四個步驟:
- 查找域名對應的IP地址。
- 向IP對應的伺服器發送請求。
- 伺服器響應請求,發回網頁內容。
- 瀏覽器解析網頁內容。
網路爬蟲要做的,簡單來說,就是實現瀏覽器的功能。通過指定url,直接返回給用戶所需要的數據,而不需要一步步人工去操縱瀏覽器獲取。
抓取
這一步,你要明確要得到的內容是什麼?是HTML源碼,還是Json格式的字元串等。
1. 最基本的抓取
抓取大多數情況屬於get請求,即直接從對方伺服器上獲取數據。
首先,Python中自帶urllib及urllib2這兩個模塊,基本上能滿足一般的頁面抓取。另外,requests也是非常有用的包,與此類似的,還有httplib2等等。
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, "GET")
print "response headers:", response_headers
print "content:", content
此外,對於帶有查詢欄位的url,get請求一般會將來請求的數據附在url之後,以?分割url和傳輸數據,多個參數用連接。
data = {"data1":"XXXXX", "data2":"XXXXX"}
Requests:data為dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data為string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+"?"+data
response = urllib2.urlopen(full_url)
相關參考:網易新聞排行榜抓取回顧
參考項目:網路爬蟲之最基本的爬蟲:爬取網易新聞排行榜
2. 對於登陸情況的處理
2.1 使用表單登陸
這種情況屬於post請求,即先向伺服器發送表單數據,伺服器再將返回的cookie存入本地。
data = {"data1":"XXXXX", "data2":"XXXXX"}
Requests:data為dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data為string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 使用cookie登陸
使用cookie登陸,伺服器會認為你是一個已登陸的用戶,所以就會返回給你一個已登陸的內容。因此,需要驗證碼的情況可以使用帶驗證碼登陸的cookie解決。
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
若存在驗證碼,此時採用response = requests_session.post(url=url_login, data=data)是不行的,做法應該如下:
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陸
response2 = requests_session.get(url_login) # 已登陸,因為之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陸,因為之前拿到了Response Cookie!
相關參考:網路爬蟲-驗證碼登陸
參考項目:網路爬蟲之用戶名密碼及驗證碼登陸:爬取知乎網站
3. 對於反爬蟲機制的處理
3.1 使用代理
適用情況:限制IP地址情況,也可解決由於「頻繁點擊」而需要輸入驗證碼登陸的情況。
這種情況最好的辦法就是維護一個代理IP池,網上有很多免費的代理IP,良莠不齊,可以通過篩選找到能用的。對於「頻繁點擊」的情況,我們還可以通過限制爬蟲訪問網站的頻率來避免被網站禁掉。
proxies = {"http":"http://XX.XX.XX.XX:XXXX"}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安裝opener,此後調用urlopen()時都會使用安裝過的opener對象
response = urllib2.urlopen(url)
3.2 時間設置
適用情況:限制頻率情況。
Requests,Urllib2都可以使用time庫的sleep()函數:
import time
time.sleep(1)
3.3 偽裝成瀏覽器,或者反「反盜鏈」
有些網站會檢查你是不是真的瀏覽器訪問,還是機器自動訪問的。這種情況,加上User-Agent,表明你是瀏覽器訪問即可。有時還會檢查是否帶Referer信息還會檢查你的Referer是否合法,一般再加上Referer。
headers = {"User-Agent":"XXXXX"} # 偽裝成瀏覽器訪問,適用於拒絕爬蟲的網站
headers = {"Referer":"XXXXX"}
headers = {"User-Agent":"XXXXX", "Referer":"XXXXX"}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
4. 對於斷線重連
不多說。
def multi_session(session, *arg):
retryTimes = 20
while retryTimes&>0:
try:
return session.post(*arg)
except:
print ".",
retryTimes -= 1
或者
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes&>0:
try:
return opener.open(*arg)
except:
print ".",
retryTimes -= 1
這樣我們就可以使用multi_session或multi_open對爬蟲抓取的session或opener進行保持。
5. 多進程抓取
這裡針對華爾街見聞進行並行抓取的實驗對比:Python多進程抓取 與 Java單線程和多線程抓取
相關參考:關於Python和Java的多進程多線程計算方法對比
6. 對於Ajax請求的處理
對於「載入更多」情況,使用Ajax來傳輸很多數據。
它的工作原理是:從網頁的url載入網頁的源代碼之後,會在瀏覽器里執行JavaScript程序。這些程序會載入更多的內容,「填充」到網頁里。這就是為什麼如果你直接去爬網頁本身的url,你會找不到頁面的實際內容。
這裡,若使用Google Chrome分析」請求「對應的鏈接(方法:右鍵→審查元素→Network→清空,點擊」載入更多「,出現對應的GET鏈接尋找Type為text/html的,點擊,查看get參數或者複製Request URL),循環過程。
- 如果「請求」之前有頁面,依據上一步的網址進行分析推導第1頁。以此類推,抓取抓Ajax地址的數據。
- 對返回的json格式數據(str)進行正則匹配。json格式數據中,需從"uxxxx"形式的unicode_escape編碼轉換成u"uxxxx"的unicode編碼。
7. 自動化測試工具Selenium
Selenium是一款自動化測試工具。它能實現操縱瀏覽器,包括字元填充、滑鼠點擊、獲取元素、頁面切換等一系列操作。總之,凡是瀏覽器能做的事,Selenium都能夠做到。
這裡列出在給定城市列表後,使用selenium來動態抓取去哪兒網的票價信息的代碼。
參考項目:網路爬蟲之Selenium使用代理登陸:爬取去哪兒網站
8. 驗證碼識別
對於網站有驗證碼的情況,我們有三種辦法:
- 使用代理,更新IP。
- 使用cookie登陸。
- 驗證碼識別。
使用代理和使用cookie登陸之前已經講過,下面講一下驗證碼識別。
可以利用開源的Tesseract-OCR系統進行驗證碼圖片的下載及識別,將識別的字元傳到爬蟲系統進行模擬登陸。當然也可以將驗證碼圖片上傳到打碼平台上進行識別。如果不成功,可以再次更新驗證碼識別,直到成功為止。
參考項目:驗證碼識別項目第一版:Captcha1
爬取有兩個需要注意的問題:
- 如何監控一系列網站的更新情況,也就是說,如何進行增量式爬取?
- 對於海量數據,如何實現分散式爬取?
分析
抓取之後就是對抓取的內容進行分析,你需要什麼內容,就從中提煉出相關的內容來。
常見的分析工具有正則表達式,BeautifulSoup,lxml等等。
存儲
分析出我們需要的內容之後,接下來就是存儲了。
我們可以選擇存入文本文件,也可以選擇存入MySQL或MongoDB資料庫等。
存儲有兩個需要注意的問題:
- 如何進行網頁去重?
- 內容以什麼形式存儲?
Scrapy
Scrapy是一個基於Twisted的開源的Python爬蟲框架,在工業中應用非常廣泛。
相關內容可以參考基於Scrapy網路爬蟲的搭建,同時給出這篇文章介紹的微信搜索爬取的項目代碼,給大家作為學習參考。
參考項目:使用Scrapy或Requests遞歸抓取微信搜索結果
我自學 Python 爬蟲,到這個月出書《Python 網路爬蟲:從入門到實踐》(機械工業出版社出版),一共也就過去兩年。這兩年自學的過程,走過了無數的坑,多虧了各位大神無私地回答我的問題,我想我是有資格幫你解決零基礎學爬蟲技術的。
作為零基礎的你,我想你可能是想解決工作中的一個實際問題,或者僅僅是很想學習一下爬蟲的技術,多一技之長。其實我準備開始學 Python 爬蟲的時候也是一樣,老闆派了任務,暫時沒有人會爬蟲,我只有自學頂硬上。因此,我可以用思維圖給你理清楚,你應該幹什麼。
我零基礎但我想學網路爬蟲:
路徑1:我不想寫代碼,那上面的回答已經列舉了很多,Excel/八爪魚,用這些工具的好處是你可以很快上手,但是只能爬一些簡單的網站,一旦網站出現限制,這些方法就是個玩具。因此,想弄點數據玩玩,玩這些玩具就好。
路徑2:我可以學寫代碼,但是會不會很難啊?我以我的經驗告訴你,找一個好的老師比自我胡思亂想,自我設限好得多。寫代碼這個事不難學,這也是為什麼市面上有那麼多代碼速成的教學。這也是為什麼我有些同學1年轉專業進 Google 的事情發生。
這裡給你描畫一下你的學習之路:
- 學會 Python 的基本代碼: 假如你沒有任何編程基礎,時間可能花1-2周,每天3小時。假設你有編程基礎(VBA 也算吧),1小時。
- 理解爬蟲原理:5分鐘。為什麼這麼重要?我自認為學一個東西就像建大樓,先弄清楚大框架,然後再從地基學起。很多時候我們的學習是,還沒弄懂大框架,就直接看網上的碎片化的教學,或者是跟著網上教學一章一章學,很容易學了芝麻丟了西瓜。我的自學就在這上面走了很多彎路。請參見:【爬蟲二】爬蟲的框架和基本議題
- 應用爬蟲原理做一個簡單爬蟲:30分鐘。請參見:5分鐘入門網路爬蟲 - 原來可以這麼簡單易懂
- 先吃透獲取網頁:就是給一個網址發個請求,那麼該網址會返回整個網頁的數據。類似:你在瀏覽器鍵入網址,回車,然後你就看到了網站的整個頁面。
- 再吃透解析網頁:就是從整個網頁的數據中提取你想要的數據。類似:你在瀏覽器中看到網站的整個頁面,但是你想找到產品的價格,價格就是你想要的數據。
- 再學會儲存數據:存儲很簡單,就是把數據存下來。
學會這些之後,你可以出去和別人說,我會 Python 爬蟲,我想也沒有人質疑你了。那麼學完這一套下來,你的時間成本是多少呢?如果你有編程基礎的話,1周吧。
所以,你是想當爬蟲做個玩具玩玩,還是掌握一門實戰利器。我覺得你可以自己衡量一下。
其實我已經把我這幾年的心得,遇到的坑都濃縮在這本書里,希望大家的學習之路上少走點坑。
想系統學習 Python,對上面六步感興趣的可以讀:如何有系統地學習Python爬蟲?
貼個鏈接,希望大家支持:
京東:《Python網路爬蟲從入門到實踐》(唐松,陳智銓)【摘要 書評 試讀】- 京東圖書
噹噹:《Python網路爬蟲從入門到實踐》(唐松 陳智銓)【簡介_書評_在線閱讀】 - 噹噹圖書
看了前面幾個答案,確實很驚艷,用Google Sheet或Excel就可以立即抓取網頁數據。
但遇到複雜情況,這些方法那會捉襟見肘。
比如:
1、數據量很大,需要常時間運行怎麼辦?Excel是否會耗盡內存卡死。
2、如果目標網站有防採集措施,你的IP被封掉怎麼辦?
3、如果目標網站必須登錄才能看到數據,該怎麼採集?
4、頁面模板非常多,Xpath規則都不一樣怎麼辦?
...
所以入門找到感覺後,還是要學一些基礎編輯知識的。
為了解決以上複雜問題,必須掌握的知識:
1、正則表達式
20分鐘學會一門實用「技術」,互聯網人裝逼炫技必備 - 知乎專欄
https://zhuanlan.zhihu.com/p/21852736
2、HTML知識+某種編程語言
HTML知識非常簡單,隨便看看w3c school教程就可以。
編程語言看到大家多數都推薦Python,這是一個選擇,而且在機器學習火了以後,適用面很廣。
Python下也有很多優秀採集框架。
但Python2、3語法有差異,組件和環境配置坑不少,對新手也不算特別友好。
我也嘗試過Nodejs和Python採集,但是後來發現還是PHP順手些。
2行PHP代碼下載4萬張美女圖,讓你看到吐~(宅男福利) - 知乎專欄
https://zhuanlan.zhihu.com/p/24739910
如果用PHP,推薦使用PHPspider採集框架,只需要寫一個規則文件,程序可以自己運行。
採集規則文件是純文本格式,非常適合共享。
目前網友共享了糗事百科、馬蜂窩旅遊、豆瓣讀書、京東商城等非常多知名網站的數據採集規則,觸手可得,方便新手學習借鑒。
採集框架下載地址:
《我用爬蟲一天時間「偷了」知乎一百萬用戶,只為證明PHP是世界上最好的語言 》所使用的程序
https://github.com/owner888/phpspider
其他問題的解決方案:
1、如果採集站封IP嚴重,推薦使用動態代理IP服務,國內阿布雲做的不錯,他們有海量IP,每採集一個頁面都可以換IP,介面支持多種編程語言,但價格不低。
2、如果需要模擬瀏覽器訪問才可以採集的話,需要用 PhantomJS 等無界面瀏覽器。
最後,如果實在懶得學編程,可以使用大名鼎鼎的火車頭採集軟體,只需要懂些HTML語法就可以輕鬆上手。
佔個坑。
不用學!剛剛發現的神器,不寫代碼智能爬蟲!地址:造數 - 新一代智能雲爬蟲
-------- 7天PYTHON爬蟲學習路線-
------python 基礎是學習python爬蟲不可少的ABC,爬蟲簡單的理解,就是通過程序模擬人操作網路發送請求,獲取數據返回,清洗,篩選,整理出有用的數據,結構化保存數據,方便數據的瀏覽,計算,可視化,最終實現數字的描述型價值與預測型價值
------基礎篇:----------
---基礎庫urllib,urlllib2,通過 openurl("url") 發送請求,接受返回數據。注意大部分網會對url請求做安全驗證
---畢竟安全第一,生產第二,驗證方法複雜多樣[防盜鏈,cookie,登錄驗證,各種密鑰,動態token],這正是數據爬蟲的難度所在,也是爬蟲工作者存在的價值。通過各種驗證順利完成請求,後面python正則分分鐘,格式化出你想要的數據。
------進階篇:----------
---取長補短,善假於物------------學習Requests庫,主要是簡化請求工作
---Beautiful Soup取代枯燥易錯的正則表達式,簡化數據匹配,快速清洗
---Xpath語法lxml主要了解文檔結構,知己知彼,好下手
---PhantomJS 處理網頁中的動態js請求,模擬瀏覽器完成js的渲染,等到非同步情節,保證文檔結構數據的完整性,所見即所得
---Selenium 模擬瀏覽事件,支持多步連續請求,減少人工手動觸發[登錄表單填寫,觸發表單發送,調整登錄成功頁等]
---pyQuery顧名思義,用python語言複製一版jquery,做前端的小夥伴都懂
------高級篇:----------
---就是學會用框架,能站在巨人肩膀上的人,能力往往都會會太差,推薦學習PySpider,體驗後真的很贊
大家提了很多小白都能用的黑科技,特別好,但適用的範圍,需要打一個問號。說說怎麼入門Python爬蟲吧,編程是雖然難度,但零基礎也有零基礎的技巧,快速掌握之後,可以解決很多網站的問題。
其實就是一個套路:Requests+Xpath,很多網站都可以用這個辦法來爬取,下面通過一個具體的例子來講解如何操作。
當然在寫代碼之前你需要搭建Python的環境,建議Python3,IDE小白推薦jupyter,百度一下安裝方式就好,下面的案例也在jupyter中演示。你首先需要安裝兩個包:requests和lxml,在終端分別輸入以下兩行代碼就好:
pip install requests
pip install lxml
比如你想來爬一爬小豬的租房信息(小豬短租有很多優質的房源)。
首先看怎麼把這個標題爬下來。
1.首先導入我們需要的的兩個模塊
from lxml import etree
import requests
Python中導入庫直接用」import+庫名「,需要用庫里的某種方法用」from+庫名+import+方法名「。這裡我們需要requests來下載網頁,用lxml.etree來解析網頁。
2.然後我們要把我們爬取的網頁下載下來
url = "http://cd.xiaozhu.com/"
data = requests.get(url).text
s=etree.HTML(data)
給定 url 並用 requests.get() 方法來獲取頁面的text,用 etree.HTML() 來解析下載的頁面數據「data」。
3.接著是最重要的部分,獲取元素的xpath信息並獲得文本
file=s.xpath("複製的xpath信息/text()")
這樣我們就把標題的xpath信息複製下來了
//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span
放到代碼中並列印信息:
file=s.xpath("//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span/text()")
print(file)
這樣我們爬取標題的過程就完成了,下面的完整的代碼:
from lxml import etree
import requests
url = "http://cd.xiaozhu.com/"
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath("//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span/text()")
print(file)
在jupyter中運行結果如下:
很簡單吧,這都只是套路而已,這裡只獲取了一個標題信息,那如果我想獲取這一個網頁所有房屋的標題信息呢?那就多複製幾個xpath吧:
//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[2]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[3]/div[2]/div/a/span
……………………
你會發現除了&
爬到所有的標題之後,我們需要一個個列印出來,所以後面寫了一個循環,逐條列印,代碼如下:
from lxml import etree
import requests
url = "http://cd.xiaozhu.com/"
data = requests.get(url).text
s=etree.HTML(data)
#注意更改了xpath信息
file=s.xpath("//*[@id="page_list"]/ul/li/div[2]/div/a/span/text()")
for i in file:
print(i)
就這麼簡單,列印結果如下:
但是,我們不會只爬一個元素啊,多個元素怎麼辦呢?比如除了標題,我們還想知道出租的房屋的價格,那麼你肯定會想到,複製價格的xpath就好了呀!恭喜你,已經懂得套路了。
價格的xpath信息如下:
//*[@id="page_list"]/ul/li[1]/div[2]/span[1]/i
要爬取多個價格信息的話,同樣去掉序號:
//*[@id="page_list"]/ul/li/div[2]/span[1]/i
然後在上面標題後面加入獲取價格的代碼:
from lxml import etree
import requests
url = "http://cd.xiaozhu.com/"
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath("//*[@id="page_list"]/ul/li/div[2]/div/a/span/text()")
sale=s.xpath("//*[@id="page_list"]/ul/li/div[2]/span[1]/i/text()")
for i in range(24):
title=file[i]
price=sale[i]
print("{} {}
".format(title,price))
這裡解釋一下最後的循環,因為我們想按每條信息是「標題+價格」這樣的形式放在一起,所以我們每次列印一個標題、一個價格,一個頁面有24個房屋信息,循環24次。
「{}{}」.format(title,price) 表示設置兩個變數,分別傳入title、price 的值。
列印結果如下(未截完,總共24條):
當然每行數據你要爬3個、4個或者更多的元素就以此類推就好了。
我當然知道你肯定不想只爬一頁的信息,多個頁面怎麼辦呢?也很簡單啊,我們會發現翻頁時url是在變化的:
http://cd.xiaozhu.com/search-duanzufang-p2-0/
http://cd.xiaozhu.com/search-duanzufang-p3-0/
http://cd.xiaozhu.com/search-duanzufang-p4-0/
………………
你看,url只有p後面的序號在隨著頁面變化,那我只要不斷更新頁面就好了。如何讓頁面不斷變化呢?於是你又想到了循環賦值,我們這比如要爬取10個頁面:
for a in range(1,11):
url = "http://cd.xiaozhu.com/search-duanzufang-p{}-0/".formate(a)
把p後面的序號定位變數,用format把1到10之間的數循環賦值,這樣就得到10個頁面的url信息了,把這個循環加進去,完整代碼如下:
from lxml import etree
import requests
for a in range(1,11):
url = "http://cd.xiaozhu.com/search-duanzufang-p{}-0/".format(a)
data = requests.get(url).text
s=etree.HTML(data)
file=s.xpath("//*[@id="page_list"]/ul/li/div[2]/div/a/span/text()")
sale=s.xpath("//*[@id="page_list"]/ul/li/div[2]/span[1]/i/text()")
for i in range(24):
title=file[i]
price=sale[i]
print("{} {}
".format(title,price))
列印結果如下(未截完):
好了,更多的頁面,相信你也沒有問題了。到這裡,Python爬蟲你已經入門了,所謂入門,就是你具備了進行基本實踐的能力,後續你可以通過爬取更多的網頁,發現更多的不足,掌握更多的技能。比如動態載入的頁面如何爬取,如何設置userAgent信息,如何使用代理繞過限制……
但是,掌握requests+xpath,你已經可以玩一段時間了,入門真的就這麼簡單。你以為要系統學習Python?啃很久的書可能就從入門到放棄了;你以為要系統地學習HTML、CSS?那樣就入了前端的坑了。像爬蟲這種知識點混雜、分支較多的技能,直接上手實踐效率最高。
ps:爬蟲盡量遵守 robot 協議,畢竟你都從人家那拿了數據,就不要給人家網站帶來過大的負擔了,爬一頁休息幾秒暫時並不會耽誤你多少時間。
如果你對爬取大規模的數據感興趣,也可以參考我們全實戰的課程:Python爬蟲:入門+進階
你們難道真不怕題主是反爬大隊的?
推薦閱讀: