網路上的Python教學大都是2.X版本的,python2.X和python3.X相比較改動比較大,好多庫的用法不太一樣,我安裝的是python3.X,我們來看看詳細的例
0x01
春節閒著沒事(有多閒),就寫了個簡單的程序,來爬點笑話看,順帶記錄下寫程序的過程。第一次接觸爬蟲是看了這麼一個帖子,一個逗逼,爬取煎蛋網上妹子的照片,簡直不要太方便。於是乎就自己照貓畫虎,抓了點圖片。
科技啟迪未來,身為程式設計師,怎麼能幹這種事呢,還是爬點笑話比較有益於身心健康。
0x02
在我們擼起袖子開始搞之前,先來普及點理論知識。
簡單地說,我們要把網頁上特定位置的內容,扒拉下來,具體怎麼扒拉,我們得先分析這個網頁,看那塊內容是我們需要的。例如,這次爬取的是捧腹網上的笑話,打開 捧腹網段子頁我們可以看到一大堆笑話,我們的目的就是獲取這些內容。看完回來冷靜一下,你這樣一直笑,我們沒辦法寫程式。在 chrome 中,我們打開 審查元素 然後一級一級的展開 HTML 標籤,或點擊那個小滑鼠,定位我們所需要的元素。
最後可以發現 e388a4556c0f65e1904146cc1a846bee 中的內容就是我們所需要的笑話,在看第二個笑話,也是這樣。於是乎,我們就可以把這個網頁中所有的 e388a4556c0f65e1904146cc1a846bee 找到,然後把裡邊的內容提取出來,就完成了。
0x03
好了,現在我們知道我們的目的了,就可以擼起袖子開始乾了。這裡我用的 python3,關於 python2 和 python3 的選用,大家可以自行決定,功能都可以實現,只是有些許不同。但還是建議用 python3。
我們要扒拉下我們需要的內容,首先我們得把這個網頁扒拉下來,怎麼扒拉呢,這裡我們要用到一個庫,叫 urllib,我們用這個庫提供的方法,來獲取整個網頁。
首先,我們匯入urllib
程式碼如下:
import urllib.request as request
然後,我們就可以使用request 來取得網頁了,
程式碼如下:
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'))
這樣,就沒有上述警告了。
程式碼如下:
p_array = soup.find_all('p', {'class':"content-img clearfix pt10 relative"})
利用find_all 函數,來找出所有class = content-img clearfix pt10 relative 的p 標籤然後遍歷這個陣列
程式碼如下:
for x in p_array: content = x.string
這樣,我們就取到目的p 的內容了。至此,我們已經達到了我們的目的,爬到了我們的笑話。
但當以同樣的方式去爬取糗百的時候,會報這樣一個錯誤
程式碼如下:
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): head ers = {'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 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('p', {'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('p', {'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()
【相关推荐】
1. Python免费视频教程
3. Python基础入门手册
以上是python實作網路段子頁爬蟲案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!