国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python3制作捧腹網段子頁爬蟲

2019-11-25 16:21:39
字體:
來源:轉載
供稿:網友

0x01

春節閑著沒事(是有多閑),就寫了個簡單的程序,來爬點笑話看,順帶記錄下寫程序的過程。第一次接觸爬蟲是看了這么一個帖子,一個逗逼,爬取煎蛋網上妹子的照片,簡直不要太方便。于是乎就自己照貓畫虎,抓了點圖片。

科技啟迪未來,身為一個程序員,怎么能干這種事呢,還是爬點笑話比較有益于身心健康。


0x02

在我們擼起袖子開始搞之前,先來普及點理論知識。

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


最后可以發現 <div> 中的內容就是我們所需要的笑話,在看第二條笑話,也是這樣。于是乎,我們就可以把這個網頁中所有的 <div> 找到,然后把里邊的內容提取出來,就完成了。

0x03

好了,現在我們知道我們的目的了,就可以擼起袖子開始干了。這里我用的 python3,關于 python2 和 python3 的選用,大家可以自行決定,功能都可以實現,只是有些許不同。但還是建議用 python3。
我們要扒拉下我們需要的內容,首先我們得把這個網頁扒拉下來,怎么扒拉呢,這里我們要用到一個庫,叫 urllib,我們用這個庫提供的方法,來獲取整個網頁。
首先,我們導入 urllib

復制代碼 代碼如下:
 import urllib.request as request

然后,我們就可以使用 request 來獲取網頁了,

復制代碼 代碼如下:
def getHTML(url):
return request.urlopen(url).read()

人生苦短,我用 python,一行代碼,下載網頁,你說,還有什么理由不用 python。
下載完網頁后,我們就得解析這個網頁了來獲取我們所需要的元素。為了解析元素,我們需要使用另外一個工具,叫做 Beautiful Soup,使用它,可以快速解析 HTML 和 XML并獲取我們所需要的元素。

復制代碼 代碼如下:
soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html"))

用 BeautifulSoup 來解析網頁也就一句話,但當你運行代碼的時候,會出現這么一個警告,提示要指定一個解析器,不然,可能會在其他平臺或者系統上報錯。

復制代碼 代碼如下:
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

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 解析比較靠譜。
修改之后

復制代碼 代碼如下:
soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html", 'lxml'))

這樣,就沒有上述警告了。

復制代碼 代碼如下:
div_array = soup.find_all('div', {'class':"content-img clearfix pt10 relative"})

利用 find_all 函數,來找到所有 class = content-img clearfix pt10 relative 的 div 標簽 然后遍歷這個數組

復制代碼 代碼如下:
for x in div_array: content = x.string

這樣,我們就取到了目的 div 的內容。至此,我們已經達到了我們的目的,爬到了我們的笑話。
但當以同樣的方式去爬取糗百的時候,會報這樣一個錯誤

復制代碼 代碼如下:
raise RemoteDisconnected("Remote end closed connection without" http.client.RemoteDisconnected: Remote end closed connection without response

說遠端無響應,關閉了鏈接,看了下網絡也沒有問題,這是什么情況導致的呢?莫非是我姿勢不對?
打開 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 爬蟲。我們來偽裝下試試看行不行

復制代碼 代碼如下:
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()

這樣就把 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()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青浦区| 阿尔山市| 南木林县| 建水县| 两当县| 江西省| 红安县| 泰和县| 图木舒克市| 重庆市| 上杭县| 孝感市| 阜阳市| 霍邱县| 莎车县| 建平县| 浑源县| 临洮县| 泗洪县| 开封市| 法库县| 靖远县| 云梦县| 广河县| 驻马店市| 沁源县| 麟游县| 高碑店市| 怀集县| 永昌县| 镇原县| 曲麻莱县| 辽阳市| 厦门市| 永春县| 五台县| 长海县| 周口市| 阿坝| 阳春市| 饶河县|