
路漫漫其修遠兮,吾将上下而求索
先上一個爬蟲程式的成品截圖,然後一行行代碼來細說。
一、導入requests庫和正規表達式
首先是導入requests庫和re子產品。使用re子產品,python 會将正規表達式轉化為位元組碼,利用 C 語言的比對引擎進行深度優先的比對。
用Python寫爬蟲,提取網站資訊有很多種方法,第三行被注釋掉的代碼,導入beautifulsoup就是其中一種方法,但本篇文章隻說明如何使用正規表達式作比對。
二、添加header
如果不添加該行代碼的話,程式會報錯。例如出現urllib2.HTTPError: HTTP Error 403: Forbidden的錯誤。這是由于網站禁止爬蟲。
我們可以
加上頭資訊,僞裝成浏覽器通路.。
其中,agent就是請求的身份,如果沒有寫入請求身份,那麼伺服器不一定會響應,是以要在headers中設定agent。接下來是寫清楚電腦組態和浏覽器配置。
我查了一下資料,此處關于header的内容細究下去還是挺多的,而且分為好幾類header。
比如,在登入之後的知乎首頁按F12->network,點選第一個請求,檢視headers,可看到General、Response Headers、Request Headers三個分類,有General
Request URL: https://www.zhihu.com/
Request Method:GET
在此不贅述,提供我用的具體代碼。
headers={"User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
三、定義擷取使用者id的函數
主要說一下
re的主要功能函數。常用的功能函數包括:compile、search、match、split、findall(finditer)、sub(subn)、compile等等參數。這裡使用了re.findall(pattern, string[, flags])函數。
該作用是:在字元串中找到正規表達式所比對的所有子串,并組成一個清單傳回。
下面這個部落格裡面有關于正規表達式的使用舉例,大家可以參考一下。
http://blog.csdn.net/u014015972/article/details/50541839上面的程式隻用到了(.*?)這一正規表達式,即寫出使用者id前後一定數量的代碼,即可比對出使用者id。可見以下的使用舉例:
***************************************
# .*?的使用舉例
c = re.findall('xx.*?xx', secret_code)
printc# ['xxIxx', 'xxlovexx', 'xxyouxx']
四、輸入要爬的網站url,調用擷取id的函數
不同的網站有不同的正規表達式,這裡我選的是百度貼吧裡的二次元吧。
https://tieba.baidu.com/p/5097778035程式是沒有錯的,但是由于方法的局限性,除了爬取出使用者id之外,還比對了一些别的文本。
其實上面那個正規表達式還可以改得更簡單些。?
羅羅攀老師講課的時候用的是糗事百科的網站,正規表達式是<h2>(.*?)</h2>,大家也可以試一下。
等我學會了用beautifulsoup寫爬蟲會再放一篇文章上來的,彌補現有程式的局限性。
如果有大神知道怎樣解決上面這個問題,也請留言指點一二。