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 字符串中的字符倒转
Sep 06 Python
python实现目录树生成示例
Mar 28 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
python英语单词测试小程序代码实例
Sep 09 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
Python log模块logging记录打印用法解析
Jan 20 Python
Python中格式化字符串的四种实现
May 26 Python
使用python实现名片管理系统
Jun 18 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 Python
Python函数中的不定长参数相关知识总结
Jun 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
PHP中ADODB类详解
2008/03/25 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
javascript定义函数的方法
2010/12/06 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
浅析vue-router原理
2018/10/19 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
详细解析Python中的变量的数据类型
2015/05/13 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python实现微信小程序自动回复
2018/09/10 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
为什么称python为胶水语言
2020/06/16 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
智能钱包:Ekster
2019/11/21 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
营销总经理岗位职责
2014/02/02 职场文书
品牌宣传方案
2014/03/21 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python