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 随机数生成的代码的详细分析
May 15 Python
在Python的web框架中配置app的教程
Apr 30 Python
python监控文件或目录变化
Jun 07 Python
python图像常规操作
Nov 11 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
python实现车牌识别的示例代码
Aug 05 Python
Python 项目转化为so文件实例
Dec 23 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
Jun 05 Python
pytorch 中forward 的用法与解释说明
Feb 26 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP include_path设置技巧分享
2011/07/03 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
JSONP 跨域共享信息
2012/08/16 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
如何处理JSON中的特殊字符
2016/11/30 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python3访问并下载网页内容的方法
2015/07/28 Python
Python yield 使用方法浅析
2017/05/20 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
《猫》教学反思
2014/02/26 职场文书
班级学习计划书
2014/04/27 职场文书
银行求职自荐信
2014/06/30 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
导游词怎么写
2015/02/04 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python