蝸牛爬行日記——正則表達式與第一個爬蟲程序

路漫漫其修遠兮,吾將上下而求索

先上一個爬蟲程序的成品截圖,然后一行行代碼來細說。

一、導入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寫爬蟲會再放一篇文章上來的,彌補現有程序的局限性。

如果有大神知道怎樣解決上面這個問題,也請留言指點一二。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容