cookie 适用于抓取需要登录才能访问的页面网站
cookie 和 session 机制
http 协议为无连接协议, cookie: 存放在客户端浏览器, session: 存放在 web 服务器
人人网登录案例
方法一: 登录网站手动抓取 Cookie
1, 先登录成功 1 次, 获取到携带登陆信息的 Cookie
登录成功 - 个人主页 (http://www.renren.com/971989504/profile) - F12 抓包 - 刷新个人主页 - 找到主页的包 (home)
一般 cookie 都在 all--> home 数据包中,
2, 携带着 cookie 发请求
- import requests
- class RenRenLogin(object):
- def __init__(self):
- # url 为需要登录才能正常访问的地址
- self.url = 'http://www.renren.com/967469305/profile'
- # headers 中的 cookie 为登录成功后抓取到的 cookie
- self.headers = {
- # 此处注意 cookie, 要自己抓取
- "Cookie": "xxx",
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
- }
- # 获取个人主页响应
- def get_html(self):
- HTML = requests.get(url=self.url,headers=self.headers,verify=False).text
- print(HTML)
- self.parse_html(HTML)
- # 可获取并解析整个人人网内需要登录才能访问的地址
- def parse_html(self,HTML):
- pass
- if __name__ == '__main__':
- spider = RenRenLogin()
- spider.get_html()
方法二: requests 模块处理 Cookie
requests 模块提供了 session 类, 来实现客户端和服务端的会话保持
1, 实例化 session 对象
session = requests.session()
2, 让 session 对象发送 get 或者 post 请求
- res = session.post(url=url,data=data,headers=headers)
- res = session.get(url=url,headers=headers)
3. 思路梳理
浏览器原理: 访问需要登录的页面会带着之前登录过的 cookie
程序原理: 同样带着之前登录的 cookie 去访问 - 由 session 对象完成
1, 实例化 session 对象
2, 登录网站: session 对象发送请求, 登录对应网站, 把 cookie 保存在 session 对象中
3, 访问页面: session 对象请求需要登录才能访问的页面, session 能够自动携带之前的这个 cookie, 进行请求
具体步骤
1, 寻找登录时 POST 的地址
在登陆界面查看网页源码, 查看 form 表单, 找 action 对应的地址: http://www.renren.com/PLogin.do
2, 发送用户名和密码信息到 POST 的地址
* 用户名和密码信息以字典的方式发送
键 :<input > 标签中 name 的值 (email,password)
值 : 真实的用户名和密码
post_data = {'email':'','password':''}
程序实现
1, 先 POST: 把用户名和密码信息 POST 到某个地址中
2, 再 GET: 正常请求去获取页面信息
- import requests
- from lxml import etree
- class RenrenSpider(object):
- def __init__(self):
- self.post_url = 'http://www.renren.com/PLogin.do'
- self.get_url = 'http://www.renren.com/967469305/profile'
- # email 和 password 为 < input > 节点中 name 的属性值
- self.form_data = {
- 'email': '******', # 用户名
- 'password': '*******'} # 密码
- self.session = requests.session() # 实例化 session 会话保持对象
- self.headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
- 'Referer': 'http://www.renren.com/SysHome.do'}
- # 先 post 再 get
- def get_html(self):
- # 先 POST, 把用户名和密码信息 POST 到一个地址
- self.session.post(url=self.post_url, data=self.form_data, headers=self.headers)
- # 再 session.get() 个人主页
- HTML = self.session.get(url=self.get_url, headers=self.headers).text
- self.parse_html(HTML)
- def parse_html(self, HTML):
- parse_html = etree.HTML(HTML)
- r_list = parse_html.xpath('//li[@class="school"]/span/text()')
- print(r_list)
- if __name__ == '__main__':
- spider = RenrenSpider()
- spider.get_html()
方法三
1, 把抓取到的 cookie 处理为字典
2, 使用 requests.get() 中的参数: cookies
- import requests
- from lxml import etree
- class RenrenLogin(object):
- def __init__(self):
- # url 为需要登录才能正常访问的地址
- self.url = 'http://www.renren.com/967469305/profile'
- self.headers = {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
- # 将字符串 cookie 转为字典格式
- def get_cookie_dict(self):
- cookie_dict = {}
- cookies = 'td_cookie=18446744073093166409; anonymid=jzc3yiknvd9kwr; depovince=GW; jebecookies=67976425-f482-44a7-9668-0469a6a14d16|||||; _r01_=1; JSESSIONID=abcp_jUgWA4RdcgwXqtYw; ick_login=f502b729-d6cb-4085-8d74-4308a0a8a17d; _de=4DBCFCC17D9E50C8C92BCDC45CC5C3B7; p=cae86d9f12c5a1ba30901ad3d6ac992f5; first_login_flag=1; ln_uact=13603263409; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20181101/1550/h_main_qz3H_61ec0009c3901986.jpg; t=6d191b90a0236cea74f99b9d88d3fbd25; societyguester=6d191b90a0236cea74f99b9d88d3fbd25; id=967469305; xnsid=6cbc5509; ver=7.0; loginfrom=null; jebe_key=bd6eb791-92b2-4141-b8ed-53d17551d830|2012cb2155debcd0710a4bf5a73220e8|1565838783310|1|1565838784555; jebe_key=bd6eb791-92b2-4141-b8ed-53d17551d830|2012cb2155debcd0710a4bf5a73220e8|1565838783310|1|1565838784558; wp_fold=0'
- for kv in cookies.split(';'):
- # kv: 'td_cookie=184xxx'
- key = kv.split('=')[0]
- value = kv.split('=')[1]
- cookie_dict[key] = value
- return cookie_dict
- # 获取个人主页响应
- def get_html(self):
- # 获取 cookies
- cookies = self.get_cookie_dict()
- print(cookies)
- HTML = requests.get(url=self.url, headers=self.headers, cookies=cookies, ).text
- self.parse_html(HTML)
- # 可获取并解析整个人人网内需要登录才能访问的地址
- def parse_html(self, HTML):
- parse_html = etree.HTML(HTML)
- r_list = parse_html.xpath('//*[@id="operate_area"]/div[1]/ul/li[1]/span/text()')
- print(r_list)
- if __name__ == '__main__':
- spider = RenrenLogin()
- spider.get_html()
来源: https://www.cnblogs.com/LXP-Never/p/11385875.html