本文记录自己在学习爬虫的路上遇到的比较有用的知识点,分享出来供大家一起学习
http.cookiejar库之CookieJar
CookieJar和HTTPCookieProcessor
我们在使用爬虫的时候,经常会用到cookie进行模拟登陆和访问。在使用urllib库做爬虫,我们需要借助http.cookiejar库中的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-perl标准的Set-Cookie3 文件格式兼容的FileCookieJar实例。
其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()。当然,如果我们对cookie有定制的需要,那么我们也要借助HTTPCookieProcess处理器来处理。具体看下面代码。
1、登录后直接添加Cookie
该方法简单粗暴,最简单也是最有效。以人人网为例,代码如下:
from urllib import request
# 直接添加使用cookie
dapeng_url='http://www.renren.com/880151247/profile'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
'Cookie':'anonymid=khkiznf5-7c52d5; depovince=HEN; jebecookies=2dd8d6fa-0e86-4413-ae7d-49bdcb5cad36|||||; _r01_=1; ick_login=b9539ae2-29cb-45f4-b50b-5007c19e651e; taihe_bi_sdk_uid=6a6851b67076bd8a275817a06e18f92f; taihe_bi_sdk_session=4610e6c68a5a8f32aaeca524e411282a; t=9cad4d94e2e0844d2349513cfecd8a3c8; societyguester=9cad4d94e2e0844d2349513cfecd8a3c8; id=975409048; xnsid=2eeaf6b9; ver=7.0; loginfrom=null; JSESSIONID=abcZyK1nfCxVk6Qq_frxx; wp-win=1605530805558-1605530805559'
}
req=request.Request(url=dapeng_url,headers=headers)
resp=request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('renren.html','w',encoding='utf-8') as fp:
# write必须写入str
fp.write(resp.read().decode('utf-8'))
这里我们查看返回结果,查看后没问题
2、自动登录获取返回的Cookie
1.登录过程
注意:这里email,password需自己设置,就是登录账号和密码
# 1.1创建一个cookiejar对象
cookiejar=CookieJar()
#1.2使用cookiejaz创建一个HTTPCookieProcess对象
handler=request.HTTPCookieProcessor(cookiejar)
# #1.3使用上一步创建的handler创建一个opener
opener=request.build_opener(handler)
# 1.4使用opener发送登录的请求(人人网的邮箱和密码)
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0'
}
data={
'email':'XXXXXX',
'password':'XXXXXX'
}
login_url='http://www.renren.com/PLogin.do'
req=request.Request(url=login_url,headers=headers,data=parse.urlencode(data).encode('utf-8'))
opener.open(req)
2.访问个人主页
注意:获取个人主页的页面的时候,不要新建一个opener,而应该使用之前的那个opener,因为之前的那个opener已经包含了登录所需要的cookie信息
dapeng_url='http://www.renren.com/880151247/profile'
req=request.Request(url=dapeng_url,headers=headers)
resp=opener.open(req)
with open('renren.html','w',encoding='utf-8') as fp:
# write必须写入str
fp.write(resp.read().decode('utf-8'))
3.完整代码(封装函数)
#-*- coding:utf-8 -*-
__date__ = '2020/11/16 23:18'
from urllib import request,parse
from http.cookiejar import CookieJar
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0'
}
def get_open():
# 1.登录
# 1.1创建一个cookiejar对象
cookiejar=CookieJar()
#1.2使用cookiejaz创建一个HTTPCookieProcess对象
handler=request.HTTPCookieProcessor(cookiejar)
# #1.3使用上一步创建的handler创建一个opener
opener=request.build_opener(handler)
return opener
def login_renren(opener):
# 1.4使用opener发送登录的请求(人人网的邮箱和密码)
data={
'email':'XXXXXX',
'password':'XXXXXX'
}
login_url='http://www.renren.com/PLogin.do'
req=request.Request(url=login_url,headers=headers,data=parse.urlencode(data).encode('utf-8'))
opener.open(req)
def visit_profile(opener):
# 2.访问个人主页
dapeng_url='http://www.renren.com/880151247/profile'
req=request.Request(url=dapeng_url,headers=headers)
resp=opener.open(req)
with open('renren.html','w',encoding='utf-8') as fp:
# write必须写入str
fp.write(resp.read().decode('utf-8'))
if __name__ == '__main__':
opener=get_open()
login_renren(opener)
visit_profile(opener)