Python3網路爬蟲開發實戰

adamlay發表於2021-04-15

1. 開發環境配置

2. 爬蟲基礎

3. 基本庫的使用

3.1使用urllib

  • request : 它是最基本的HTTP 請求模組,可以用來模擬傳送請求。就像在瀏覽器裡輸入網址,然後回車一樣,只需要給庫方法傳入URL 以及額外的引數,就可以模擬實現這個過程了。
  • error : 異常處理模組,如果出現請求錯誤, 我們可以捕獲這些異常,然後進行重試或其他操作以保證程式不會意外終止。
  • parse : 一個工具模組,提供了許多URL 處理方法,比如拆分、解析、合併等。
  • robotparser :主要是用來識別網站的robots.txt 檔案,然後判斷哪些網站可以爬,哪些網站不可以爬,它其實用得比較少。

3.1.1 傳送請求

1. urlopen()

import urllib.request
response= urllib.request.urlopen( ' https://www.python.org')
pri「1t(response. read(). decode (’ utf-8'))

urlopen()得到的是一個HTTPResposne 型別的物件,主要包含read() 、readinto ()、getheader(name )、getheaders () 、fileno ()等方法,以及msg 、version 、status 、reason 、debuglevel 、closed 等屬性。

print(response . status)
print(response .getheaders())
print(response  . getheader (『Server'))

#輸出
200
[('Server', 'Tengine'),
 ('Content-……096908924e')]
'Tengine'

API

urllib.request.urlopen(
    url,
    data=None,
    timeout=<object object at 0x000002C274D622D0>,
    *,
    cafile=None,
    capath=None,
    cadefault=False,
    context=None,
)

data引數

data 引數是可選的,如果它是位元組流編碼格式的內容,即bytes 型別,則需要通過bytes()方法轉化。如果傳遞了這個引數,則它的請求方式就不再是GET 方式,而是POST 方式。

data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
response= urllib.request.urlopen('http://httpbin.org/post',data)
print(response.read())

timeout引數

用於設定超時時間,單位為秒,如果請求超出了設定的這個時間, 還沒有得到響應, 就會丟擲異常

response= urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())

其他引數

引數作用
context必須是ssl.SSLContext 型別,用來指定SSL 設定
cafile指定CA 證照
capath指定CA 證照路徑

2. Request

request = urllib.request.Request('https://creator.douyin.com/content/manage')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

請求網頁,得到Request型別的物件

API

urllib.request.Request(
    url,
    data=None,
    headers={},
    origin_req_host=None,
    unverifiable=False,
    method=None,
)
引數說明
url必傳引數
data必須傳bytes(位元組流)類
headers一個字典,它就是請求頭
origin_req_host請求方的host 名稱或者IP 地址
origin_req_host請求方的host 名稱或者IP 地址
unverifiable表示這個請求是否是無法驗證的,預設是False ,意思就是說使用者沒有足夠許可權來選擇接收這個請求的結果
method一個字串,用來指示請求使用的方法
headers = {
    'User_Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
    'Host':'httpbin.org'
}
dict = {'name':'Germey'}
data = bytes(parse.urlencode(dict),encoding='utf8')
req = request.Request(url,data,headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))

3. 高階用法

Handler

說明
BaseHandler 類所有其他Handler 的父類,它提供了最基本的方法
HITPDefaultErrorHandler處理HTTP 響應錯誤,錯誤都會丟擲HTTP Error 型別的異常
HTTPRedirectHandler處理重定向
HTTPCookieProcessor處理Cookies
ProxyHandler設定代理, 預設代理為空
HTTPPasswordMgr管理密碼,它維護了使用者名稱和密碼的表
HTTPBasicAuthHandler管理認證,如果一個連結開啟時需要認證,那麼可以用它來解決認證問題

Opener

之前使用的Request 和urlopen( )相當於類庫為你封裝好了極其常用的請求方法,利用它們可以完成基本的請求

Opener 可以使用open()方法,返回的型別和urlopen()如出一轍

一般利用利用Handler來構建Opener

驗證——HTTPBasicAuthHandler

from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.request import URLError

username = 'username'
password = 'password'
url = 'http://localhost:5000/'

p = HTTPPasswordMgrWithDefaultRealm()#例項化
p.add_password(None,url,username,password)#新增url及使用者和密碼
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)

try:
    result = opener.open(url)
    html = result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)

相關文章