天天看點

Python利用urllib抓取網頁元素

在網際網路時代,擷取各種資訊已經成為我們日常生活的必需品。而對于程式員來說,如何通過代碼實作快速、準确地擷取所需資訊,則是一項必備技能。本文将介紹Python中的urllib庫,以及如何使用它來抓取網頁元素。

一、什麼是urllib

urllib是Python标準庫中用于處理URL(統一資源定位符)的子產品之一。它包含了四個子子產品:urllib.request、urllib.error、urllib.parse和urllib.robotparser。其中,urllib.request子產品可以用于打開和讀取URL位址,也可以用于發送HTTP請求和接收HTTP響應。

二、urllib.request子產品的常用方法

1. urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=None)

該方法用于打開一個URL位址,并傳回一個類檔案對象。其中,參數url指定要打開的URL位址;參數data指定要發送的資料(如果需要);參數timeout指定逾時時間,預設為socket._GLOBAL_DEFAULT_TIMEOUT(即預設逾時時間為系統預設值);參數cafile和capath分别指定CA憑證檔案和路徑;參數cadefault則指定是否使用系統預設的CA憑證。如果需要使用SSL/TLS加密通信,則可以通過context參數來指定一個SSL上下文對象。

2. read([size])

該方法用于讀取類檔案對象中的内容,并傳回一個bytes對象。如果指定了參數size,則隻讀取指定的位元組數。如果沒有指定參數size,則會一次性讀取所有内容。

3. geturl()

該方法用于傳回類檔案對象目前所請求的URL位址。

三、使用urllib.request子產品抓取網頁元素

1.抓取HTML源代碼

可以使用urlopen()方法打開一個網頁,并使用read()方法讀取網頁的HTML源代碼。例如,以下代碼可以擷取百度首頁的HTML源代碼:

python
from urllib.request import urlopen
response = urlopen('')
html = response.read().decode('utf-8')
print(html)
      

2.抓取圖檔

可以使用urlopen()方法打開一個圖檔連結,并使用read()方法讀取圖檔的二進制資料。例如,以下代碼可以擷取百度首頁的Logo圖檔:

python
from urllib.request import urlopen
response = urlopen('')
image_data = response.read()
with open('baidu_logo.png','wb') as f:
    f.write(image_data)
      

3.發送POST請求

如果需要向伺服器發送POST請求,可以使用urllib.request子產品中的Request類來建構HTTP請求對象。例如,以下代碼可以向百度搜尋發送POST請求,并擷取搜尋結果:

Python利用urllib抓取網頁元素
python
from urllib.request import Request, urlopen
from urllib.parse import urlencode
data ={'wd':'Python'}
data = urlencode(data).encode('utf-8')
url =''
headers ={
    'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
req = Request(url, data=data, headers=headers)
response = urlopen(req)
html = response.read().decode('utf-8')
print(html)
      

4.使用代理伺服器

如果需要使用代理伺服器來通路某個網站,可以在urlopen()方法中指定一個ProxyHandler對象。例如,以下代碼可以使用代理伺服器通路百度首頁:

python
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({'http':':8888','https':':8888'})c3598eaac41b2e3a53740c66aaae7ced= build_opener(proxy_handler)
response = opener.open('')
html = response.read().decode('utf-8')
print(html)
      
四、常見問題及解決方法

1.亂碼問題

在讀取網頁内容時,可能會遇到亂碼問題。這時可以使用decode()方法将bytes對象轉換成字元串,并指定正确的字元編碼(如utf-8)。

2. SSL證書驗證問題

在使用urlopen()方法通路HTTPS網站時,可能會遇到SSL證書驗證失敗的問題。這時可以通過建立一個SSL上下文對象,并将其傳遞給urlopen()方法來解決該問題。

3. 403 Forbidden問題

在通路某些網站時,可能會遇到403 Forbidden錯誤。這時可以在請求頭中添加User-Agent資訊,模拟浏覽器通路。

五、總結

本文介紹了Python中的urllib庫,以及如何使用它來抓取網頁元素。通過學習本文,讀者可以掌握以下技能:

1.如何使用urllib.request子產品打開和讀取URL位址;

2.如何抓取HTML源代碼和圖檔;

3.如何發送POST請求;

4.如何使用代理伺服器;

5.如何解決常見問題。

在實際工作中,抓取網頁元素是一個非常常見的任務。通過掌握本文介紹的技能,讀者可以輕松地擷取所需資訊,并将其應用于自己的項目中。