Author| 塵世gu行
??????????????????????????轉(zhuǎn)載請注明出處
urllib2 是 Python2.7 自帶的模塊(不需要下載,導(dǎo)入即可使用)
urllib2 官方文檔:https://docs.python.org/2/library/urllib2.html
urllib2 源碼:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py
在 python3 中依啰,urllib2 被改為urllib.request
urlopen
我們先來段代碼:
# urllib2_urlopen.py
# 導(dǎo)入urllib2 庫
import urllib2
# 向指定的url發(fā)送請求乎串,并返回服務(wù)器響應(yīng)的類文件對象
response = urllib2.urlopen("http://www.baidu.com")
# 類文件對象支持 文件對象的操作方法,如read()方法讀取文件全部內(nèi)容速警,返回字符串
html = response.read()
# 打印字符串
print html
執(zhí)行寫的python代碼叹誉,將打印結(jié)果
實際上,如果我們在瀏覽器上打開百度主頁坏瞄, 右鍵選擇“查看源代碼”桂对,你會發(fā)現(xiàn),跟我們剛才打印出來的是一模一樣鸠匀。也就是說蕉斜,上面的4行代碼就已經(jīng)幫我們把百度的首頁的全部代碼爬了下來。
一個基本的url請求對應(yīng)的python代碼真的非常簡單缀棍。
Request
在我們第一個例子里宅此,urlopen()的參數(shù)就是一個url地址;
但是如果需要執(zhí)行更復(fù)雜的操作爬范,比如增加HTTP報頭父腕,必須創(chuàng)建一個 Request 實例來作為urlopen()的參數(shù);而需要訪問的url地址則作為 Request 實例的參數(shù)青瀑。
我們編輯urllib2_request.py
# urllib2_request.py
import urllib2
# url 作為Request()方法的參數(shù)璧亮,構(gòu)造并返回一個Request對象
request = urllib2.Request("http://www.baidu.com")
# Request對象作為urlopen()方法的參數(shù),發(fā)送給服務(wù)器并接收響應(yīng)
response = urllib2.urlopen(request)
html = response.read()
print html
運行結(jié)果是完全一樣的
新建Request實例斥难,除了必須要有 url 參數(shù)之外枝嘶,還可以設(shè)置另外兩個參數(shù):
? ?1.data(默認空):提交的Form表單數(shù)據(jù),同時 HTTP 請求方法將從默認的 "GET"方式 改為 "POST"方式哑诊。
? ?2.headers(默認空):參數(shù)為字典類型群扶,包含了需要發(fā)送的HTTP報頭的鍵值對。
User-Agent
但是這樣直接用urllib2給一個網(wǎng)站發(fā)送請求的話,確實略有些唐突了竞阐,就好比缴饭,人家每家都有門,你以一個路人的身份直接闖進去顯然不是很禮貌骆莹。而且有一些站點不喜歡被程序(非人為訪問)訪問颗搂,有可能會拒絕你的訪問請求。
但是如果我們用一個合法的身份去請求別人網(wǎng)站汪疮,顯然人家就是歡迎的峭火,所以我們就應(yīng)該給我們的這個代碼加上一個身份,就是所謂的User-Agent頭智嚷。
- 瀏覽器 就是互聯(lián)網(wǎng)世界上公認被允許的身份卖丸,如果我們希望我們的爬蟲程序更像一個真實用戶,那我們第一步就是需要偽裝成一個被瀏覽器盏道。用不同的瀏覽器在發(fā)送請求的時候稍浆,會有不同的 User-Agent 報頭。
- urllib2默認的User-Agent頭為:Python-urllib/x.y (x和y 是Python 主.次 版本號猜嘱,例如 Python-urllib/2.7)
import urllib2
url = "http://www.itcast.cn"
# IE 9.0 的 User-Agent衅枫,包含在 user_agent里
user_agent = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}
# url 連同 headers,一起構(gòu)造Request請求朗伶,這個請求將附帶 IE9.0 瀏覽器的User-Agent
request = urllib2.Request(url, headers = user_agent)
# 向服務(wù)器發(fā)送這個請求
response = urllib2.urlopen(request)
html = response.read()
print html
這些復(fù)制過去就能用:
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 (like Firefox/3.x) SeaMonkey/2.0.12",
"Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0 ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
]
添加更多的Header信息
在 HTTP Request 中加入特定的 Header弦撩,來構(gòu)造一個完整的HTTP請求消息。
可以通過調(diào)用Request.add_header() 添加/修改一個特定的header 也可以通過調(diào)用Request.get_header()來查看已有的header论皆。
添加一個特定的header
# urllib2_headers.py
import urllib2
url = "http://www.itcast.cn"
#IE 9.0 的 User-Agent
user_agent = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"}
request = urllib2.Request(url, headers = user_agent)
#也可以通過調(diào)用Request.add_header() 添加/修改一個特定的header
request.add_header("Connection", "keep-alive")
# 也可以通過調(diào)用Request.get_header()來查看header信息
# request.get_header(header_name="Connection")
response = urllib2.urlopen(request)
print response.code #可以查看響應(yīng)狀態(tài)碼
html = response.read()
print html
隨機添加/修改User-Agent
# urllib2_add_headers.py
import urllib2
import random
url = "http://www.itcast.cn"
ua_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"
]
user_agent = random.choice(ua_list)
request = urllib2.Request(url)
#也可以通過調(diào)用Request.add_header() 添加/修改一個特定的header
request.add_header("User-Agent", user_agent)
# get_header()的字符串參數(shù)益楼,第一個字母大寫,后面的全部小寫
request.get_header("User-agent")
response = urllib2.urlopen(request)
html = response.read()
print html