代理IP
许多网站都有反爬技术,或当爬虫使用同一个 IP 进行高速的信息爬取时,对方服务器可能会将这个 IP 禁止访问此网站。所以爬虫需要许多的 IP 来进行信息的爬取
代理的原理
在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到数据后,再转发给我们的代码
运用 ProxyHandler 实现代理 IP
我们可以使用 http://httpbin.org/ip 来查看我们的 IP
首先使用 urllib.request.ProxyHandler 来传入一个代理,这个代理是一个字典。字典的 key 以来与代理服务器能够接受的类型(http 或 https),value 是 ip:port ,例如:47.98.174.153:8118。
使用上一步创建的 handler,以及 request.build_opener 创建一个 opener 对象
使用上一步创建的 opener,调用 open 函数,发起请求
from urllib import request, parse
# url = 'http://httpbin.org/ip'
# resp = request.urlopen(url)
# print(resp.read())
handler = request.ProxyHandler({'http': '47.98.174.153:8118'})
opener = request.build_opener(handler)
resp = opener.open("http://httpbin.org/ip")
print(resp.read())
使用代理前:
使用代理后:
cookie
在网站里, http 请求是无状态的,在首次与服务器连接并成功登陆后,服务器识别出登陆者是谁,但当第二次登陆时,服务器无法识别登陆者是谁。而使用cookie可以解决这个问题,在第一次登陆后服务器会返回一些 cookie 信息给浏览器,浏览器会将这些信息保存在本地,当第二次发送请求时,浏览器会同时将 cookie 信息也传给服务器,从而帮助浏览器辨别使用者身份
cookie的格式
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
参数 | 意义 |
---|---|
NAME | cookie的名字 |
VALUE | cookie的值 |
Expires | cookie的过期时间 |
Path | cookie作用的路径 |
Domain | cookie作用的域名 |
SECURE | 是否只在 https 协议下起作用 |
使用cookie模拟登陆
访问 http://www.renren.com/971549574/profile 该用户的页面,在没有登陆的情况下,会直接返回人人网登陆页面
代码实现(只在 headers 中加入 User-Agent ):
from urllib import request
url = 'http://www.renren.com/971549574/profile'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
}
req = request.Request(url=url, headers=headers)
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
#with open('renren.html', 'w') as fp:
#fp.write(resp.read().decode('utf-8'))
可以发现,在没有登陆的情况下,输出的是登陆页面。
我们将 Cookie 信息加入到 headers 中,模拟已经登陆的情况
from urllib import request
url = 'http://www.renren.com/971549574/profile'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie': 'anonymid=jya2zl4g-2104r5; depovince=GW; _r01_=1; JSESSIONID=abcWSjOMBDkeOdM_DnkWw; ick_login=58aa36a7-870b-4655-a802-98dd3332d493; loginfrom=null; jebe_key=3cef8eed-8f1a-47f9-b527-cb33f9f50318%7C98922b0cc1a0e77016f939cddb439b6a%7C1563539605609%7C1%7C1563539607386; jebe_key=3cef8eed-8f1a-47f9-b527-cb33f9f50318%7C98922b0cc1a0e77016f939cddb439b6a%7C1563539605609%7C1%7C1563539607388; wp_fold=0; t=8f618e47c9c511b709b91d0d9567c6fd4; societyguester=8f618e47c9c511b709b91d0d9567c6fd4; id=971549574; xnsid=f5baadd0; jebecookies=e7c1fb71-f260-4ecb-95b2-18c50faba847|||||; ver=7.0'
}
req = request.Request(url=url, headers=headers)
resp = request.urlopen(req)
#print(resp.read().decode('utf-8'))
with open('renren.html', 'w', encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
可以发现我们直接能访问那个用户的页面
爬虫自动登陆访问授权页面
该模块主要的类为 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar
-
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
-
FileCookieJar:从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
-
MozillaCookieJar:从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
-
LWPCookieJar:从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
from urllib import request, parse from http.cookiejar import CookieJar # 创建cookiejar的对象 cookiejar = CookieJar() # 使用cookiejar创建一个HTTPCookieProcess对象 handler = request.HTTPCookieProcessor(cookiejar) # 使用上一步创建的handler创建一个opener opener = request.build_opener(handler) # 使用opener发送登陆的请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' } data = { 'email' : '123', 'password': '123' } url = 'http://www.renren.com/PLogin.do' req = request.Request(url=url, headers=headers, data=parse.urlencode(data).encode('utf-8')) opener.open(req) url1 = 'http://www.renren.com/971549574/profile' # 发送获取个人主页的页面的时候,不需要新建一个opener,因为之前那个opener已经包含了登陆所需要的cookie信息 # resp = opener.open(url1) req = request.Request(url=url1,headers=headers) resp = opener.open(req) with open('renren.html', 'w',encoding='utf-8') as fp: fp.write(resp.read().decode('utf-8'))
或写成
from urllib import request, parse
from http.cookiejar import CookieJar
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
def get_opener():
# 创建cookiejar的对象
cookiejar = CookieJar()
# 使用cookiejar创建一个HTTPCookieProcess对象
handler = request.HTTPCookieProcessor(cookiejar)
# 使用上一步创建的handler创建一个opener
opener = request.build_opener(handler)
# 使用opener发送登陆的请求
return opener
def login(opener):
data = {
'email' : '123',
'password': '123'
}
url = 'http://www.renren.com/PLogin.do'
req = request.Request(url=url, headers=headers, data=parse.urlencode(data).encode('utf-8'))
opener.open(req)
def visit(opener):
url1 = 'http://www.renren.com/971549574/profile'
# 发送获取个人主页的页面的时候,不需要新建一个opener,因为之前那个opener已经包含了登陆所需要的cookie信息
# resp = opener.open(url1)
req = request.Request(url=url1,headers=headers)
resp = opener.open(req)
with open('renren.html', 'w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
if __name__ == '__main__':
opener = get_opener()
login(opener)
visit(opener)