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

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

最后可以發(fā)現(xiàn) <div> 中的內(nèi)容就是我們所需要的笑話,在看第二條笑話,也是這樣。于是乎,我們就可以把這個網(wǎng)頁中所有的 <div> 找到,然后把里邊的內(nèi)容提取出來,就完成了。
0x03
好了,現(xiàn)在我們知道我們的目的了,就可以擼起袖子開始干了。這里我用的 python3,關于 python2 和 python3 的選用,大家可以自行決定,功能都可以實現(xiàn),只是有些許不同。但還是建議用 python3。
我們要扒拉下我們需要的內(nèi)容,首先我們得把這個網(wǎng)頁扒拉下來,怎么扒拉呢,這里我們要用到一個庫,叫 urllib,我們用這個庫提供的方法,來獲取整個網(wǎng)頁。
首先,我們導入 urllib
然后,我們就可以使用 request 來獲取網(wǎng)頁了,
return request.urlopen(url).read()
人生苦短,我用 python,一行代碼,下載網(wǎng)頁,你說,還有什么理由不用 python。
下載完網(wǎng)頁后,我們就得解析這個網(wǎng)頁了來獲取我們所需要的元素。為了解析元素,我們需要使用另外一個工具,叫做 Beautiful Soup,使用它,可以快速解析 HTML 和 XML并獲取我們所需要的元素。
用 BeautifulSoup 來解析網(wǎng)頁也就一句話,但當你運行代碼的時候,會出現(xiàn)這么一個警告,提示要指定一個解析器,不然,可能會在其他平臺或者系統(tǒng)上報錯。
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))
解析器的種類 和 不同解析器之間的區(qū)別 官方文檔有詳細的說明,目前來說,還是用 lxml 解析比較靠譜。
修改之后
這樣,就沒有上述警告了。
利用 find_all 函數(shù),來找到所有 class = content-img clearfix pt10 relative 的 div 標簽 然后遍歷這個數(shù)組
這樣,我們就取到了目的 div 的內(nèi)容。至此,我們已經(jīng)達到了我們的目的,爬到了我們的笑話。
但當以同樣的方式去爬取糗百的時候,會報這樣一個錯誤
說遠端無響應,關閉了鏈接,看了下網(wǎng)絡也沒有問題,這是什么情況導致的呢?莫非是我姿勢不對?
打開 charles 抓包,果然也沒反應。唉,這就奇怪了,好好的一個網(wǎng)站,怎么瀏覽器可以訪問,python 無法訪問呢,是不是 UA 的問題呢?看了下 charles,發(fā)現(xiàn),利用 urllib 發(fā)起的請求,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,那會不會是因為服務器根據(jù) UA 來判斷拒絕了 python 爬蟲。我們來偽裝下試試看行不行
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()
這樣就把 python 偽裝成 chrome 去獲取糗百的網(wǎng)頁,可以順利的得到數(shù)據(jù)。
至此,利用 python 爬取糗百和捧腹網(wǎng)的笑話已經(jīng)結束,我們只需要分析相應的網(wǎng)頁,找到我們感興趣的元素,利用 python 強大的功能,就可以達到我們的目的,不管是 XXOO 的圖,還是內(nèi)涵段子,都可以一鍵搞定,不說了,我去找點妹子圖看看。
# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup
def 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
return
def 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 restlus
def 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')
return
if __name__ == '__main__':
get_pengfu_joke()
get_qiubai_joke()
- Python3爬蟲爬取百姓網(wǎng)列表并保存為json功能示例【基于request、lxml和json模塊】
- Python3爬蟲學習之爬蟲利器Beautiful Soup用法分析
- Python3爬蟲學習之應對網(wǎng)站反爬蟲機制的方法分析
- Python3爬蟲學習入門教程
- Python3爬蟲爬取英雄聯(lián)盟高清桌面壁紙功能示例【基于Scrapy框架】
- Python3實現(xiàn)爬蟲爬取趕集網(wǎng)列表功能【基于request和BeautifulSoup模塊】
- python3簡單實現(xiàn)微信爬蟲
- Python3實現(xiàn)的爬蟲爬取數(shù)據(jù)并存入mysql數(shù)據(jù)庫操作示例
- Python3多線程爬蟲實例講解代碼
- pytest下的pytest.ini文件的配置項
- Python3爬蟲學習之將爬取的信息保存到本地的方法詳解
相關文章
Python實戰(zhàn)之夢幻鋼琴小游戲的實現(xiàn)
這篇文章主要為大家詳細介紹了如何利用Python語言編寫一款界面化的(Tkinter)電子鋼琴小程序,文中的示例代碼講解詳細,感興趣的可以了解一下2023-02-02
python3實現(xiàn)ftp服務功能(服務端 For Linux)
這篇文章主要介紹了python3實現(xiàn)ftp服務功能,服務端 For Linux,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
python中pandas nlargest()的詳細用法小結
df.nlargest()是一個DataFrame的方法,用于返回DataFrame中最大的n個值所在的行,通過調(diào)用nlargest()方法,我們返回了分數(shù)最高的三個行,并按照降序排列,本文結合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧2023-10-10
Django Form 實時從數(shù)據(jù)庫中獲取數(shù)據(jù)的操作方法
這篇文章主要介紹了Django Form 實時從數(shù)據(jù)庫中獲取數(shù)據(jù)的相關知識,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07
python+opencv+caffe+攝像頭做目標檢測的實例代碼
今天小編就為大家分享一篇python+opencv+caffe+攝像頭做目標檢測的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

