Python3 urllib.request庫的基本使用

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)

 

運行結果:

 

相關文章
相關標籤/搜索