先上一個爬蟲程序的成品截圖,然后一行行代碼來細說。
一、導入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寫爬蟲會再放一篇文章上來的,彌補現有程序的局限性。
如果有大神知道怎樣解決上面這個問題,也請留言指點一二。