urllib庫(kù)我們從下面的三個(gè)方面講解:
- request: 它是最基本的HTTP請(qǐng)求模塊,可以用來模擬發(fā)送請(qǐng)求,就像在瀏覽器中輸入網(wǎng)址,然后敲擊回車鍵一樣,使用的時(shí)候只需要給庫(kù)方法傳入相關(guān)的URL和相關(guān)的參數(shù)即可.
- error: 異常處理模塊,如果出現(xiàn)請(qǐng)求錯(cuò)誤,我們可以使用這個(gè)模塊來捕獲異常,然后進(jìn)行重試或者其他操作,保證程序不會(huì)意外終止.
- parse: 這是一個(gè)工具模塊,提供了許多url的處理方法,比如拆分,解析,合并等等.
# 導(dǎo)入urllib.request 庫(kù)
import urllib.request
# 向指定的url發(fā)送請(qǐng)求,并返回服務(wù)器響應(yīng)的類文件對(duì)象
response = urllib.request.urlopen("http://www.baidu.com")
print(type(response))
# 類文件對(duì)象支持文件對(duì)象的操作方法,如read()方法讀取文件全部?jī)?nèi)容,返回字符串
html = response.read()
# 打印響應(yīng)結(jié)果(betys類型)
print (html)
# 打印狀態(tài)碼
print (response.status)
# 獲取響應(yīng)頭
print (response.getheaders())
# 獲取響應(yīng)頭信息
print (response.getheader('Server'))
# 獲取響應(yīng)結(jié)果原因
print (response.reason)
urlopen中通常設(shè)置如下的常用參數(shù):
- url:設(shè)置目標(biāo)url
- data:如果設(shè)置該參數(shù),則請(qǐng)求為post請(qǐng)求,否則是get請(qǐng)求
- timeout:用于設(shè)置超時(shí)時(shí)間,單位為秒
- context:必須是一個(gè)ssl.SSLContext類型,用來指定SSL設(shè)置,忽略未認(rèn)證的CA證書.
Request
當(dāng)我們需要進(jìn)行更復(fù)雜的操作或者網(wǎng)站的有反爬蟲機(jī)制的時(shí)候,這些參數(shù)是不夠的(比如要攜帶請(qǐng)求頭header),所有要 創(chuàng)建一個(gè)Request的實(shí)例,然后用作urlopen的參數(shù)
#
import urllib.request
# url作為Request()方法的參數(shù),構(gòu)造并返回一個(gè)Request對(duì)象
ua_header = {"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",}
request = urllib.request.Request("http://www.baidu.com",headers=ua_header)
# Request對(duì)象作為urlopen()方法的參數(shù),發(fā)送給服務(wù)器并接收響應(yīng)
response = urllib.request.urlopen(request)
#將獲取到的頁(yè)面源碼,轉(zhuǎn)為字符串
html = response.read().decode('utf-8')
也可以添加/修改User-Agent
#
import urllib.request
# url作為Request()方法的參數(shù),構(gòu)造并返回一個(gè)Request對(duì)象
user_agent = {"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",}
request = urllib.request.Request("http://www.baidu.com")
#也可以通過調(diào)用Request.add_header() 添加/修改一個(gè)特定的header
request.add_header("User-Agent", user_agent)
# get_header()的字符串參數(shù),第一個(gè)字母大寫,后面的全部小寫
request.get_header("User-agent")
# Request對(duì)象作為urlopen()方法的參數(shù),發(fā)送給服務(wù)器并接收響應(yīng)
response = urllib.request.urlopen(request)
#將獲取到的頁(yè)面源碼,轉(zhuǎn)為字符串
html = response.read().decode('utf-8')
隨機(jī)User-Agent三方庫(kù)的使用
https://github.com/hellysmile/fake-useragent
下載:
pip install fake-useragent
代碼實(shí)例:
from fake_useragent import UserAgent
ua = UserAgent()
ua.ie
# Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US);
ua.msie
# Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)'
ua['Internet Explorer']
# Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)
ua.opera
# Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11
ua.chrome
# Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'
ua.google
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13
ua['google chrome']
# Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
ua.firefox
# Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1
ua.ff
# Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1
ua.safari
# Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25
# and the best one, random via real world browser usage statistic
ua.random