天天看點

python的urllib子產品_python爬蟲 urllib子產品反爬蟲機制UA詳解

方法: 使用urlencode函數

urllib.request.urlopen()

import urllib.request

import urllib.parse

url = 'https://www.sogou.com/web?'

#将get請求中url攜帶的參數封裝至字典中

param = {

'query':'周傑倫'

}

#對url中的非ascii進行編碼

param = urllib.parse.urlencode(param)

#将編碼後的資料值拼接回url中

url += param

response = urllib.request.urlopen(url=url)

data = response.read()

with open('./周傑倫1.html','wb') as fp:

fp.write(data)

print('寫入檔案完畢')

開發者工具浏覽器按F12或者右鍵按檢查 ,有個抓包工具network,重新整理頁面,可以看到網頁資源,可以看到請求頭資訊,UA

在抓包工具點選任意請求,可以看到所有請求資訊,向應資訊,

主要用到headers,response,response headers存放響應頭資訊,request headers 存放請求資訊

python的urllib子產品_python爬蟲 urllib子產品反爬蟲機制UA詳解
python的urllib子產品_python爬蟲 urllib子產品反爬蟲機制UA詳解

反爬出機制:網站會檢查請求的UA,如果發現UA是爬蟲程式,會拒絕提供網站頁面資料。

如果網站檢查發現請求UA是基于某一款浏覽器辨別(浏覽器發起的請求),網站會認為請求是正常請求,會把頁面資料響應資訊給用戶端

User-Agent(UA):請求載體的身份辨別

反反爬蟲機制:

僞造爬蟲程式的請求的UA,把爬蟲程式的請求UA僞造成谷歌辨別,火狐辨別

通過自定義請求對象,用于僞裝爬蟲程式請求的身份。

User-Agent參數,簡稱為UA,該參數的作用是用于表明本次請求載體的身份辨別。如果我們通過浏覽器發起的請求,則該請求的載體為目前浏覽器,則UA參數的值表明的是目前浏覽器的身份辨別表示的一串資料。

如果我們使用爬蟲程式發起的一個請求,則該請求的載體為爬蟲程式,那麼該請求的UA為爬蟲程式的身份辨別表示的一串資料。

有些網站會通過辨識請求的UA來判别該請求的載體是否為爬蟲程式,如果為爬蟲程式,則不會給該請求傳回響應,那麼我們的爬蟲程式則也無法通過請求爬取到該網站中的資料值,這也是反爬蟲的一種初級技術手段。那麼為了防止該問題的出現,則我們可以給爬蟲程式的UA進行僞裝,僞裝成某款浏覽器的身份辨別。

上述案例中,我們是通過request子產品中的urlopen發起的請求,該請求對象為urllib中内置的預設請求對象,我們無法對其進行UA進行更改操作。urllib還為我們提供了一種自定義請求對象的方式,我們可以通過自定義請求對象的方式,給該請求對象中的UA進行僞裝(更改)操作。

自定義請求頭資訊字典可以添加谷歌浏覽器的UA辨別,自定義請求對象來僞裝成谷歌UA

1.封裝自定義的請求頭資訊的字典,

2.注意:在headers字典中可以封裝任意的請求頭資訊

3.将浏覽器的UA資料擷取,封裝到一個字典中。該UA值可以通過抓包工具或者浏覽器自帶的開發者工具中擷取某請求,

從中擷取UA的值

import urllib.request

import urllib.parse

url = 'https://www.sogou.com/web?query='

# url的特性:url不可以存在非ASCII編碼字元資料

word = urllib.parse.quote("周傑倫")

# 将編碼後的資料值拼接回url中

url = url+word # 有效url

# 發請求之前對請求的UA進行僞造,僞造完再對請求url發起請求

# UA僞造

# 1 子制定一個請求對象,headers是請求頭資訊,字典形式

# 封裝自定義的請求頭資訊的字典,

# 注意:在headers字典中可以封裝任意的請求頭資訊

headers = {

# 存儲任意的請求頭資訊

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'

}

# 該請求對象的UA進行了成功的僞裝

request = urllib.request.Request(url=url, headers=headers)

# 2.針對自定義請求對象發起請求

response = urllib.request.urlopen(request)

# 3.擷取響應對象中的頁面資料:read函數可以擷取響應對象中存儲的頁面資料(byte類型的資料值)

page_text = response.read()

# 4.持久化存儲:将爬取的頁面資料寫入檔案進行儲存

with open("周傑倫.html","wb") as f:

f.write(page_text)

print("寫入資料成功")

這樣就可以突破網站的反爬機制

以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援谷谷點程式。