0x01
春節閑著沒事(是有多閑),就寫了個簡單的程序,來爬點笑話看,順帶記錄下寫程序的過程。第一次接觸爬蟲是看了這么一個帖子,一個逗逼,爬取煎蛋網上妹子的照片,簡直不要太方便。于是乎就自己照貓畫虎,抓了點圖片。
科技啟迪未來,身為一個程序員,怎么能干這種事呢,還是爬點笑話比較有益于身心健康。

0x02
在我們擼起袖子開始搞之前,先來普及點理論知識。
簡單地說,我們要把網頁上特定位置的內容,扒拉下來,具體怎么扒拉,我們得先分析這個網頁,看那塊內容是我們需要的。比如,這次爬取的是捧腹網上的笑話,打開 捧腹網段子頁我們可以看到一大堆笑話,我們的目的就是獲取這些內容。看完回來冷靜一下,你這樣一直笑,我們沒辦法寫代碼。在 chrome 中,我們打開 審查元素 然后一級一級的展開 HTML 標簽,或者點擊那個小鼠標,定位我們所需要的元素。

最后可以發現 <div> 中的內容就是我們所需要的笑話,在看第二條笑話,也是這樣。于是乎,我們就可以把這個網頁中所有的 <div> 找到,然后把里邊的內容提取出來,就完成了。
0x03
好了,現在我們知道我們的目的了,就可以擼起袖子開始干了。這里我用的 python3,關于 python2 和 python3 的選用,大家可以自行決定,功能都可以實現,只是有些許不同。但還是建議用 python3。
我們要扒拉下我們需要的內容,首先我們得把這個網頁扒拉下來,怎么扒拉呢,這里我們要用到一個庫,叫 urllib,我們用這個庫提供的方法,來獲取整個網頁。
首先,我們導入 urllib
然后,我們就可以使用 request 來獲取網頁了,
人生苦短,我用 python,一行代碼,下載網頁,你說,還有什么理由不用 python。
下載完網頁后,我們就得解析這個網頁了來獲取我們所需要的元素。為了解析元素,我們需要使用另外一個工具,叫做 Beautiful Soup,使用它,可以快速解析 HTML 和 XML并獲取我們所需要的元素。
用 BeautifulSoup 來解析網頁也就一句話,但當你運行代碼的時候,會出現這么一個警告,提示要指定一個解析器,不然,可能會在其他平臺或者系統上報錯。
The code that caused this warning is on line 64 of the file joke.py. To get rid of this warning, change code that looks like this:
BeautifulSoup([your markup])
to this:
BeautifulSoup([your markup], "lxml")
markup_type=markup_type))
解析器的種類 和 不同解析器之間的區別 官方文檔有詳細的說明,目前來說,還是用 lxml 解析比較靠譜。
修改之后
這樣,就沒有上述警告了。
利用 find_all 函數,來找到所有 class = content-img clearfix pt10 relative 的 div 標簽 然后遍歷這個數組
這樣,我們就取到了目的 div 的內容。至此,我們已經達到了我們的目的,爬到了我們的笑話。
但當以同樣的方式去爬取糗百的時候,會報這樣一個錯誤
說遠端無響應,關閉了鏈接,看了下網絡也沒有問題,這是什么情況導致的呢?莫非是我姿勢不對?
打開 charles 抓包,果然也沒反應。唉,這就奇怪了,好好的一個網站,怎么瀏覽器可以訪問,python 無法訪問呢,是不是 UA 的問題呢?看了下 charles,發現,利用 urllib 發起的請求,UA 默認是 Python-urllib/3.5 而在 chrome 中訪問 UA 則是 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36,那會不會是因為服務器根據 UA 來判斷拒絕了 python 爬蟲。我們來偽裝下試試看行不行
這樣就把 python 偽裝成 chrome 去獲取糗百的網頁,可以順利的得到數據。
至此,利用 python 爬取糗百和捧腹網的笑話已經結束,我們只需要分析相應的網頁,找到我們感興趣的元素,利用 python 強大的功能,就可以達到我們的目的,不管是 XXOO 的圖,還是內涵段子,都可以一鍵搞定,不說了,我去找點妹子圖看看。
# -*- coding: utf-8 -*-import sysimport urllib.request as requestfrom bs4 import BeautifulSoupdef getHTML(url): headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} req = request.Request(url, headers=headers) return request.urlopen(req).read()def get_pengfu_results(url): soup = BeautifulSoup(getHTML(url), 'lxml') return soup.find_all('div', {'class':"content-img clearfix pt10 relative"})def get_pengfu_joke(): for x in range(1, 2): url = 'http://www.pengfu.com/xiaohua_%d.html' % x for x in get_pengfu_results(url): content = x.string try: string = content.lstrip() print(string + '/n/n') except: continue returndef get_qiubai_results(url): soup = BeautifulSoup(getHTML(url), 'lxml') contents = soup.find_all('div', {'class':'content'}) restlus = [] for x in contents: str = x.find('span').getText('/n','<br/>') restlus.append(str) return restlusdef get_qiubai_joke(): for x in range(1, 2): url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4952526' % x for x in get_qiubai_results(url): print(x + '/n/n') returnif __name__ == '__main__': get_pengfu_joke() get_qiubai_joke()新聞熱點
疑難解答
圖片精選