Python3.7 爬蟲(二)使用 Urllib2 與 BeautifulSoup4 抓取解析網頁

版權聲明:本文爲 wintersmilesb101 -(個人獨立博客– http://wintersmilesb101.online 歡迎訪問)博主原創文章,未經博主允許不得轉載。

開篇

上一篇中我們通過原生的 re 模塊已經完成了網頁的解析,對於熟悉正則表達式的童鞋來說很好上手,但是對於萌新來說,還是有一定難度以及複雜度的,那麼這裏我們就來使用第三方解析包來解析獲取到的網頁吧。

BeautifulSoup

官方的 BeautifulSoup 是這樣的:

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔爲用戶提供需要抓取的數據,因爲簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。
Beautiful Soup自動將輸入文檔轉換爲Unicode編碼,輸出文檔轉換爲utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。
Beautiful Soup已成爲和lxml、html6lib一樣出色的python解釋器,爲用戶靈活地提供不同的解析策略或強勁的速度。

而且這個支持多種解析方式,以及解析方式中也可以加上正則表達式來過濾結果,是不是已經迫不及待要試試這個第三方庫了?
那麼看看官方中文文檔,如果看不到超鏈的:http://beautifulsoup.readthedocs.io/zh_CN/latest/ ,或者看看這篇博文,地址 : http://cuiqingcai.com/1319.html ,文檔說的很清楚,從安裝到使用,所以我這裏就不再添足了。下面直接講怎麼使用它來解析一篇網頁,我們這裏還是以 糗事百科 來實驗。

獲取網頁內容

網址:http://www.qiushibaike.com/imgrank/
網頁內容以及我們想要獲取的信息如下:

iamge

下面解釋一下上圖中幾個位置的對應信息
- 作者信息
- 段子文字部分
- 段子圖片部分(如果沒有圖片則沒有這個元素)
- 段子評分以及評論

我們這裏還是通過 Urllib2 來獲取網頁內容,代碼如下:

# -*- coding: utf-8 -*-
import urllib
import urllib.request

url = "http://www.qiushibaike.com/imgrank/"
print(url)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req = urllib.request.Request(url, headers={
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
})
response = urllib.request.urlopen(req)
content = response.read().decode('utf-8')
print(content)

運行,網頁獲取成功:

image

解析 Html

下面就是解析了,先引入包

from bs4 import BeautifulSoup 

分別解析

然後使用解析,這裏我們先來獲取作者頭像鏈接,
尾部添加代碼如下:

soup = BeautifulSoup(content, "lxml")
items = soup.select("div.author a img")
for item in items:
    print(item['src'])

這裏我是用的解釋器是 lxml 這裏你也可以使用原生的 html.parser,不過 html.parser 解析速度一般而且對中文支持不是很好,所以這裏我們用解析快對中文支持好的 lxml 具體的解釋器文檔請看 官方中文文檔

我使用的方式是:css 選擇器,因爲我粗略還是有點 Web 功底,所以感覺這個比較順手,你們可以選擇其他方式,看自己喜好了,建議多看 官方中文文檔 來熟悉這個庫的使用。想要使用css選擇器但是不熟悉 css 的可以看看這裏 CSS選擇器詳解

運行結果如下,是不是很簡單?:

image

一次性解析

通過上面的解析,我們已經會使用 BeautifulSoup來進行解析 html 了
那麼這次來解析剩下的東西,最終代碼如下:


# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup 
import urllib
import urllib.request

url = "http://www.qiushibaike.com/"
print(url)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req = urllib.request.Request(url, headers={
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
})
response = urllib.request.urlopen(req)
content = response.read().decode('utf-8')
print(content)
soup = BeautifulSoup(content, "lxml")
items1 = soup.select("div.author a img")
items2 = soup.select("a div.content span")
items3 = soup.select("div.thumb a img")
n = 0
length1 = len(items1)
length3 = len(items3)
while n < length1:
    print('作者信息:\n名稱:'+items1[n]['alt']+'\n頭像鏈接:'+items1[n]['src']+'\n\n')
    print('段子信息:\n段子:'+items2[n].text+'\n')
    #以免有些沒有圖片的段子報錯
    if n < length3:
        print('段子圖片鏈接:'+items3[n]['src']+'\n\n\n')
    else:
        print('\n\n\n')
    n += 1

運行,結果:

image

可以看到我們的數據已經全部取出來了。

獲取全部網頁段子

那麼想要獲取全部的段子怎麼辦?網頁中下方有頁數,先通過主頁獲取一個html 然後得到頁數 後面通過 http://www.qiushibaike.com/imgrank/page/ +頁數就可以了,比如我們這裏的首頁其實也可以表示爲 http://www.qiushibaike.com/imgrank/page/1 ,表示之後通過循環或者遞歸調用爬取即可。

發佈了62 篇原創文章 · 獲贊 35 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章