你是如何開始能寫 Python 爬蟲?
看完了簡明教程和笨辦法學python,想寫爬蟲,無從做起,需要繼續看什麼書和練習
這得從年輕時候說起。
我有一群饑渴的室友(嗯,就是室友,不是自己),由於那時候年輕,不知道 1024 這等網站的存在,等上的小黃片網站大多經常更換網址 + 滿屏廣告,體驗很是不好。有一天,一個室友抱怨說:哎……要是小黃文、小黃圖、小黃片都自動進我硬碟就好咯!
說者無意,聽者有心。於是乎,我開始入了爬蟲的坑。
那種羞羞的小網站算是非常好抓的,儘管網址各不相同,但是大多是從同一個模板生成的,而且根本就沒有反爬策略。所以,一套代碼就足以應對很多網站了。在經過一個下午的努力之後,室友的願望實現了,那些讓人營養跟不上的內容,很快塞滿了他的硬碟。記得當時是寫了一篇博客介紹,不過幾次遷移博客,那篇文章已經找不到了。
後來,我不滿足於抓定向小網站的內容,開始嘗試新的思路。從一個網址出發,廣度優先遍歷,不再指定具體規則和解析策略,而是從 HTML 中正則匹配 ed2k 鏈接。後來嘛,程序自動下載的 ed2k 鏈接足夠室友這輩子營養不良。
然後找了第一份工作,開始從寫爬蟲玩,變成了寫爬蟲養活自己。開始寫各種比較大規模的爬蟲,對非常大量的數據做抓取,以及有機會使用大量機器做抓取,當然,工作內容,不細表。雖不細聊,但是這段經歷可以算是對我寫爬蟲技能長進幫助最多的了。
再後來,抓過知乎用戶數據,當時寫了一篇文章《一個知乎重度用戶眼中的知乎》那時候的一百萬知乎用戶和現在的一百萬知乎用戶,所佔的比例應該是非常不一樣的。還順手做過一個小網站,聚合知乎用戶的信息,提供簡單的檢索功能,大概是這樣:
然後看到知乎站內如此多爆照釣魚問題,就寫了一個程序,根據問題下各回答的文本密度和圖片數量,以及回答下的評論內容等信息,自動判斷釣魚回答並抓取,效果還挺好。就註冊了一個域名 「zhihu.photo」,又做了一個聚合小站(已經下線,由於知乎已經改版,代碼你只能 star,並用不上:GitHub):
說起來寫爬蟲,我對知乎絕對算得上是真愛了。針對知乎寫了好多不同種類的爬蟲,還很情懷地(當然也是為了防止被反爬蟲命中)故意放慢了爬蟲速度,希望不對知乎伺服器造成任何壓力。來知乎工作後才知道,我寫爬蟲那個年代,知乎還沒有反爬蟲系統。知乎的第一版反爬蟲系統,就是我寫的,我還給它取了個很中二的名字。
再後來就針對最最沒有基礎的同學寫了幾篇博客,據我得到的反饋,至少有一個朋友看我博客受到了一點點啟發:
- 爬蟲必備——requests
- Web Crawler with Python - 01. 準備
- Web Crawler with Python - 02. 簡單的嘗試
- 番外篇. 搭建稱手的Python開發環境
- Web Crawler with Python - 03. 豆瓣電影 TOP250
- Web Crawler with Python - 04. 另一種抓取方式
- Web Crawler with Python - 05. 存儲
- Web Crawler with Python - 06. 海量數據的抓取策略
- Web Crawler with Python - 07. 反爬機制&<1&>
- Web Crawler with Python - 08. 模擬登錄
- Web Crawler with Python - 09. 通過爬蟲找出我和輪子哥之間的最短關注鏈
最後的一點體會是,很多情況下,爬蟲程序對個人的提升比較有限,各位差不多就得了,同樣的時間,有更多收益更大、更值得做的事情。
看了大部分回答不禁嘆口氣,主要是因為看到很多大牛在回答像「如何入門爬蟲」這種問題的時候,一如當年學霸講解題目,跳步無數,然後留下一句「不就是這樣推嘛」,讓一眾小白菜鳥一臉懵逼。。作為一個0起步(之前連python都不會),目前總算掌握基礎,開始向上進階的菜鳥,深知其中的不易,所以我會在這個回答里,儘可能全面、細節地分享給大家從0學習爬蟲的各種步驟,如果對你有幫助,請點贊~
-------------------------------------------------------------------------------------------------
#我要寫爬蟲!
#Ver.1.2
#Based on: Python 2.7
#Author:高野良
#原創內容,轉載請註明出處
首先!你要對爬蟲有個明確的認識,這裡引用毛主席的思想:
在戰略上藐視:
- 「所有網站皆可爬」:互聯網的內容都是人寫出來的,而且都是偷懶寫出來的(不會第一頁是a,下一頁是8),所以肯定有規律,這就給人有了爬取的可能,可以說,天下沒有不能爬的網站
- 「框架不變」:網站不同,但是原理都類似,大部分爬蟲都是從 發送請求——獲得頁面——解析頁面——下載內容——儲存內容 這樣的流程來進行,只是用的工具不同
在戰術上重視:
- 持之以恆,戒驕戒躁:對於初學入門,不可輕易自滿,以為爬了一點內容就什麼都會爬了,爬蟲雖然是比較簡單的技術,但是往深學也是沒有止境的(比如搜索引擎等)!只有不斷嘗試,刻苦鑽研才是王道!(為何有種小學作文即視感)
||
||
V
我要爬整個豆瓣!...
我要爬整個草榴社區!
我要爬知乎各種妹子的聯繫方式*^#%^$#
||
||
V
吼啊!——OK,開始歡快地學習爬蟲吧 !
不吼?你還需要學習一個!趕緊回去看廖雪峰老師的教程,
2.7的。至少這些功能和語法你要有基本的掌握 :
- list,dict:用來序列化你爬的東西
- 切片:用來對爬取的內容進行分割,生成
- 條件判斷(if等):用來解決爬蟲過程中哪些要哪些不要的問題
- 循環和迭代(for while ):用來循環,重複爬蟲動作
- 文件讀寫操作:用來讀取參數、保存爬下來的內容等
||
||
V
然後,你需要補充一下下面幾個內容,作為你的知識儲備:
(註:這裡並非要求「掌握」,下面講的兩點,只需要先了解,然後通過具體項目來不斷實踐,直到熟練掌握)
基本的HTML語言知識(知道href等大學計算機一級內容即可)
理解網站的發包和收包的概念(POST GET)
稍微一點點的js知識,用於理解動態網頁(當然如果本身就懂當然更好啦)
2、一些分析語言,為接下來解析網頁內容做準備
NO.1 正則表達式:扛把子技術,總得會最基礎的:
NO.2 XPATH:高效的分析語言,表達清晰簡單,掌握了以後基本可以不用正則
參考:XPath 教程NO.3 Beautifulsoup:
美麗湯模塊解析網頁神器,一款神器,如果不用一些爬蟲框架(如後文講到的scrapy),配合request,urllib等模塊(後面會詳細講),可以編寫各種小巧精幹的爬蟲腳本
官網文檔:Beautiful Soup 4.2.0 文檔
參考案例:
||
||
V
接著,你需要一些高效的工具來輔助
(同樣,這裡先了解,到具體的項目的時候,再熟悉運用)
NO.1 F12 開發者工具:
- 看源代碼:快速定位元素
- 分析xpath:1、此處建議谷歌系瀏覽器,可以在源碼界面直接右鍵看
NO.2 抓包工具:
- 推薦httpfox,火狐瀏覽器下的插件,比谷歌火狐系自帶的F12工具都要好,可以方便查看網站收包發包的信息
NO.3 XPATH CHECKER (火狐插件):
非常不錯的xpath測試工具,但是有幾個坑,都是個人踩過的,,在此告誡大家:
1、xpath checker生成的是絕對路徑,遇到一些動態生成的圖標(常見的有列表翻頁按鈕等),飄忽不定的絕對路徑很有可能造成錯誤,所以這裡建議在真正分析的時候,只是作為參考
2、記得把如下圖xpath框里的「x:」去掉,貌似這個是早期版本xpath的語法,目前已經和一些模塊不兼容(比如scrapy),還是刪去避免報錯NO.4 正則表達測試工具:
在線正則表達式測試 ,拿來多練練手,也輔助分析!裡面有很多現成的正則表達式可以用,也可以進行參考!
||
||
V
ok!這些你都基本有一些了解了,現在開始進入抓取時間,上各種模塊吧!python的火,很大原因就是各種好用的模塊,這些模塊是居家旅行爬網站常備的——
urllib
urllib2
requests
||
||
V
不想重複造輪子,有沒有現成的框架?
華麗麗的scrapy(這塊我會重點講,我的最愛)
||
||
V
遇到動態頁面怎麼辦?
selenium(會了這個配合scrapy無往不利,是居家旅行爬網站又一神器,下一版更新的時候會著重安利,因為這塊貌似目前網上的教程還很少)
phantomJS(不顯示網頁的selenium)
||
||
V
遇到反爬蟲策略驗證碼之類咋整?(不想折騰的直接第四個)
PIL
opencv
pybrain
打碼平台
||
||
V
mysql
mongodb
sqllite
||
||
V
爬來的東西怎麼用?
numpy 數據分析,類似matlab的模塊
pandas(基於numpy的數據分析模塊,相信我,如果你不是專門搞TB級數據的,這個就夠了)
||
||
V
進階技術
多線程、分散式
———————————— 亂入的分割線 —————————————
然後學習編程關鍵的是學以致用,天天捧一本書看不如直接上手操練,下面我通過實際的例子來講解爬蟲——
比如最近,樓主在豆瓣上認識了一個很可愛的妹子,發現她一直會更新簽名和日誌,所以沒事就會去她主頁看看,但一直沒有互相加好友(作為一隻高冷的天蠍,怎麼可以輕易加好友嘛!而且加了好友,你更新什麼都會收到推送,那多沒意思啊!一點神秘感都沒有了!),可還是想及時獲得妹子的最新動態,怎麼辦?
於是我就寫了個70幾行的python腳本,包含爬蟲+郵件模塊,跑在家裡的一台閑置筆記本上,通過計劃任務每準點抓取妹子的簽名和最新文章一次,發送到我的郵箱。。嗯,其實是很簡單的技術,,代碼如下所示:
#-*-coding:utf-8-*- #編碼聲明,不要忘記!
import requests #這裡使用requests,小腳本用它最合適!
from lxml import html #這裡我們用lxml,也就是xpath的方法
#豆瓣模擬登錄,最簡單的是cookie,會這個方法,80%的登錄網站可以搞定
cookie = {}
raw_cookies = ""#引號裡面是你的cookie,用之前講的抓包工具來獲得
for line in raw_cookies.split(";"):
key,value = line.split("=", 1)
cookie[key] = value #一些格式化操作,用來裝載cookies
#重點來了!用requests,裝載cookies,請求網站
page = requests.get("#妹紙的豆瓣主頁#",cookies=cookie)
#對獲取到的page格式化操作,方便後面用XPath來解析
tree = html.fromstring(page.text)
#XPath解析,獲得你要的文欄位落!
intro_raw = tree.xpath("//span[@id="intro_display"]/text()")
#簡單的轉碼工作,這步根據需要可以省略
for i in intro_raw:
intro = i.encode("utf-8")
print intro #妹子的簽名就顯示在屏幕上啦
#接下來就是裝載郵件模塊,因為與本問題關聯不大就不贅述啦~
怎麼樣~是不是很簡單~
V1.2更新日誌:
修改了一些細節和內容順序
說說我的經歷吧
我最早是爬蝦米,想看看蝦米聽的比較多的歌是哪些,就爬了蝦米全站的歌曲播放數,做了個統計
Python爬蟲學習記錄(1)——Xiami全站播放數
統計過豆瓣動漫的評分分布
豆瓣2100部動漫頁面的網頁源碼(包括評分,導演,類型,簡介等信息,附抓取代碼)
爬百度歌詞,做LDA
Python爬蟲學習記錄(2)——LDA處理歌詞
百度音樂帶標籤,作曲,演唱者,類別的歌詞數據
爬足彩網站所有盤口,找贏錢演算法
Python爬蟲學習記錄(4)——傳說中的足彩倍投法。。好像也不是那麼靠譜
2011~2013.5全球所有足球比賽比分數據以及足彩各公司盤口
初期不需要登錄的網站比較簡單,掌握http get post和urllib怎麼模擬,掌握lxml、BeautifulSoup等parser庫就可以了,多用firefox的firebug或者chrome的調試工具看瀏覽器是怎麼發包的。上面都是不需要登錄不需要下文件就可以做到的。
之後你可能想要下載文件(圖片,音樂,視頻等),這個可以試試爬蝦米歌曲
Python爬蟲學習記錄(3)——用Python獲取蝦米加心歌曲,並獲取MP3下載地址
爬wallbase壁紙
最近做了個avfun的視頻排行,每天定時抓幾次acfun,然後下載視頻到伺服器緩存。
Python爬蟲學習記錄(5)——python mongodb + 爬蟲 + web.py 的acfun視頻排行榜
202.120.39.152:8888
然後你可能需要模擬用戶登錄,爬取需要登錄的網站(比如人人,新浪微博)。如果只是小規模爬蟲建議用瀏覽器cookie模擬登錄
Python爬蟲學習記錄(0)——Python 爬蟲抓站 記錄(蝦米,百度,豆瓣,新浪微博)
===========================
想說的是,不要為了學而學,可以看看有什麼以前覺著很麻煩的操作,是不是能用爬蟲簡化。爬下來的數據是不是有排序篩選分析的價值。
Python入門網路爬蟲之精華版
Python學習網路爬蟲主要分3個大的版塊:抓取,分析,存儲
另外,比較常用的爬蟲框架Scrapy,這裡最後也詳細介紹一下。
首先列舉一下本人總結的相關文章,這些覆蓋了入門網路爬蟲需要的基本概念和技巧:寧哥的小站-網路爬蟲
當我們在瀏覽器中輸入一個url後回車,後台會發生什麼?比如說你輸入寧哥的小站專註數據挖掘、機器學習方向。,你就會看到寧哥的小站首頁。
簡單來說這段過程發生了以下四個步驟:
- 查找域名對應的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爬蟲風氣已經被某些人搞臭了。所以既然動筆,就希望能夠寫一篇走心的回答。
我最開始能寫爬蟲,那是在去年的3月,在我從coursera剛學完一套python課程之後。(具體可見知乎用戶:coursera上有哪些值得學習的Python,數據分析的課程?)
在課程結束後,為了證明自己已經學會python,同時也驚訝於世間還有爬蟲這種神奇的技能。我就從網上隨便copy了份代碼,爬蟲屆起手式:爬取豆瓣top250(那年頭好像大家學爬蟲的第一個網站都是豆瓣,類似於「hello world」一樣?),結果python2的編碼把我整的苦不堪言。好在遇見了我的計量老師,在他的幫助下,我總算是成功運行了人生的第一個爬蟲腳本。並且還發了朋友圈,哈,裝了逼,感覺自己距離成為python大神只差一步之遙了呢。
後來,在向朋友圈的各位證明了自己「學會」python之後,我那一年也沒有寫過爬蟲…雖然主要的原因是我在準備考研。
再次寫爬蟲,是考研結束後,因為畢業論文需要數據,於是在寒假的時候,又重新操起了python,東湊西湊了一周,把數據爬下了,不過當時我仍然不懂什麼是HTTP請求,連BS也是用的稀里糊塗。等拿到數據之後,我又馬上發了一條朋友圈,覺得自己雖然一年沒寫python沒寫爬蟲,但是功底還是在的,再告知朋友圈的各位之後我就滿心歡喜的去跑模型了。
如果說第一次寫爬蟲,是在copy了代碼,老師的幫助下完成的,那麼第二次爬畢業論文數據應該才算是我能寫爬蟲的開始。不過,你可能會好奇,當時我那麼菜,為什麼沒有想繼續學習爬蟲,真正搞懂爬蟲的原理,或者跑去知乎上提問「python爬蟲如何進階」之類的問題。
其實我還是一個挺好學的人,沒有這樣做的原因是:
- 我要的數據已經拿到了
- 我「覺得」自己已經學會python爬蟲了
- 我還有很多事要做,很多其他的東西要學
更重要的是,我後來想明白了,對於爬蟲這個東西,沒有目的性的學習,單純只是為了臨時爬數據,又或為了發個朋友圈,是很難有熱情支撐起對爬蟲的深入學習和進階的。就像是知乎上python爬蟲入門的文章這麼多,又有多少人在看完這些入門的文章後真正能堅持對爬蟲,python的學習呢?還是像我之前一樣,在第一個爬蟲程序運行成功後,發個朋友圈,就覺得自己已經學會爬蟲了。
巧的是,好像是為了給我一個真正學習爬蟲的機會,在剛入職後,由於要做產品的輿情分析,數據需要自己去爬,我又開始寫爬蟲了。不過這次就沒那麼水了,雖然當時我使用python主要是用來做數據分析(知乎用戶:如何處理 Python 入門難以進步的現象?)。
雖然我寫了兩次爬蟲,但我知道我真的是爬蟲小白= =。中間學習的過程就不在這裡講了,不是這個回答的重點。心路歷程可以參考:杜洛瓦:Python 爬蟲進階?
從爬百度貼吧開始,發了第一版輿情分析之後,老闆表示滿意,並鼓勵我爬取的範圍可以再廣闊一點。於是我又轉戰論壇,新浪微博。速度太慢,上多線程;需要登錄,用cookie;beautifulsoup太慢,用xpath;動態頁面,抓包提交表單或者selenium2+phantomjs;需要存儲,上pymysql....就像是一個升級打怪的過程,可以說在工作壓力的push下,我越學習爬蟲,越覺得爬蟲涉及的知識面很廣。
其實這個回答主要是想總結一下自己在接觸爬蟲的這一年多時間裡的諸多感觸。如果說要講乾貨的話,知乎上的優秀回答,大神也很多,我就不做重複無意義的事了。只是希望大家在最開始學習python爬蟲的時候能問自己幾個問題:
- 我為什麼要學習爬蟲?
- 我想要把爬蟲學到什麼程度?
- 爬蟲對我的學習,工作有什麼幫助?
最後,我們要明白爬蟲只是一種獲取數據的手段,分析好這些數據才能發揮爬蟲真正的價值。
完。
最開始時候,因為自己用ubuntu,想查單詞上網頁查找太費勁,就用python的urllib寫了一個終端下查字典的腳本,非常方便,也非常開心~之後,我在學校的bbs里寫了一個自動正則過濾帖子並發貼的代碼,用的python3的urllib模塊,開始就是為了好玩~現在更新了好幾個版本,版里的盆友們玩的也非常開心~哈哈~主要就是興趣,覺的好玩,那就搞起,不論神馬方法,條條鐵路通北京,必然能成~
剛開始只是簡單的看了下 Python, 簡單的寫些小程序,小工具之類的,感受到了它的簡潔與強大。
突然就想寫個爬蟲試試,那就爬我最喜歡的音樂網站落網,爬了從第一期到到現在的所有音樂,包括每期的圖片。還另外寫了一個自動下載當前最新一期的所有歌曲的腳本。還試著用工具 PyInstaller 打包成了 exe,分享給了我幾個同樣喜歡落網的朋友。↓這是我爬的成果。
關於如何學,我只是個新手,談不上指導,就說說我自己怎麼做的吧:
- 首先基本的 Python 語法你要了解吧,推薦一本書《Python基礎教程》,很適合入門。
- 其次分析你的爬蟲需求。程序具體流程是怎麼樣的?把程序的大致框架搭起來。另外可能還有哪些難點?
- 然後了解一下一般寫爬蟲需要用哪些庫,這些庫可以很好的幫助你解決很多問題。推薦強悍的 Requests: HTTP for Humans 另外還有其他一些庫 如 urllib2 BeautifulSoup 都可以了解下。
- 動手開始寫了,遇到問題 Google 即可,Google 不行就上知乎問,我遇到的一個問題就是知乎私信大牛解決的。在寫的過程中還會學到很多相關的知識,比如說HTTP協議, 多線程 等等。
或者你也可以直接用別人的框架,如其它人提到的 Scrapy,不用重複造輪子。
我先會用 Node.js 寫爬蟲,當我翻譯成 Python 的時候,也就會用 Python 爬蟲了。
在我會寫爬蟲的時候,我掌握了這幾個技能:
- HTTP 協議
- Socket
- HTML(實際上 CSS 和 JavaScript 我更加熟悉,但是最初寫爬蟲的時候用得少)
- 解析 HTML
順便對整個流程非常熟悉,也就是使用 Socket API 發送 HTTP 請求,得到了 HTTP 響應,這個響應是一個字元串 / Buffer,解析這個字元串 / Buffer 得到我需要的內容。
當然這個是背後的原理,如果只是想快速寫一個爬蟲,那麼自然有更加輕鬆的選擇
比如使用 Requests: HTTP for Humans 庫來發送網路請求,這樣就不需要自己用原始的 Socket 來封裝函數了,而且 HTTP 請求中的 headers、body 處理也更加方便。
比如使用 pyquery: a jquery-like library for python 來解析 HTTP 響應,這樣就不用自己解析字元串或者先構造樹然後再解析了。
這兩步處理起來是比較輕鬆的,拿到數據之後的事情就看情況了。只是保存的話哪怕用純文本也是可以的,展示的話有很多圖表庫都可以選擇。
到這一步就可以寫出比較簡單的爬蟲了,後續想處理複雜爬蟲的時候會碰到各種各樣的問題,比如許可權驗證、動態渲染、反爬蟲機制等,這些在 Python網路數據採集 里都有提到,有需要的話翻一翻就可以。
順帶提一點,在學習過程中掌握原理之後,使用的工具越簡單越方便越好。也許有人說寫爬蟲就只是調用 API 而已,問題是 API 方便就應該調用啊。退一步講就算自己用 Socket 寫一個網路庫本身也費不了多少功夫,用一棵樹來解析 HTML 也費不了什麼功夫。
能節省時間就應該節省時間,所以應該使用 Requests + PyQuery 的方案,千萬不要使用 urllib、urllib2、Beautiful Soup、xPath、re 等
樓主看的書的確稍微有些不合適,基本上只學習了 Python 的語法,而沒有弄清楚做這件事情的流程,而流程反而是更加重要的,當然這方面看書就可以了。
想快速實現直接看 Python網路數據採集。
想紮實基礎看下面的
學習 HTTP 用 圖解HTTP
學習 HTML 和 CSS 用 Head First HTML與CSS(第2版)
學習 PyQuery 用 jQuery基礎教程 (第4版) (前半部分足夠)
一、前言
你是不是在為想收集數據而不知道如何收集而著急?
你是不是在為想學習爬蟲而找不到一個專門為小白寫的教程而煩惱?
Bingo! 你沒有看錯,這就是專門面向小白學習爬蟲而寫的!我會採用實例的方式,把每個部分都跟實際的例子結合起來幫助小夥伴兒們理解。最後再寫幾個實戰的例子。
我們使用Python來寫爬蟲,一方面因為Python是一個特別適合變成入門的語言,另一方面,Python也有很多爬蟲相關的工具包,能夠簡單快速的開發出我們的小爬蟲。
本系列採用Python3.5版本,畢竟2.7會慢慢退出歷史舞台~
那麼,接下來,你得知道什麼是爬蟲、爬蟲從哪裡爬取數據的,以及,學習爬蟲都要學習哪些東西。
新建了一個
python學習交流群,先是301在加上056還有051,在群里大家都是在相互交流分享,能夠得到很多不同的東西
二、什麼是爬蟲
來看看百度百科是如何定義的
網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
什麼?沒看懂?沒關係,我來給你解釋一下
打開一個網頁,裡面有網頁內容吧,想像一下,有個工具,可以把網頁上的內容獲取下來,存到你想要的地方,這個工具就是我們今天的主角:爬蟲。
這樣是不是更清晰了呢?
既然了解了爬蟲是什麼,那麼爬蟲是如何爬取數據的呢?
三、爬蟲是哪裡爬取數據的
打開瀏覽器(強烈建議谷歌瀏覽器),找到瀏覽器地址欄,然後在里敲http://music.163.com,你會看到網頁內容。
欸,圖片中間那倆人在幹嘛?(單身狗請主動防禦,這是誤傷,這真的是誤傷!)
滑鼠在頁面上點擊右鍵,然後點擊view page source。看到這些文字了嗎?這才是網頁最赤果果的樣子。
其實所有的網頁都是HTML代碼,只不過瀏覽器將這些代碼解析成了上面的網頁,我們的小爬蟲抓取的其實就是HTML代碼中的文本啦。
這不合理啊,難不成那些圖片也是文本?
恭喜你,答對了。回到瀏覽器中有圖的哪個tab頁,滑鼠右鍵,點擊Inspect。會彈出一個面板,點擊板左上角的箭頭,點擊虐狗圖片,你會看到下面有紅圈圈的地方,是圖片的網路地址。圖片可以通過該地址保存到本地哦。
你猜的沒錯,我們的小爬蟲抓取的正是網頁中的數據,你要知道你想要抓取什麼數據,你的目標網站是什麼,才可以把想法變成現實的哦。你不能說,我想要這個這個,還有這個,然後數據就自動來了。。。(是不是讓你想起了你的導師或老闆?)
四、學習爬蟲的必備知識
大家要先對以下內容有一定的了解再來學習爬蟲哦,磨刀不誤砍柴工
HTML
這個能夠幫助你了解網頁的結構,內容等。可以參考W3School的教程。
Python
如果有編程基礎的小夥伴兒,推薦看一個廖雪峰的Python教程就夠了
沒有編程基礎的小夥伴,推薦看看視頻教程(網易雲課堂搜Python),然後再結合廖雪峰的教程,雙管齊下。
其實知乎上總結的已經非常好了,我就不多嘮叨了。知乎-如何系統的自學Python
TCP/IP協議,HTTP協議
這些知識能夠讓你了解在網路請求和網路傳輸上的基本原理,了解就行,能夠幫助今後寫爬蟲的時候理解爬蟲的邏輯。
廖雪峰Python教程里也有簡單介紹,可以參考:TCP/IP簡介,HTTP協議
想更深入學習的小夥伴兒可以去網上多搜搜相關的書籍哦
一、前言
為什麼要先說Requests庫呢,因為這是個功能很強大的網路請求庫,可以實現跟瀏覽器一樣發送各種HTTP請求來獲取網站的數據。網路上的模塊、庫、包指的都是同一種東西,所以後文中可能會在不同地方使用不同稱謂,不要迷惑哦。
結合一個實例來講解吧。我的一個設計師小夥伴常去一些設計類網站收集素材,其中有個網站Unsplash裡面美圖特別多,所以想要把裡面的圖片都保存下來,這樣咱們的小爬蟲就登場了。說干就干,趕緊開始吧。
先來準備環境
二、運行環境
系統版本
我使用的是Windows10。
好多小夥伴使用的是Mac,配置上基本相同。由於我多年混跡於微軟的開發平台,經常使用Visual Studio、SQL Server啥的,用Windows用習慣了(其實主要是因為Qiong窮!)。所以這個教程我就以Windows系統為例了。
Python版本
我電腦裝了好多個Python版本(學一個裝一個。。。),不過推薦使用Anaconda這個科學計算版本,主要是因為它自帶一個包管理工具,可以解決有些包安裝錯誤的問題。去Anaconda官網,選擇Python3.5版本,然後下載安裝。
IDE
我使用的是PyCharm,是專門為Python開發的IDE。這是JetBrians的產品,點我下載。
三、requests 庫的安裝
使用Anaconda 版本的得小夥伴兒:用管理員許可權運行cmd命令窗口,然後輸入
conda install requests
看動圖:
直接使用Python3.5的小夥伴兒輸入這個命令:
pip install requests
如果你機器上存在多個Python版本,要給Python3.5的版本安裝requests庫,需要輸入以下命令:
py -3 -m pip install requests
好啦,requests庫安裝完畢,接下來我們會在實際例子中演示它的使用。想要深入了解requests模塊的小夥伴也可以仔細閱讀英文官方文檔,和中文官方文檔,如果用到該文沒有提到的功能,則查看文檔即可。
四、開工
首先我們打開PyCharm,需要選擇一下它的頁面主題。選擇你喜歡的風格,以及選擇使用的Python版本。然後打開一個你想要存放爬蟲的目錄,進入後長這樣。
我們再創建一個python文件,輸入第一行代碼來導入requests庫:
import requests #導入requests庫
然後用它來獲取咱們的目標網頁:
r = requests.get("Unsplash | Free High-Resolution Photos") #像目標url地址發送get請求,返回一個response對象
print(r.text) #r.text是http response的網頁HTML
在菜單欄點擊「Run」,選擇該文件(或者直接在窗口中點擊右鍵,運行該文件):
執行完之後,底部會出現輸出結果:
可以看到底部是獲取到的網頁內容。這就完成了爬蟲的第一步,獲取到了網頁的HTML內容。
怎麼樣,很簡單吧。
這只是用到了requests庫的get請求,還有其他的請求使用也與之類似。下面我們簡單介紹一下每個請求的用法。
五、requests庫的使用
因為有中文的官方文檔,我就不介紹所有的功能了,只把常用到的說一下,大家用到更多功能的時候再去翻官方文檔吧。
requests 庫就是用來發送各種請求的,所以,我們就來看看各種請求怎麼使用:
5.1 get 請求
r = requests.get("Unsplash | Free High-Resolution Photos")
這就是我們剛剛用到的。其實就是向網站發送了一個get請求,然後網站會返回一個response。r 就是response。大家可以在運行的時候查看r的type。
print(type(r))
get請求還可以傳遞參數:
payload = {"key1": "value1", "key2": "value2"}
r = requests.get("http://httpbin.org/get", params=payload)
上面代碼向伺服器發送的請求中包含了兩個參數key1和key2,以及兩個參數的值。實際上它構造成了如下網址:
http://httpbin.org/get?key1=value1key2=value2
5.2 POST請求
無參數的post請求:
r = requests.post("http://httpbin.org/post")
有參數的post請求:
payload = {"key1": "value1", "key2": "value2"}
r = requests.post("http://httpbin.org/post", data=payload)
post請求多用來提交表單數據,即填寫一堆輸入框,然後提交。
5.3 其他請求
其他一些請求例如put請求、delete請求、head請求、option請求等其實都是類似的。但是平時用的不多,就不仔細介紹了。有用到的可以去看官網文檔哦。閱讀官方文檔是必備技能!
----已分,太遺憾了----
男朋友常常會去好幾個人的微博留言點贊。為了及時掌握這些動態,於是學了爬蟲。動力無限大呀!
我是DataCastle的運營一枚,小名Alice。對爬蟲感興趣本是因為想爬取公眾號的相關信息為新媒體運營添磚加瓦,沒想到一入坑就不可收拾。
剛開始接觸爬蟲的時候,簡直驚為天人,十幾行代碼,就可以將無數網頁的信息全部獲取下來,自動選取網頁元素,自動整理成結構化的文件。
利用這些數據,可以做很多領域的分析、市場調研,獲得很多有價值的信息。這種技能不為我所用實在可惜,於是果斷開始學習。
1.並非開始都是最容易的
剛開始對爬蟲不是很了解,又沒有任何的計算機、編程基礎,確實有點懵逼。從哪裡開始,哪些是最開始應該學的,哪些應該等到有一定基礎之後再學,也沒個清晰的概念。
因為是 Python 爬蟲嘛,Python 就是必備的咯,那先從 Python 開始吧。於是看了一些教程和書籍,了解基本的數據結構,然後是列表、字典、元組,各種函數和控制語句(條件語句、循環語句)。
學了一段時間,才發現自己還沒接觸到真正的爬蟲呢,而且純理論學習很快就忘了,回去複習又太浪費時間,簡直不要太絕望。把 Python 的基礎知識過了一遍之後,我竟然還沒裝一個可以敲代碼的IDE,想想就哭笑不得。
2.開始直接上手
轉機出現在看過一篇爬蟲的技術文章後,清晰的思路和通俗易懂的語言讓我覺得,這才是我想學的爬蟲。於是決定先配一個環境,試試看爬蟲到底是怎麼玩的。(當然你可以理解為這是浮躁,但確實每個小白都想去做直觀、有反饋的事情)
因為怕出錯,裝了比較保險的 Anaconda,用自帶的 Jupyter Notebook 作為IDE來寫代碼。看到很多人說因為配置環境出各種BUG,簡直慶幸。很多時候打敗你的,並不是事情本身,說的就是爬蟲配置環境這事兒。
遇到的另一個問題是,Python 的爬蟲可以用很多包或者框架來實現,應該選哪一種呢?我的原則就是是簡單好用,寫的代碼少,對於一個小白來說,性能、效率什麼的,統統被我 pass 了。於是開始接觸 urllib、美麗湯(BeautifulSoup),因為聽別人說很簡單。
我上手的第一個案例是爬取豆瓣的電影,無數人都推薦把豆瓣作為新手上路的實例,因為頁面簡單且反爬蟲不嚴。照著一些爬取豆瓣電影的入門級例子開始看,從這些例子裡面,了解了一點點爬蟲的基本原理:下載頁面、解析頁面、定位並抽取數據。
當然並沒有去系統看 urllib 和 BeautifulSoup 了,我需要把眼前實例中的問題解決,比如下載、解析頁面,基本都是固定的語句,直接用就行,我就先不去學習原理了。
當然 BeautifulSoup 中的基本方法是不能忽略的,但也無非是 find、get_text() 之類,信息量很小。就這樣,通過別人的思路和自己查找美麗湯的用法,完成了豆瓣電影的基本信息爬取。
3.爬蟲漸入佳境
有了一些套路和形式,就會有目標,可以接著往下學了。還是豆瓣,自己去摸索爬取更多的信息,爬取多部電影,多個頁面。這個時候就發現基礎不足了,比如爬取多個元素、翻頁、處理多種情況等涉及的語句控制,又比如提取內容時涉及到的字元串、列表、字典的處理,還遠遠不夠。
再回去補充 Python 的基礎知識,就很有針對性,而且能馬上能用於解決問題,也就理解得更深刻。這樣直到把豆瓣的TOP250圖書和電影爬下來,基本算是了解了一個爬蟲的基本過程了。
BeautifulSoup 還算不錯,但需要花一些時間去了解一些網頁的基本知識,否則一些元素的定位和選取還是會頭疼。
後來認識到 xpath 之後相見恨晚,這才是入門必備利器啊,直接Chrome複製就可以了,指哪打哪。即便是要自己寫 xpath,以w3school上幾頁的 xpath 教程,一個小時也可以搞定了。requests 貌似也比 urllib 更好用,但摸索總歸是試錯的過程,試錯成本就是時間。
4.跟反爬蟲杠上了
通過 requests+xpath,我可以去爬取很多網站網站了,後來自己練習了小豬的租房信息和噹噹的圖書數據。爬拉勾的時候就發現問題了,首先是自己的請求根本不會返回信息,原來要將自己的爬蟲偽裝成瀏覽器,終於知道別人代碼中那一坨 headers 信息是幹啥的了 。
接著是各種定位不到元素,然後知道了這是非同步載入,數據根本不在網頁源代碼中,需要通過抓包來獲取網頁信息。於是在各種 JS、XHR的文件中 preview,尋找包含數據的鏈接。
當然知乎還好,本身載入的文件不多,找到了 json 文件直接獲取對應的數據。(這裡要安利一個chrome插件:jsonview,讓小白輕鬆看懂 json 文件)
在這裡就對反爬蟲有了認識,當然這還是最基本的,更嚴格的IP限制、驗證碼、文字加密等等,可能還會遇到很多難題。但是目前的問題能夠解決不就很好了嗎,逐個擊破才能更高效地學習。
比如後來在爬其他網站的時候就被封了IP,簡單的可以通過 time.sleep() 控制爬取頻率的方法解決,限制比較嚴格或者需要保證爬取速度,就要用代理IP來解決。
當然,後來也試了一下 Selenium,這個就真的是按照真實的用戶瀏覽行為(點擊、搜索、翻頁)來實現爬蟲,所以對於那些反爬蟲特別厲害的網站,又沒有辦法解決,Selenium 是一個超級好用的東東,雖然速度稍微慢點。
5.嘗試強大的 Scrapy 框架
有了 requests+xpath 和抓包大法,就可以做很多事情了,豆瓣各分類下的電影,58同城、知乎、拉勾這些網站基本都沒問題。不過,當爬取的數據量級很大,而且需要靈活地處理各個模塊的話,會顯得很力不從心。
於是了解到強大的 Scrapy 框架,它不僅能便捷地構建 Request,還有強大的 Selector 能夠方便地解析 Response,然而最讓人驚喜的還是它超高的性能,可以將爬蟲工程化、模塊化。
學會 Scrapy,自己去嘗試搭建了簡單的爬蟲框架,在做大規模數據爬去的時候能夠結構化、工程化地思考大規模的爬取問題,這使我可以從爬蟲工程的維度去思考問題。
當然 Scrapy 本身的 selector 、中間件、spider 等會比較難理解,還是建議結合具體的例子,參考別人的代碼,去理解其中實現的過程,這樣能夠更好地理解。
6.本地文件搞不動了,上資料庫
爬回來大量的數據之後就發現,本地的文件存起來非常不方便,即便存下來了,打開大文件電腦會卡得很嚴重。怎麼辦呢?果斷上資料庫啊,於是開始入坑 MongoDB。結構化、非結構化的數據都能夠存儲,安裝好 PyMongo,就可以方便地在 Python 中操作資料庫了。
MongoDB 本身安裝會比較麻煩,如果自己一個人去折騰,很有可能會陷入困境。剛開始安裝的時候也是出現各種BUG,幸得大神小X指點,解決了很多問題。
當然對於爬蟲這一塊,並不需要多麼高深的資料庫技術,主要是數據的入庫和提取,順帶掌握了基本的插入、刪除等操作。總之,能夠滿足高效地提取爬下來的數據就OK了。
7.傳說中的分散式爬蟲
這個時候,基本上很大一部分的網頁都能爬了,瓶頸就集中到爬取大規模數據的效率。因為學了 Scrapy,於是自然地接觸到一個很厲害的名字:分散式爬蟲。
分散式這個東西,一聽不明覺厲,感覺很恐怖,但其實就是利用多線程的原理讓多個爬蟲同時工作,除了前面學過的 Scrapy 和 MongoDB,好像還需要了解 Redis。
Scrapy 用於做基本的頁面爬取,MongoDB 用於存儲爬取的數據,Redis 則用來存儲要爬取的網頁隊列,也就是任務隊列。
分散式這東西看起來很嚇人,但其實分解開,循序漸進地學習,也不過如此。
零基礎學習爬蟲,坑確實比較多,總結如下:
1.環境配置,各種安裝包、環境變數,對小白太不友好;
2.缺少合理的學習路徑,上來 Python、HTML 各種學,極其容易放棄;
3.Python有很多包、框架可以選擇,但小白不知道哪個更友好;
4.遇到問題甚至不知道如何描述,更不用說去尋找解決辦法;
5.網上的資料非常零散,而且對小白不友好,很多看起來雲里霧裡;
6.有些東西看似懂了,但結果自己寫代碼還是很困難;
……………………
所以跟我一樣,很多人爬坑最大的體會是:盡量不要系統地去啃一些東西,找一個實際的項目(從豆瓣這種簡單的入手),直接開始就好。
因為爬蟲這種技術,既不需要你系統地精通一門語言,也不需要多麼高深的資料庫技術,從實際的項目中去學習這些零散的知識點,你能保證每次學到的都是最需要的那部分。
後來DC學院推出了系統的爬蟲課,才知道原來很多坑都是知識架構不清晰不得不踩的。如果你覺得尋找資源或者搭建知識體系麻煩,或者希望在遇到問題後得到及時的解答,更加高效地學習,也可以加入我們的課程《Python爬蟲:入門+進階》。
以解決實際的問題為目的,學習才最高效。
好問題,這個問題不禁讓我回憶起我學爬蟲的路。
2014年底,我在學校參與到一個項目,是用數據來預測新店鋪的選址,這裡就不免需要購物中心的數據。當時沒有同學會爬蟲獲取數據,於是有些同學開始手動複製粘貼,我並不想做這種機械性的工作。於是,我上網搜到了爬蟲這個概念,在我僅僅會vba和c的情況下,開始自學python,裝library,上網搜教程,各種折騰了一個星期後,終於從網上爬下來需要的數據。
那種痛哭流涕的感覺,這是我爬蟲之路上最刻苦銘心的記憶。
之後,參與到更多的項目中,各個項目都需要爬蟲獲取數據,例如消費者評論的情感分析,需要電商的評論;分析全國各個小區所居住人的社會階層,需要樓價數據;分析各個城市餐廳的消費情況,需要餐廳數據,等等。
慢慢的,我入坑了。首先我只是會使用 requests 獲取網頁,使用 Beautifulsoup 把網頁中的內容提取出來,再使用簡單的一行代碼存入記事本中。
這些濃縮在我前幾周寫的這篇文章:5分鐘入門網路爬蟲 - 原來可以這麼簡單易懂
5分鐘入門爬蟲,呵呵,這可是我1個月各種搜資料求大神學習的濃縮:學習一個東西一定要一個好老師,你走偏了路,1個月的努力也許別人只需學5分鐘。
慢慢的,發現我使用 requests 獲取到的是亂碼,是該網頁無法顯示的時候,我開始攻克這個難關。我發現了網站也會反爬蟲,我開始網上搜各種資料:修改代理,修改請求頭,修改爬蟲間隔時間等等。
慢慢的,我發現光是用 Beautifulsoup 解析不了某些動態網頁,因為網頁源代碼裡面根本沒有我要的數據。我開始攻克這個難關,我了解到現在大部分網頁使用的 JavaScript 動態提取數據,我開始學會了如何找到網頁的真實地址,我也知道了使用 selenium 模擬瀏覽器的點擊。
慢慢的,我發現爬下來的數據越來越大,把數據存入 txt 或者 csv 格式不夠方便,我開始學習資料庫。憑著自己 sql 的一點點基礎,開始自己下載 mysql,學習如何把 Python 和 mysql 對接,把數據存到 sql 資料庫里。之後又發現 nonsql 對於網頁里的數據能更方便的儲存,我又開始自學 Mongodb,下載安裝,對接儲存。
慢慢的,我發現之前針對反爬蟲的招數都變成了廢物的時候,我又開始找朋友,問大神,了解到動態 IP 這種方法,又知道了 Tor 這個神器。但是,他們只告訴我有這個方法,我又一點一滴地在網上搜資料,中文的資料很少,我就去 google 上搜英文的,跟著網上的教程,bug 不斷出現,然後又一個個 bug 去解決,我終於知道了 如何使用動態 IP 和Tor,解決了 IP 的問題。
慢慢的,我發現我爬蟲的速度太慢,達不到時間的要求,我開始了解到多進程爬蟲,了解到分散式爬蟲,我又開始學。。。
前幾天看了李書福的一句話,我覺得很有道理:「造汽車沒什麼神秘的,無非就是四個輪子加一個方向盤再加一個發動機。」,爬蟲對於造個汽車來說,更簡單,無非就是三步:獲取網頁,提取數據,儲存數據。
沒什麼不可能的,你需要的是即刻開始。
也許努力的人會多一點運氣,機械工業出版社的編輯主動找到了我,要我寫一本《Python 網路爬蟲》,我很珍惜這個機會,也希望把自己一路上學到的,遇到的都濃縮到這本書里。我希望這本書不是成為大家學習爬蟲的障礙,而是享受到爬蟲的樂趣。
幾個月的努力,每天晚上在公司從7點寫到12點,多少個周末沒有出去玩耍,拒絕了朋友的邀約,我終於能出版一本自己的書了。
這本書,我希望零基礎的同學可以讀,有基礎的同學也可以讀;我太知道一個好的老師對於學習的重要了,因此,這本書我盡量做到淺顯易懂,而且通過大量的實戰來讓成果鞏固。
貼個鏈接,希望大家支持:
京東:《Python網路爬蟲從入門到實踐》(唐松,陳智銓)【摘要 書評 試讀】- 京東圖書
噹噹:《Python網路爬蟲從入門到實踐》(唐松 陳智銓)【簡介_書評_在線閱讀】 - 噹噹圖書
天貓:正版包郵 Python網路爬蟲從入門到實踐 計算機與互聯網 Python爬蟲的流程 使用pip安裝第三方庫 計算機網路 編程語言與程序設計
網路上很多你需要重複去做的,都可以寫python腳本去做。
比如知乎的一些好文章,你要保存下來,或者自動定期發送到kindle電子書
python爬蟲 推送知乎文章到kindle電子書
python 暴力破解wordpress博客後台登陸密碼
python 爆解zip壓縮文件密碼
github:GitHub - Rockyzsu/zip_crash
python 多線程掃描開放埠
github:GitHub - Rockyzsu/scan_host
python 批量獲取色影無忌 獲獎圖片
代碼解釋: http://www.30daydo.com/article/56
用python破解某211大學BBS論壇用戶密碼(鏈接修復中)
感覺都是自己為了完成某種目的而且做得,這樣動機會更加明確。 目前準備爬取股票信息,做研究使用(炒股啦)
第一次想寫爬蟲是為了抓取草榴的高點擊率視頻鏈接。代碼如下。需要翻牆。
# -- coding: utf-8 --
import urllib2
import sys
from bs4 import BeautifulSoup
reload(sys)
sys.setdefaultencoding("utf8") #解決寫入文件亂碼問題
BaseUrl = "http://t66y.com/"
j=1
for i in range(1, 100): #設置始末頁碼
url = "http://t66y.com/thread0806.php?fid=22search=page="+ str(i) #默認str會把字元串變成unicode,所以開頭必須用sys來重置
page = urllib2.urlopen(url)
soup = BeautifulSoup(page, from_encoding="gb18030") #解決BeautifulSoup中文亂碼問題
print("reading page "+ str(i))
counts = soup.find_all("td", class_="tal f10 y-style")
for count in counts:
if int(count.string)&>15: #選擇想要的點擊率
videoContainer = count.previous_sibling.previous_sibling.previous_sibling.previous_sibling
video = videoContainer.find("h3")
print("Downloading link "+ str(j))
line1 = (video.get_text())
line2 = BaseUrl+video.a.get("href")
line3 = "view **" + count.string + "** "
print line1
f = open("cao.md", "a")
f.write("
"+"###"+" "+line1+"
"+"&<"+line2+">"+"
"+line3+ " "+ "page"+str(i)+"
")
f.close()
j+=1
不知題主的編程基礎如何,基本上想寫Python爬蟲只需要看下前人的日誌學習下urllib和BeautifulSoup就夠用了。
另外如果有千人的實際例子看一下應該能比較直觀的明白一個爬蟲是怎麼跑起來的。
在下不才,寫過一個爬知乎數據的爬蟲,開源於(各位親走過路過的時候請給點個Star或Fork唄~):MorganZhang100/zhihu-spider · GitHub
該爬蟲爬到的數據應用於:http://zhihuhot.sinaapp.com/
簡單點說就是一個爬取問題的一些參數,進行分析,找出最可能會火的問題。據此回答問題的話,得贊速度比之前多20倍左右。
我對Python也不是很熟悉,不過一共只有幾百行的代碼,題主看看應該問題不大。
其實學任何東西,看得教程再多也比不上自己實習寫幾行代碼來得有效果。只要開始寫了,你就知道你需要什麼了。我最開始在一個傳統老舊的公司用 tcl 語言寫自動化測試的腳本,你知道的傳統的設備命令行工具通過vty獲取,說白了就是每天日復一日的處理字元串,後來時代變了,有些輕型的設備(例如家用的wifi)多了支持http 網頁控制界面,然後我們就寫一套命令行的,寫一套restful API的,對於不提供restful API 介面的,就寫一套完全模擬用戶用網頁操作流程的。
這份工作本身是相當無聊的,每天也許只要3個小時就完成當天工作的,那剩下的時間怎麼打發?爬網頁嘍…… 爬多了以後js語言也差不多了。最開始看了寫Simplecd那個人的博客開始了解原來Python寫爬蟲這麼牛逼。
然後寫了腳本1W+豆瓣電影的評分頁面。之後實驗室有項目,寫了腳本爬了50W條微博,中途熟悉如何模擬登錄騙過伺服器是最有趣的部分。
總結,你看看之前人的博客就行了,簡單的爬蟲用不到多高深的技術,無非就是幾個:1.熟悉一下urllib的使用
2.了解基本的html解析,通常來說最基本的正則就夠用了
有一個網站上有很多論文,想下載,但懶得一個個點。於是寫了個爬蟲來下載。
最開始其實想學nutch,後來想想,還是用小一點的項目比較好,開源項目scrapy,還不錯,就是文檔寫得不適合新手看。最近剛完成一個需要登錄的爬蟲,抓取sis亞洲無碼區種子的下載數和紅心數……
Scrapy Tutorial
如何學習Python爬蟲[入門篇]? - 學習編程 - 知乎專欄
學習爬蟲時候用的一些資料恰好整理在這篇文章裡面了,不再貼了。
後面根據以下實例又做了很多練習。
實例一:那啥,源碼解讀下載
GitHub - xkaifei/Ano-Bbs-Browser-Python-Script: 用python命令行來瀏覽a島的腳本,學習python練手作
實例二:抓取淘寶照片,源碼解讀下載
Python爬蟲實戰(4):抓取淘寶MM照片
實例三:抓取淘寶訂單,源碼解讀下載
Python爬蟲實戰(5):模擬登錄淘寶並獲取所有訂單
實例四:微信開發,源碼解讀下載
使用python一步一步搭建微信公眾平台(一)
使用python一步一步搭建微信公眾平台(二)----搭建一個中英互譯的翻譯工具
使用python一步一步搭建微信公眾平台(三)----添加用戶關注後的歡迎信息與聽音樂功能
使用python一步一步搭建微信公眾平台(四)----將小黃雞引入微信自動回復
使用python一步一步搭建微信公眾平台(五)----使用mysql服務來記錄用戶的反饋
實例五:爬取知乎,源碼解讀下載
Welcome to zhihu-py3』s documentation! (建議通讀源碼)
實例六:模擬登錄一些主流網站,源碼下載
GitHub - xchaoinfo/fuck-login: 模擬登錄一些知名的網站,為了方便爬取需要登錄的網站
實例六:多個實例源碼,更多請訪問主頁@華天清
Python爬蟲實戰(2):爬取京東商品列表
Python爬蟲實戰(3):安居客房產經紀人信息採集
實例七:豆瓣爬取實例,源碼下載
GitHub - dontcontactme/doubanspiders: 豆瓣電影、書籍、小組、相冊、東西等爬蟲集 writen in Python
以及最近自己做的一個實例
Python對微信好友進行簡單統計分析 - 學習編程 - 知乎專欄
推薦閱讀:
※作為面試官,你主要考察面試人哪些方面的能力?
※你最想安利的動畫?
※有什麼讓你感觸特別大的動漫?
※你在知乎做過最喪心病狂的事情是什麼?
※為知乎設計一句廣告詞,你會怎麼做?