­

54. Python 爬蟲(3)

【基於python3的版本】

rllib下載:

當不知道urlretrieve方法,寫法如下:

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)

知道urlretrieve方法後,如下:

from urllib import request  url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"  request.urlretrieve(url, "1.jpg")

urllib的代理(對比Requests的代理方法):

from urllib import request, parse  data = {      'first': 'true',      'pn': 1,      'kd': 'Python'  }  url = 'http://2017.ip138.com/ic.asp'  # 設置proxy  proxy = request.ProxyHandler({'http': '223.241.78.186:8010'})  # 掛載opener  opener = request.build_opener(proxy)  # 安裝opener  request.install_opener(opener)  data = parse.urlencode(data).encode('utf-8')  page = opener.open(url, data).read()  print(type(page))  print(page.decode("gbk"))

結果:

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": "xxxxxxxxx(登錄過得用戶cookie)"           }  req = urllib.request.Request(url=url, headers=header)  res = urllib.request.urlopen(req)  text = res.read().decode("utf-8")  print (text)

執行結果:

學習:

urllib的cookie相關的類

在python2中cookie的類叫做:import cookielib

在python3中cookie的類叫做:import http.cookiejar

opener的概念

當你獲取一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。在前面,我們都是使用的默認的opener,也就是urlopen。

urlopen是一個特殊的opener,可以理解成opener的一個特殊實例,傳入的參數僅僅是url,data,timeout。

如果我們需要用到Cookie,只用這個opener是不能達到目的的,所以我們需要創建更一般的opener來實現對Cookie的設置。

終端輸出cookie對象

import urllib.request  import http.cookiejar  url = "http://www.hao123.com"  req = urllib.request.Request(url)  cookieh = http.cookiejar.CookieJar()  #保存了cookie對象  handler = urllib.request.HTTPCookieProcessor(cookieh)  #綁定請求,也就是說在一次請求中,只要你進行訪問,他就會保存下來你的cookie資訊  opener = urllib.request.build_opener(handler)  r = opener.open(req)  print(cookieh)

列印cookie對象:

<CookieJar[<Cookie BAIDUID=E9770FE732D04AB585E90684F0E307ED: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/>]>

將Cookie保存到文件中:

import urllib.request  import http.cookiejar  url = "http://www.hao123.com"  req = urllib.request.Request(url)  cookieFileName = "cookie.txt"  #文件cookie  cookieh = http.cookiejar.MozillaCookieJar(cookieFileName)  handler = urllib.request.HTTPCookieProcessor(cookieh)  opener = urllib.request.build_opener(handler)  r = opener.open(req)  print(cookieh)  cookieh.save()

執行:

保存在了文件cookie.txt中

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"))#解決亂碼的問題