Scrapy实现模拟登录的示例代码


Posted in Python onFebruary 21, 2021

为什么要模拟登录

有些网站是需要登录之后才能访问的,即便是同一个网站,在用户登录前后页面所展示的内容也可能会大不相同,例如,未登录时访问Github首页将会是以下的注册页面:

Scrapy实现模拟登录的示例代码

然而,登录后访问Github首页将包含如下页面内容:

Scrapy实现模拟登录的示例代码

如果我们要爬取的是一些需要登录之后才能访问的页面数据就需要模拟登录了。通常我们都是利用的 Cookies 来实现模拟登录,在Scrapy中,模拟登陆网站一般有如下两种实现方式:

           (1) 请求时携带Cookies

           (2) 发送Post请求获取Cookies

请求时携带Cookies

对于一些Cookies过期时间很长的不规范网站,如果我们能够在Cookies过期之前爬取到所有我们想要的数据,可以考虑在请求时直接将Cookies信息带上来模拟用户登录。

以下是模拟登录Github的示例代码:

# -*- coding: utf-8 -*-
import scrapy
import re
 
class TmallLoginSpider(scrapy.Spider):
  name = 'github_login3'
  allowed_domains = ['github.com']
  start_urls = ['https://github.com/']
 
  def start_requests(self): # 请求时携带Cookies
    cookies = '_ga=GA1.2.363045452.1554860671; tz=Asia%2FShanghai; _octo=GH1.1.1405577398.1554860677; _device_id=ee3ff12512668a1f9dc6fb33e388ea20; ignored_unsupported_browser_notice=false; has_recent_activity=1; user_session=5oxrsfsZCor1iJFCgRXXyeAXd8hcmzEUGh70-xHWLjQkT62Q; __Host-user_session_same_site=5oxrsfsZCor1iJFCgRXXyeAXd8hcmzEUGh70-xHWLjQkT62Q; logged_in=yes; dotcom_user=pengjunlee; _gat=1'
    cookies = {i.split('=')[0]: i.split('=')[1] for i in cookies.split('; ')}
    yield scrapy.Request(self.start_urls[0], cookies=cookies)
    
  def parse(self, response): # 验证是否请求成功
    print(re.findall('Learn Git and GitHub without any code!',response.body.decode()))

执行爬虫后,后台部分日志截图如下:

Scrapy实现模拟登录的示例代码

发送Post请求模拟登录

Scrapy还提供了两种通过发送Post请求来获取Cookies的方法。

scrapy.FormRequest()

使用scrapy.FormRequest()发送Post请求实现模拟登陆,需要人为找出登录请求的地址以及构造出登录时所需的请求数据。

使用scrapy.FormRequest()模拟登录Github的示例代码: 

# -*- coding: utf-8 -*-
import scrapy
import re
 
class GithubLoginSpider(scrapy.Spider):
  name = 'github_login'
  allowed_domains = ['github.com']
  start_urls = ['https://github.com/login']
 
  def parse(self, response): # 发送Post请求获取Cookies
    authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract_first()
    utf8 = response.xpath('//input[@name="utf8"]/@value').extract_first()
    commit = response.xpath('//input[@name="commit"]/@value').extract_first()
    form_data = {
      'login': 'pengjunlee@163.com',
      'password': '123456',
      'webauthn-support': 'supported',
      'authenticity_token': authenticity_token,
      'utf8': utf8,
      'commit': commit}
    yield scrapy.FormRequest("https://github.com/session", formdata=form_data, callback=self.after_login)
 
  def after_login(self, response): # 验证是否请求成功
    print(re.findall('Learn Git and GitHub without any code!', response.body.decode()))

从后台日志不难看出,Scrapy 在请求完 https://github.com/session 后,自动帮我们重定向到了Github首页。

Scrapy实现模拟登录的示例代码

scrapy.FormRequest.from_response()

scrapy.FormRequest.from_response()使用起来比 scrapy.FormRequest()更加简单方便,我们通常只需要提供用户相关信息(账户和密码)即可,scrapy.FormRequest.from_response()将通过模拟点击为我们填充好其他的表单字段并提交表单。

使用scrapy.FormRequest.from_response()模拟登录Github的示例代码: 

# -*- coding: utf-8 -*-
import scrapy
import re
 
class GithubLogin2Spider(scrapy.Spider):
  name = 'github_login2'
  allowed_domains = ['github.com']
  start_urls = ['https://github.com/login']
 
  def parse(self, response): # 发送Post请求获取Cookies
    form_data = {
      'login': 'pengjunlee@163.com',
      'password': '123456'
    }
    yield scrapy.FormRequest.from_response(response,formdata=form_data,callback=self.after_login)
 
  def after_login(self,response): # 验证是否请求成功
    print(re.findall('Learn Git and GitHub without any code!',response.body.decode()))

scrapy.FormRequest.from_response()方法还可以传入其他参数来帮我们更加精确的指定表单元素:

'''
response (Response object) ? 包含表单HTML的响应,将用来对表单的字段进行预填充
formname (string) ? 如果设置了该值,name 等于该值的表单将被使用
formid (string) ? 如果设置了该值,id 等于该值的表单将被使用
formxpath (string) ? 如果设置了该值,匹配该 xpath 的第一个表单将被使用
formcss (string) ? 如果设置了该值,匹配该 css选择器的第一个表单将被使用
formnumber (integer) ? 索引值等于该值的表单将被使用,默认第一个(索引值为 0 )
formdata (dict) ? 传入的表单数据,将覆盖form 元素中已经存在的值
clickdata (dict) ? 用于查找可点击控件的属性值
dont_click (boolean) ? 如果设置为 True,将不点击任何元素,直接提交表单数据
'''

参考文章

https://doc.scrapy.org/en/latest/topics/request-response.html

到此这篇关于Scrapy实现模拟登录的示例代码的文章就介绍到这了,更多相关Scrapy 模拟登录内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python进程间通信用法实例
Jun 04 Python
python如何查看系统网络流量的信息
Sep 12 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
python爬取足球直播吧五大联赛积分榜
Jun 13 Python
python中map的基本用法示例
Sep 10 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
pyqt5实现登录界面的模板
May 30 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
Aug 05 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
python集合的新增元素方法整理
Dec 07 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 Python
scrapy-splash简单使用详解
Feb 21 #Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 #Python
利用Python如何画一颗心、小人发射爱心
Feb 21 #Python
python 第三方库paramiko的常用方式
Feb 20 #Python
Python中Qslider控件实操详解
Feb 20 #Python
python基于selenium爬取斗鱼弹幕
Feb 20 #Python
Python爬虫+Tkinter制作一个翻译软件的示例
Feb 20 #Python
You might like
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
php如何调用webservice应用介绍
2012/11/24 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
js数组操作常用方法
2014/05/08 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
python字符串,数值计算
2016/10/05 Python
详谈python http长连接客户端
2017/06/12 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
Numpy数组的广播机制的实现
2020/11/03 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
台湾良兴购物网:EcLife
2019/12/01 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python
Spring 使用注解开发
2022/05/20 Java/Android