爬蟲二(urllib模塊)
1、在python2和python3中的差異
在python2中,urllib和urllib2各有各自的功能,雖然urllib2是urllib的升級版,但是urllib2還是不能完全替代urllib,但是在python3中,全部封裝成一個類,即urllib
python2中urllib2和urllib的區別:
Urllib2可以接受一個Request對象,並以此可以來設置一個URL的headers,但是urllib只接受一個URL。這就意味著你不能通過urllib偽裝自己的請求頭。Urllib模板可以提供運行urlencode的方法,該方法用於GET查詢字符串的生成,urllib2的不具備這樣的功能,而且urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。這就是urllib和urllib2一起使用的原因,quote用來url轉碼的
import urllib.request
urllib.request.Request(url, data=None, headers = {}, method= None)
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ‘
‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
‘Referer‘: ‘http://www.lagou.com/zhaopin/Python/?labelWords=label‘,
‘Connection‘: ‘keep-alive‘
}
http的頭信息可以直接使用字典的形式直接
Request如果要發送data,並無法直接傳入字典類型的參數,需要進行數據轉換,你可以直接使用類似於get傳出參數的方法,也可以使用urllib給我們提供的類
from urllib import request, parse
data = {
‘first‘: ‘true‘,
‘pn‘: 1,
‘kd‘: ‘Python‘
}
data = parse.urlencode(data).encode(‘utf-8‘)
print(data)
#結果:
b‘first=true&pn=1&kd=Python‘
urllib.parse.urlencode(query, doseq=False, safe=‘‘, encoding=None, errors=None)
urlencode()主要作用就是將url附上要提交的數據。Post的數據必須是bytes或者iterable of bytes,不能是str,因此需要進行encode()編碼
urllib.request.urlopen(url, data=None, timeout=None)
- url 需要打開的網站
- data psot提交的數據
- Timeout 網站訪問的超時時間
但是沒法偽裝我們的頭信息
from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()
2、urllib的下載
from urllib import request
url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
request.urlretrieve(url, "1.jpg")
或者通過
from urllib import request
url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
req = request.Request(url)
res = request.urlopen(req)
text = res.read()
with open("2.jpg", "wb") as f:
f.write(text)
3、urllib的代理
from urllib import request, parse
data = {
‘first‘: ‘true‘,
‘pn‘: 1,
‘kd‘: ‘Python‘
}
url = ‘http://2017.ip138.com/ic.asp‘
proxy = request.ProxyHandler({‘http‘: ‘112.95.61.146:8118‘}) # 設置proxy
opener = request.build_opener(proxy) # 掛載opener
# opener = request.build_opener() # 掛載opener
request.install_opener(opener) # 安裝opener
data = parse.urlencode(data).encode(‘utf-8‘)
page = opener.open(url, data).read()
print(type(page))
print(page.decode("gbk"))
結果:<body style="margin:0px"><center>您的IP是:[112.95.61.146] 來自:廣東省深圳市 聯通</center></body></html>
4、urllib的cookie使用
如果已經知道cookie,或者說你是通過抓包獲取到的cookie,直接放在header的信息中直接登陸就可以,登陸京東網站的cookie信息和不登錄京東的cookie信息是不一樣的,你可以登錄京東以後,抓取cookie的信息,然後訪問任何網站就可以了
import urllib.request
url = "http://www.jd.com"
header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"cookie": "xxxxx"}
req = urllib.request.Request(url=url, headers=header)
res = urllib.request.urlopen(req)
text = res.read()
5、urllib的cookie相關的類
- 在python2中cookie的類叫做:import cookielib
- 在python3中cookie的類叫做:import http.cookiejar
6、opener的概念
- 當你獲取一個URL你使用一個opener(一個urllib2 OpenerDirector的實例)。在前面,我們都是使用的默認的opener,也就是urlopen
- urlopen是一個特殊的opener,可以理解成opener的一個特殊實例,傳入的參數僅僅是url,data,timeout
- 如果我們需要用到Cookie,只用這個opener是不能達到目的的,所以我們需要創建更一般的opener來實現對Cookie的設置
7、終端輸出cookie對象
import urllib.request
import http.cookiejar
url = "http://www.hao123.com"
req = urllib.request.Request(url)
cookiejar = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
輸出:
<CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>
8、Cookie保存到文件中
import urllib.request
import http.cookiejar
url = "http://www.hao123.com"
req = urllib.request.Request(url)
cookieFileName = "cookie.txt"
cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
handler = urllib.request.HTTPCookieProcessor(cookiejar)
opener = urllib.request.build_opener(handler)
r = opener.open(req)
print(cookiejar)
cookiejar.save()
保存在了文件cookie.txt中
MozillaCookieJar繼承FileCookieJar()繼承CookieJar
9、Cookie從文件中讀取cookie信息並訪問
import urllib.request
import http.cookiejar
cookie_filename = ‘cookie.txt‘
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
print(cookie)
url = "http://www.hao123.com"
req = urllib.request.Request(url)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler) # 利用urllib2的build_opener方法創建一個opener
response = opener.open(req)
print(response.read().decode(“utf-8”))#解決亂碼的問題
爬蟲二(urllib模塊)