您当前的位置:首页 > 计算机 > 编程开发 > Python

python爬虫 --cookie模拟登录后抓取数据

时间:03-29来源:作者:点击数:
适用网站及场景

抓取需要登录才能访问的页面:有的网站你得登进去才能看到页面,直接访问网页地址会给你跳转到登录页面

cookie和session机制

Http协议为无连接协议

cookie存放在客户端浏览器,session存放在web服务器

方法一:requests.get()中参数headers参数中携带你的cookie
  1. 先登录成功1次,获取到携带登录信息的cookie:登录成功–个人主页–F12抓包–刷新个人主页抓包–一般会在前几个包中有你的cookie信息
  2. 携带着cookie发请求
抓取人人网资源示例
import requests
from lxml import etree	#用于解析html

class RenRenLogin(objects):
	def __init__(self):
		self.url = 'http://www.renren.com/xxxxxx/profile'	#你自己登上去的人人网个人主页
		self.headers = {
			'Cookie':'xxxx',		#你登陆后自己的cookie
			'User-Agent':xxx	#自己选一个User-Agent
			}

	#发起请求并解析
	def parse_html(self):
		html = requets.get(url=self.url,	#请求的网页url
				   headers=self.headers).text	#requests模块的text属性获取响应内容
		p = etree.HTML(html)	#创建解析对象
		#xpath表达式(随便找个你想抓下来的节点内容,我们的目的是测试cookie)
		xpath_bds = '/html/body/div[3]/div/div[5]/div[2]/div[1]/div/div[2]/div[4]/div[1]/div[1]/div/div/div[1]/article/section/div/form/div/dl/dd[3]/a/text()'
		#解析对象调用xpath解析
		r_list = p.xpath(xpath_bds)
		print(r_list)

	#入口函数
	def run(self):
		self.parse_html()

if __name__  == '__main__':
	spider = RenRenLogin()
	spider.run()
方法二:requests.get()中使用cookies参数(需要将cookies处理成字典)
  1. 拿到cookie字符串
  2. 将cookie转成字典
  3. 发requests.get()请求时发携带cookies
import requests
from lxml import etree #用于解析html

class RenRenLogin(objects):
	def __init__(self):
		self.url = 'http://www.renren.com/xxxxxx/profile' #你自己登上去的人人网个人主页
		self.headers = {
			#第一种方法这样写:'Cookie':'xxxx',  #你登陆后自己的cookie
			'User-Agent':xxx #自己选一个User-Agent
			}
			
	#将你拿到的cookies整理成字典形式			
	def get_cookies(self):
		#手动登录页面后去拿你的cookies
		cook_str = 'xxx'	#你拿到的cookie是{xxx=xxx;xxx=xxx;...}格式
		#将你拿到的cookies处理成字典
		cookies = {}
		#将cook_str处理成['xxx=xxx','xxx=xxx'...]
		cook_lsit = cook_str.split(';')
		#再处理成字典的形式{xxx:xxx,xxx:xxx/...}
		for cook in cook_list:
			key = cook.split('=')[0]
			val = cook.split('=')[1]
			#创建新的键值对
			cookies[key] = val
		return cookies		
	
	def parse_html(self):
		#将拿到的cookies字符串处理成字典
		cookies = self.get_cookies()
		html = requests.get(
				url=self.url,
				headers=self.headers,
				cookies=cookies
				).text
	
		#以下开始解析并输出,和前面的代码步骤一样,不再赘述
方法三:requests模块提供了session类(和网站的session不是一个东西),来实现客户端和服务端的会话保持

详细流程

  1. 寻找登录时的Form表单提交信息的目标地址:action=‘xxx’(查看网页中form元素节点,拿到action='xxx’这个地址)
  2. 实例化session对象:session = requests.session()
  3. 发送用户名和信息到POST的地址
    1. 用户名和密码是以字典发送的,键为标签中name的值(email,password),值为真实的用户名和密码:post_data = {‘email’:‘xx’,‘password’:‘xx’}
  4. 登录网站:session对象发送请求,登录对应网站,把cookie保存在session对象:session.post()
  5. 访问页面抓取数资源:session对象请求需要登录才能访问的页面,session能够自动携带之前的这个cookie,进行请求
import requests

class RenRenLogin:
	def __init__(self):
		#登录页面
		self.post_url = 'http://www.renren.com/PLogin.do'
		#个人主页的url地址
		self.get_url = 'http://www.renren.com/xxxxxx/profile'
		self.headers = {'User-Agent':'xx'}
		
		#实例化session对象
		self.session = requests.sesison()

	#解析过程
	def parse_html(self):
		#1.先登录
		#键:email和password为form标签中的 <input>标签的name
		#值:为你真实的账号和密码
		data = {'email':'','password':''}
		#使用session对象发登录请求
		self.session.post(url=self.post_url,data=data,headers=self.headers}
		#2. 再抓取
		html = self.session.get(url=self.get_url).text
		print(html)

	def run(self):
		self.parse_html()

if __name__ == '__main__':
	spider = RenRenLogin()
	spider.run()
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门