1. 程式人生 > >Python3.7 爬蟲(二)使用 Urllib2 與 BeautifulSoup4 抓取解析網頁

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

開篇

上一篇中我們通過原生的 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

,文件說的很清楚,從安裝到使用,所以我這裡就不再添足了。下面直接講怎麼使用它來解析一篇網頁,我們這裡還是以 糗事百科 來實驗。

獲取網頁內容

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

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

獲取全部網頁段子