爬虫(五):代理IP、Cookie
1. 代理IP
代理IP這個功能呢,在urllib和requests中都存在,但是這個在大的爬蟲項目中是非常重要的,所以我拿出來單獨講解。
對于某些網站,如果同一個 IP 短時間內發送大量請求,則可能會將該 IP 判定為爬蟲,進而對該 IP 進行封禁
所以我們有必要使用隨機的 IP 地址來繞開這一層檢查。我們可以去找那些提供免費IP地址的網站,但是這些網站的免費代理IP基本上是不穩定的,隨時可能會更新,如果是自己小規模的爬取,可以使用免費代理IP。如果是那種大型的,就需要付費代理IP了。
1.1 urllib使用IP代理
import urllib.request
import random
ip_list = [
{'http':'61.135.217.7:80'},
{'http':'182.88.161.204:8123'}
]
proxy_handler = urllib.request.ProxyHandler(random.choice(ip_list))
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.httpbin.org/ip')
print(response.read().decode('utf-8'))
結果:
1.2 requests使用IP代理
使用requests添加代理也非常簡單,只要在請求的方法中(比如get或者post)傳遞proxies參數就可以了。
import requests
url = 'https://httpbin.org/get'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
proxy = {
'http':'222.217.124.162:8118'
}
resp = requests.get(url,headers=headers,proxies=proxy)
with open('ip.html','w',encoding='utf-8') as fp:
fp.write(resp.text)
結果:
ip.html:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
},
"origin": "183.14.76.230, 183.14.76.230",
"url": "https://httpbin.org/get"
}
2. cookie
我以前學java的時候學過cookie了,一直以為自己博客中也寫了,這里就來補充一下cookie基礎知識了。
2.1 什么是cookie
在網站中,http請求是無狀態的,也就是說即使第一次和服務器連接后并且登錄成功后,第二次請求服務器依然不能做到當前請求的是哪個用戶。cookie的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二層請求的時候,就會自動的把上一次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是誰了。cookie存儲的數據量郵箱,不同的瀏覽器有不同的存儲大小,但一般不超過4KB,因此使用cookie只能存儲少量的數據。
cookie的格式:
Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE
參數意義:
NAME:cookie的名字。
VALUE:cookie的值。
Expires:cookie的過期時間。
Path:cookie作用的路徑。
Domain:cookie作用的域名。
SECURE:是否只在https協議下起作用。
2.2 urllib操作cookie
一些需要登錄的網站,實際上就是因為沒有cookie信息。我們想要用代碼的形式訪問這種網站,就必須要有正確的cookie信息才能訪問。
最簡單的方法就是先使用瀏覽器,然后用抓包軟件將數據包中的cookie信息復制下來,放到headers中。
from urllib import request
targetUrl = 'http://www.baidu.com/'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
"Cookie": "BAIDUID=734868BB44ACDCE4FB2C49DB3AA14669:FG=1 for .baidu.com,BIDUPSID=734868BB44ACDCE4FC561F4D84999535 for .baidu.com,H_PS_PSSID=1429_21101_30211 for .baidu.com,PSTM=1576550373 for .baidu.com,delPer=0 for .baidu.com,BDSVRTM=0 for www.baidu.com,BD_HOME=0 for www.baidu.com"
}
reqObj = request.Request(url=targetUrl, headers=headers)
resp = request.urlopen(reqObj)
print(resp.read().decode('utf-8'))
但是每次在訪問需要cookie的頁面都要從瀏覽器中復制cookie比較麻煩。Python處理cookie,一般是通過http.cookiejar模塊和urllib模塊的HTTPCookieProcessor處理器類一起使用。http.cookiejar模塊主要作用是提供用于存儲cookie的對象。而HTTPCookieProcessor處理器主要作用是處理這些cookie對象,并構建handler對象。
http.cookiejar模塊主要的類有 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。這四個類的作用分別如下:
CookieJar
管理HTTPcookie的值、存儲HTTP請求生成的cookie、向傳出的HTTP請求添加cookie的對象。整個cookie都存儲在內存中,對CookieJar實例進行垃圾回收后cookie也將丟失。
FileCookieJar (filename, delayload=None, policy=None)
從CookieJar派生而來,用來創建FileCookieJar實例,檢索cookie信息并將cookie存儲到文件中。filename是存儲cookie的文件名。delayload為True時支持延遲訪問文件,即只有在需要時才讀取文件或在文件中存儲數據。
MozillaCookieJar (filename, delayload=None, policy=None)
從FileCookieJar派生而來,創建與Mozilla瀏覽器cookies.txt兼容的FileCookieJar實例。
LWPCookieJar (filename, delayload=None, policy=None)
從FileCookieJar派生而來,創建與libwww-per標準的Set-Cookie3文件格式兼容的FileCookieJar實例。
利用http.cookiejar和request.HTTPCookieProcessor獲取Cookie:
import urllib.request
import http.cookiejar
cookie = http.cookiejar.CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
for item in cookie:
print(item.name + '=' + item.value)
保存Cookie到本地文件,并調用本地文件來進行請求:
import urllib.request
import http.cookiejar
# 將 Cookie 保存到文件
cookie = http.cookiejar.MozillaCookieJar('cookie.txt')
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
cookie.save(ignore_discard=True,ignore_expires=True)
# 從文件讀取 Cookie 并添加到請求中
cookie2 = http.cookiejar.MozillaCookieJar()
cookie2 = cookie2.load('cookie.txt',ignore_discard=True,ignore_expires=True)
cookie_handler = urllib.request.HTTPCookieProcessor(cookie2)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
# 此時已經得到帶有 Cookie 請求返回的響應
2.3 requests操作cookie
和代理IP一樣,如果響應中包含了cookie,那么可以利用cookies屬性拿到這個返回的cookie值。
import requests
url = 'http://www.httpbin.org/cookies'
cookies = {
'name1':'value1',
'name2':'value2'
}
response = requests.get(url=url,cookies=cookies)
print(response.text)
session:
之前使用urllib庫,是可以使用opener發送多個請求,多個請求之間是可以共享cookie的。那么如果使用requests,也要達到共享cookie的目的,那么可以使用requests庫給我們提供的session對象。注意,這里的session不是Web開發中的那個session,這個地方只是一個會話的對象而已。
import requests
url = 'http://www.httpbin.org/cookies'
cookies = {
'name1':'value1',
'name2':'value2'
}
session = requests.session()
response = session.get(url=url,cookies=cookies)
print(response.text)
總結
以上是生活随笔為你收集整理的爬虫(五):代理IP、Cookie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10.一个圆柱形烟高8m,底面直径40c
- 下一篇: 人民公社酒1982年53度值多少钱