python爬虫框架scrapy实现模拟登录操作示例


Posted in Python onAugust 02, 2018

本文实例讲述了python爬虫框架scrapy实现模拟登录操作。分享给大家供大家参考,具体如下:

一、背景:

初来乍到的pythoner,刚开始的时候觉得所有的网站无非就是分析HTML、json数据,但是忽略了很多的一个问题,有很多的网站为了反爬虫,除了需要高可用代理IP地址池外,还需要登录。例如知乎,很多信息都是需要登录以后才能爬取,但是频繁登录后就会出现验证码(有些网站直接就让你输入验证码),这就坑了,毕竟运维同学很辛苦,该反的还得反,那我们怎么办呢?这不说验证码的事儿,你可以自己手动输入验证,或者直接用云打码平台,这里我们介绍一个scrapy的登录用法。

 测试登录地址:http://example.webscraping.com/places/default/user/login

 测试主页:http://example.webscraping.com/user/profile

1、这里不在叙述如何创建scrapy项目和spider,可以看前面的相关文章

二、快速登录方法

我们在这里做了一个简单的介绍,我们都知道scrapy的基本请求流程是start_request方法遍历start_urls列表,然后make_requests_from_url方法,里面执行Request方法,请求start_urls里面的地址,但是这里我们用的不再是GET方法,而用的是POST方法,也就常说的登录。

1、首先我们改写start_reqeusts方法,直接GET登录页面的HTML信息(有些人说你不是POST登录么,干嘛还GET,别着急,你得先GET到登录页面的登录信息,才知道登录的账户、密码等怎么提交,往哪里提交)

2、start_request方法GET到数据后,用callback参数,执行拿到response后要接下来执行哪个方法,然后在login方法里面写入登录用户名和密码(还是老样子,一定要用dict),然后只用Request子类scrapy.FormRequest这个方法提交数据,这我一个的是FormRequest.from_response方法。

有些人会问,这个from__response的基本使用是条用是需要传入一个response对象作为第一个参数,这个方法会从页面中form表单中,帮助用户创建FormRequest对象,最最最最重要的是它会帮你把隐藏的input标签中的信息自动跳入表达,使用这个中方法,我们直接写用户名和密码即可,我们在最后面再介绍传统方法。

3、parse_login方法是提交完表单后callback回调函数指定要执行的方法,为了验证是否成功。这里我们直接在response中搜索Welcome Liu这个字眼就证明登录成功。这个好理解,重点是yield  from super().start_resquests(),这个代表着如果一旦登录成功后,就直接带着登录成功后Cookie值,方法start_urls里面的地址。这样的话登录成功后的response可以直接在parse里面写。

# -*- coding: utf-8 -*-
import scrapy
from scrapy import FormRequest,Request
class ExampleLoginSpider(scrapy.Spider):
  name = "login_"
  allowed_domains = ["example.webscraping.com"]
  start_urls = ['http://example.webscraping.com/user/profile']
  login_url = 'http://example.webscraping.com/places/default/user/login'
  def parse(self, response):
    print(response.text)
  def start_requests(self):
    yield scrapy.Request(self.login_url,callback=self.login)
  def login(self,response):
    formdata = {
      'email':'liushuo@webscraping.com','password':'12345678'}
    yield FormRequest.from_response(response,formdata=formdata,
                    callback=self.parse_login)
  def parse_login(self,response):
    # print('>>>>>>>>'+response.text)
    if 'Welcome Liu' in response.text:
      yield from super().start_requests()

有的同学可能问了,login方法里面不是应该写reture 么,其实上面的写法跟下面的这种写法是一样效果,如果再有个CSRF的话,也可以直接在login里面写拿到CSRF信息,写入到formdata里面跟用户名和密码一起提交。

return [FormRequest.from_response(response,formdata=formdata,callback=self.parse_login)]

登录成功

python爬虫框架scrapy实现模拟登录操作示例

三、传统登录方法:

1、首先要明确一件事情,一般情况下需要登录的网站,不只需要登录用户和密码,接下来我们聊聊上面说的传统登录模式。用户在登录的时候并不是只需要登录账户信息,除了常见直观的验证码和CSRF信息外,也有可能需要提交其它信息,我们必须把它们都提取到一起提交给服务器。

python爬虫框架scrapy实现模拟登录操作示例

2、我们在form表单下面找到了一个display:none的div标签,里面的input标签的value值正好是我们要提交的数据,那我们就提取到他。

python爬虫框架scrapy实现模拟登录操作示例

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
用Python解决计数原理问题的方法
Aug 04 Python
python list排序的两种方法及实例讲解
Mar 20 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
python初步实现word2vec操作
Jun 09 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 #Python
Python列表推导式与生成器用法分析
Aug 02 #Python
python flask实现分页的示例代码
Aug 02 #Python
Django分页查询并返回jsons数据(中文乱码解决方法)
Aug 02 #Python
Python实现正整数分解质因数操作示例
Aug 01 #Python
Python列表生成式与生成器操作示例
Aug 01 #Python
Python开发最牛逼的IDE——pycharm
Aug 01 #Python
You might like
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
js 窗口抖动示例
2013/09/04 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
对Python 数组的切片操作详解
2018/07/02 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
python 制作本地应用搜索工具
2021/02/27 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
财务人员个人自荐信范文
2013/09/26 职场文书
魅力教师事迹材料
2014/01/10 职场文书
考试不及格的检讨书
2014/01/22 职场文书
马智宇结婚主持词
2014/04/01 职场文书
停车位租赁协议书
2014/09/24 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
员工工作心得体会
2019/05/07 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
搭建Yolov5服务器
2022/04/30 Servers
vue如何清除浏览器历史栈
2022/05/25 Vue.js