Python3 urllib.request庫的基本使用html
所謂網頁抓取,就是把URL地址中指定的網絡資源從網絡流中讀取出來,保存到本地。 在Python中有不少庫能夠用來抓取網頁,咱們先學習urllib.request庫。 python
urllib.request庫 是 Python3 自帶的模塊(不須要下載,導入便可使用)web
urllib.request庫在windows下的路徑(C:\Python34\Lib\urllib)json
備註:python 自帶的模塊庫文件都是在C:\Python34\Lib目錄下(C:\Python34是我Python的安裝目錄),python第三方模塊庫都是在C:\Python34\Lib\site-packages 下。windows
能夠經過EditPlus工具或者其餘代碼查看工具看urllib.request庫的相關方法實現的源碼。瀏覽器
入門的例子一:用urllib.request 裏的urlopen()方法發送一個請求緩存
# 導入urllib.request 庫服務器
import urllib.request網絡
# 向指定的url發送請求,並返回服務器響應的類文件對象dom
response = urllib.request.urlopen("http://admin.bxcker.com")
# 服務器返回的類文件對象支持Python文件對象的操做方法,如read()方法讀取文件所有內容,返回字符串
html = response.read()
# 打印響應的內容
print(html)
運行結果:
在PyChram下運行的結果:
在DOS下運行的結果:
在網頁查看源碼覈實:
在瀏覽器上打開http://admin.bxcker.com, 右鍵選擇「查看源代碼」,你會發現,跟咱們剛纔打印出來的是如出一轍。也就是說,上面的例子把登錄首頁的所有代碼爬了下來。
一個基本的url請求對應的python代碼是很是的簡單,經過例子,說明是能夠經過發送請求,獲取響應的內容,而後輸出顯示響應的內容。
備註:urllib.request 裏的 urlopen()不支持構造HTTP請求,不能給編寫的請求添加head,沒法模擬真實的瀏覽器發送請求。
經過查看urllib.request庫的源碼文件,查看「User-agent」默認的是client_version
而client_version = "Python-urllib/%s" % __version__
經過查urllib.request庫的源碼文件,__version__= sys.version[:3]
在Dos下執行sys.version[:3],顯示的是3.4。
經過驗證得出結論:urllib.request庫的urlopen()方法默認的「User-agent」是本機Python的版本(User-agent:Python-urllib/3.4),對於服務器而言,一下就能識別出這是爬蟲。
在咱們第一個入門例子裏,urlopen()的參數就是一個url地址;可是若是須要執行更復雜的操做,好比增長HTTP報頭,必須建立一個 Request 實例來做爲urlopen()的參數;而須要訪問的url地址則做爲 Request 實例的參數。
例子二:用urllib.request 裏的request ()方法發送一個請求
import urllib.request
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request("http://admin.bxcker.com")
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read()
print(html)
運行結果:跟例子一是同樣。
Request實例,除了必需要有 url 參數以外,還能夠設置另外兩個參數:
data:若是是GET請求,data(默認空),若是是POST請求,須要加上data參數,伴隨 url 提交的數據。
headers(默認空):是一個字典,包含了須要發送的HTTP報頭的鍵值對。
經過抓包能夠抓到http://admin.bxcker.com 請求的head信息
Accept: text/html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie:admin-JSESSIONID=2E5020AF574CA3F466A206D8F006C914; LOGIN_USER=%7B%22user%22%3A%7B%22accountNonExpired%22%3Atrue%2C%22accountNonLocked%22%3Atrue%2C%22branchId%22%3A2%2C%22createTime%22%3A%222017-12-15%2015%3A42%3A25%22%2C%22createUserId%22%3A2%2C%22credentialsNonExpired%22%3Atrue%2C%22deleteStatus%22%3Afalse%2C%22enabled%22%3Atrue%2C%22id%22%3A29580%2C%22mobile%22%3A%2211111111179%22%2C%22new%22%3Afalse%2C%22nickName%22%3A%22xiaony%22%2C%22parentId%22%3Anull%2C%22platUserToken%22%3Anull%2C%22proxyId%22%3Anull%2C%22source%22%3A3%2C%22ssoUserId%22%3Anull%2C%22unionid%22%3Anull%2C%22updateTime%22%3A%222018-01-22%2010%3A42%3A03%22%2C%22updateUserId%22%3A29580%2C%22username%22%3A%22xiaony%22%2C%22wxHeadImg%22%3Anull%2C%22wx_openid%22%3Anull%7D%7D
Host: admin.bxcker.com
Pragma: no-cache
Referer: http://admin.bxcker.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36
【Host】:主域 (發請求時,能夠不寫)
【Connection: keep-alive】:保持登陸後的長鏈接
【User-Agent】:最重要的參數
【Accept】:接受數據的格式,例如:text文本、json等
【Accept-Encoding】:數據的壓縮方式 (爬蟲不是服務器,沒有解壓方法,不能寫)
【Accept-Language】:支持的語言 (能夠不寫)
【Cookie】:緩存,Cookie在爬蟲裏主要獲取登陸後的狀態,跟登陸相關的能夠用Cookie處理,若是隻是獲取一個靜態頁面的數據,就不須要用Cookie。
web項目經過都是經過瀏覽器去訪問,要想真實模擬一個用戶用瀏覽器去訪問web項目,在發送請求的時候,會有不一樣的User-Agent頭。 urllib2默認的User-Agent頭爲:Python-urllib/x.y,因此就須要咱們在發request請求的時候添加一個head信息
例子三:用urllib.request 裏的request ()方法里加上head信息
import urllib.request
header={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request("http://admin.bxcker.com")
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read()
print(html)
運行結果:
爲了驗證咱們爬蟲發的請求,能夠用抓包工具去抓咱們爬蟲發出去的請求,能夠看到咱們的頭文件。
例子四:Request.get_header()與Request.add_header()
import urllib.request
url ="http://admin.bxcker.com"
header={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request(url)
#也能夠經過調用request.add_header() 添加/修改一個特定的header
request.add_header("Connection", "keep-alive")
# 也能夠經過調用Request.get_header()來查看header信息
print(request.get_header(header_name="Connection"))
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read()
#print(html)
運行結果:
例子五:隨機添加/修改User-Agent
import urllib.request
import random
url = "http://admin.bxcker.com"
#定義一個User-Agent列表
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36,",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
"Mozilla/5.0 (Macintosh; Intel Mac OS... "
]
#隨機抽取一個User-Agent值
user_agent = random.choice(user_agent_list)
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request(url)
#經過調用Request.add_header() 添加一個特定的header
request.add_header("User-Agent", user_agent)
# 第一個字母大寫,後面的所有小寫
print(request.get_header("User-agent"))
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read()
print(html)
運行結果: