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 strip()函数 介绍
May 24 Python
Python中的字典遍历备忘
Jan 17 Python
python通过线程实现定时器timer的方法
Mar 16 Python
Python中实现参数类型检查的简单方法
Apr 21 Python
python去除空格和换行符的实现方法(推荐)
Jan 04 Python
Python函数式编程
Jul 20 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
Python微医挂号网医生数据抓取
Jan 24 Python
python Event事件、进程池与线程池、协程解析
Oct 25 Python
python实现图片上添加图片
Nov 26 Python
使用pytorch实现论文中的unet网络
Jun 24 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 Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
php导入导出excel实例
2013/10/25 PHP
php排序算法实例分析
2016/10/17 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Python批量修改文件后缀的方法
2014/01/26 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Pandas时间序列:时期(period)及其算术运算详解
2020/02/25 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
三维科技面试题
2013/07/27 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
车间工艺员岗位职责
2013/12/09 职场文书
迟到检讨书800字
2014/01/13 职场文书
八项规定整改方案
2014/02/21 职场文书
科学发展观活动总结
2014/08/28 职场文书
python随机打印成绩排名表
2021/06/23 Python