天天看點

python urllib request 登入網站_第14.6節 使用Python urllib.request模拟浏覽器通路網頁的實作代碼...

Python要通路一個網頁并讀取網頁内容非常簡單,在利用《第14.5節 利用浏覽器擷取的http資訊構造Python網頁通路的http請求頭》的方法建構了請求http封包的請求頭情況下,使用urllib包的request子產品使得這項工作變得非常容易,具體語句如下:

header = mkhead()

req = urllib.request.Request(url=site,headers=header)

sitetext = urllib.request.urlopen(req).read().decode()

說明:

1、在國内decode的參數一般是預設值、UTF-8、GBK這三種,如果是預設值就是UTF-8;

2、site就是要通路網站的網址;

3、headers參數是http封包頭的内容,請參考《第14.1節 通過Python爬取網頁的學習步驟》或《第14.3節 使用google浏覽器擷取網站通路的http資訊》介紹的有關http封包頭的知識。實際設定時,封包頭的内容可多可少,具體看爬蟲通路網站的要求:

1)headers參數可以不傳實參,也可以為空字典實參,不傳實參系統預設使用空字典,這種情況下Python處理時會自動補充一些内容以使web伺服器能正确處理,這些值帶有濃郁的Pythonic味道,可以使得服務端很容易知道這是Python代填充的,具體填充值大家可以使用抓包程式看一下。對于爬蟲程式來說這不是很好的事情,因為爬蟲最好是能僞裝成正常的浏覽器通路;

2)headers填寫部分參數,老猿建議填寫下列參數:

User-Agent:這個是表明使用的哪個浏覽器的,關于其來曆可參考一下《轉:為什麼浏覽器的user-agent字元串以’Mozilla’開頭呢?》,具體取值網上可以查一下,最好辦法是直接抓取真實浏覽器的資料填入,如老猿直接使用本機浏覽器的資訊:

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36

怎麼抓取資訊請見章節《第14.3節 使用google浏覽器擷取網站通路的http資訊》、《第14.4節 使用IE浏覽器擷取網站通路的http資訊》。

Accept:這個是表明本機作為用戶端浏覽器可接受的MIME類型(網際網路媒體類型),就是本機能識别處理的網際網路資訊類型,最好也從本機或其他真實的機器上抓取填入。如老猿抓取本機浏覽器發送的請求資訊中,填寫的值為:‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3’

Accept-Encoding:浏覽器能夠支援的壓縮編碼方式,如gzip, deflate, br等,服務端的封包體的壓縮格式在響應封包的封包頭的Content-Encodin字段中記載。http請求時通過Accept-Encoding告知服務端本用戶端能識别的壓縮格式,服務端根據該字段及服務端的情況采用對應方式壓縮http封包體。注意如果應用中沒有考慮服務端http封包體的解壓縮,則這個值不要設定,否則會導緻應用無法識别收到的響應封包體。關于HTTP響應封包頭的資訊請參考《轉:http協定學習系列(響應頭—Response Headers)》;

Accept-Language: 用戶端浏覽器所希望的語言種類,當伺服器能夠提供一種以上的語言版本時要用到,如zh-CN,zh;q=0.9等;

Connection:表示是否需要持久連接配接,keep-alive表示是持久連接配接;

cookie:會話cookie資訊,如果要複用已有浏覽器會話不實作登入管理則可以直接複制已有浏覽器會話的cookie,否則要麼應用程式自己實作網站登入,要麼就是匿名通路,具體大家可以根據自己爬蟲應用的要求來确認處理方式。

以上資訊老猿建議根據爬蟲功能的需要設定,但User-Agent是必須設定,這樣才能使得應用程式貌似一個正常的浏覽器。

案例:下面是老猿通路自己部落格文章的代碼:

>>> import urllib.request

>>> def mkhead():

header = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',

'Accept-Language':'zh-CN,zh;q=0.9',

'Connection':'keep-alive',

'Cookie':'uuid_tt_dd=10_35489889920-1563497330616-876822; ...... ',

'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}

return header

>>> url= r'https://blog.csdn.net/LaoYuanPython'

>>> header=mkhead()

>>> req = urllib.request.Request(url=url,headers=header)

>>> text = urllib.request.urlopen(req).read().decode()

>>> text[0:100]

'\n\n

\n \n

>>>

執行後,text中存放的就是要通路網頁的内容,上述案例中顯示了讀取資訊的前100個字元。

本節介紹了使用urllib包的request子產品讀取網頁的實作過程,整體過程非常簡單,讀取了網頁内容後就可以進行網頁内容的解析。