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

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

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

