目前,大部分网站都具有用户登陆功能,其中某些网站只有在用户登陆后才能获得有价值的信息,在爬取这类网站时,Scrapy 爬虫程序先模拟登陆,再爬取内容

1、登陆实质

  其核心是想服务器发送含有登陆表单数据的 HTTP 请求(通常是POST)

2、使用 FormRequest

  Scrapy 提供了一个FormRequest(Request 的子类),专门用于含有表单数据的请求,FormRequest 的构造方法有一个 formdata 参数,接收字典形式的表单数据。

  有两方法可以构造 FormRequest 对象

  (1)直接构造

    <1> 先提取 3 个隐藏在<inout>中包含的信息

    <2> 构造表单数据

    <3> 填写账号和密码信息

  (2)简单方式

    即调用 FormRequest 的 form_response 方法,调用时传入一个 Response 对象作为第一个参数,该方法会解析 Response 对象所包含页面中的<from>元素,帮助用户创建FormRequest 对象,并将隐藏<input> 中的信息自动填入表单数据,使用这种方法,我们只需要通过 formdata 参数填写账号和密码即可:

  

>>> fd = {'email': 'junchuanzhang@webscraping.com', 'password': }
>>> request = FromRequest.from_response(response, fromdata = fd)

3、实现登陆的 Spide


import scrap

from http.http import Request , FormRequest


class LoginSpider(scrapy.Spider):
name = 'login'
allowed_domains = ['example.webscraping.com']
start_urls = ['http:?/example.websrcaping.com/user/login'] def parse(self, response):
# 解析登陆后下载的页面,此例中是用户个人信息
    keys = response.css('table lable::text').re('*').extractor()
    values = response.css(''table td.w2p_fw::text).extractor()  
    
    yield dict(zip(keys, values))   # --------------------登陆-------------------
  #登陆页面的url
  login_url = 'http://example.websracping.com/user/login'   def start_requests(self):
    yield Request(self.login_url, callback=self.login)   def login(self, response):
    # 登陆页面的解析函数,构造FormRequest 对象提交表单
     fd = {'email': 'junchuanzhang@webscraping.com', 'password': 123456}
   request = FromRequest.from_response(response, fromdata = fd, callback=self.parse_login)   def parse_login(self, response):
    # 登陆成功后, 继续爬取 start_url 中的页面
    if 'Welcome Liu' in response.text:
      yield from super().start_requests()


  

解析上述代码如下:

  (1)覆盖基类的 start_requests 方法,最先请求登录页面

  (2)login 方法为登录页面的解析函数,在该方法中进行模拟登录,构造表单请求并提交。

  (3)parse_login 方法为表单请求的响应处理函数,在该方法中通过在页面查找特殊字符串“Welcome Liu” 判断是否登录成功

    如果成功,调用基类的 start_requests 方法,继续爬取 start_urls 中的页面。

  这样设计 LoginSpider 就是想把模拟登录和爬取内容的代码分离开,使得逻辑上更加清晰。

4、识别验证码

  目前,很多网站为了防止爬虫爬取,登录是需要用户输入验证码

  下面我们学习如何在爬虫程序中识别验证码(在举例过程中不知名具体网站)

页面中的图片对应一个 <img> 元素,即一张图片,浏览器加载完登录页面后,会携带之前访问获取的Cookie信息,继续发送一个HTTP请求加载验证码图片,

和账号密码输入框一样,验证码输入框也对应一个<input>元素,因此用户输入的验证码会成为表单数据的一部分,表单提交后有网站服务器程序验证,

  识别验证码有多种方式,下面解说常用的几种。

  (1) OCR识别

  (2)网络识别平台

  (3)人工识别

    

5、Cookie 登录

  目前网站的验证码越来越复杂,某些验证码已经复杂到人类那一识别的程度,有些时候提交表单的路子那一走通,此时,我们可以换一种登录爬取的思路,在使用浏览器登录网站后,包含用户身份的信息的Cookie会被浏览器保存在本地,如果 Scrapy 爬虫能直接使用浏览器中的 Cookie 发送 HTTP 请求,就可以绕过提交表单登录的步骤。

  1、获取浏览器 Cookie

  我们无需费心钻研,各种浏览器将 Cookie 以哪种形式存储在哪里,使用第三方 Python 库 browercookie 便可以获取 Chrome 和 Firefox浏览器中的 Cookie

  使用 pip 安装 browercookie :
  

pip install browsercookie

  browsercookie 的使用非常简单,实例代码如下:

  

>>> import browsercookie
>>>chrome_cookiejar = browsercookie.chrome()
>>>fire_cookiejar = browsercookie.firefox()
>>>type(chrome_cookiejar)
<class 'http.cookiejar.CookieJar'>

browsercookie的Chrome和Firefox方法分别返回 Chrome 和 Firefox 浏览器中的 Cookie,返回值是一个http.cookiejar.Cookiejar对象,对 cookiejar 对象进行迭代,可以访问其中的Cookie对象。

总结一下

  1、如何使用 FormRequest 提交登陆表单的模拟登录

  2、讲解识别验证码的 3 中方式

  3、如何使用浏览器 Cookie 直接登录

Scrapy 中的模拟登陆的更多相关文章

  1. python之scrapy携带Cookies模拟登陆

    知识点 """ scrapy两种模拟登陆: 1.直接携带cookie 2.找到发送post请求的url地址,带上信息,发送请求 应用场景: 1.cookie过期时间很长, ...

  2. Scrapy 模拟登陆知乎--抓取热点话题

    工具准备 在开始之前,请确保 scrpay 正确安装,手头有一款简洁而强大的浏览器, 若是你有使用 postman 那就更好了.           Python   1 scrapy genspid ...

  3. scrapy爬取某网站,模拟登陆过程中遇到的那些坑

    本节内容 在访问网站的时候,我们经常遇到有些页面必须用户登录才能访问.这个时候我们之前写的傻傻的爬虫就被ban在门外了.所以本节,我们给爬虫配置cookie,使得爬虫能保持用户已登录的状态,达到获得那 ...

  4. Scrapy中使用cookie免于验证登录和模拟登录

    Scrapy中使用cookie免于验证登录和模拟登录 引言 python爬虫我认为最困难的问题一个是ip代理,另外一个就是模拟登录了,更操蛋的就是模拟登录了之后还有验证码,真的是不让人省心,不过既然有 ...

  5. Scrapy基础(十四)————Scrapy实现知乎模拟登陆

    模拟登陆大体思路见此博文,本篇文章只是将登陆在scrapy中实现而已 之前介绍过通过requests的session 会话模拟登陆:必须是session,涉及到验证码和xsrf的写入cookie验证的 ...

  6. scrapy的一些容易忽视的点(模拟登陆,传递item等)

    scrapy爬虫注意事项 一.item数据只有最后一条 这种情况一般存在于对标签进行遍历时,将item对象放置在了for循环的外部.解决方式:将item放置在for循环里面.   二.item字段传递 ...

  7. 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

    第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...

  8. 爬虫入门之scrapy模拟登陆(十四)

    注意:模拟登陆时,必须保证settings.py里的COOKIES_ENABLED(Cookies中间件) 处于开启状态 COOKIES_ENABLED = True或# COOKIES_ENABLE ...

  9. Scrapy模拟登陆豆瓣抓取数据

    scrapy  startproject douban 其中douban是我们的项目名称 2创建爬虫文件 进入到douban 然后创建爬虫文件 scrapy genspider dou douban. ...

随机推荐

  1. Mac安装php扩展redis遇到的问题,执行phpize问题

    1.安装redis在mac OS中可以使用brew命令进行安装redis:mac OS使用brew命令安装软件安装命令:brew install redis因为我已经安装过了,这里就不在赘述.安装完之 ...

  2. 【Python协程的实现】

    " 补充:数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全 线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都 ...

  3. JS中的数组创建,初始化

    JS中没有专门的数组类型.但是可以在程序中利用预定义的Array对象及其方法来使用数组. 在JS中有三种创建数组的方法: var arr = new Array(1,2,3,4); var arr = ...

  4. 《记一次Linux被入侵全过程》阅读笔记

    此前从未了解过关于网络安全相关方面的内容,仅仅知道安全性是软件必不可少的质量属性之一,而由于自己所做项目对安全性需求基本为无,所以很少对此进行关注.今天看到作者系统被入侵的经验,于是点开来读,以积累他 ...

  5. JS-防抖与节流

    问题的由来:一些事件频繁的被触发而导致频繁的调用事件处理程序,从而造成程序不必要的开销,影响程序性能:防抖和节流就是为了解决这种情况造成的性能消耗. 场景1:使用keyup事件监听输入框的值进行请求搜 ...

  6. 基于G6画个xmind出来

    公司产品因为业务发展,出现了一个新的需求:需要去实现知识库的层级知识展示,展示效果通过树图来实现,具体的展示形式可见下图: 其中有几个需要注意点: 节点上的详情icon可以点击,点击展开关闭详情 节点 ...

  7. cnblogs 自定义主题字体渲染方案

    渲染效果图 由于我一直偏好衬线字体,所以在采用 Silence 主题 之后,还参照谢益辉的博客字体方案进行了改进 首先,在页首代码中添加盘古之白,如果你同时编写 中/英 文博客,你当然应该学习谢益辉的 ...

  8. javascript数据类型及类型的转换总结

    javascript 是浏览器客户端脚本语言,要想让网页与后台程序更好的交互效果,这里我们详细了解javascript 数据类型及类型的转换 1,数据类型 number number类型 数字类型,浮 ...

  9. 9000端口号被上一个ip地址占用,需要reboot才可以恢复正常ip端口问题

    比如查看端口# lsof -i:9000 本机ip已经修改为192.168.0.50,而经过# lsof -i:9000查看到,端口是这样的,192.168.0.88:9000,显示的还是上一个ip的 ...

  10. 【代码学习】PYTHON 函数

    一.定义函数 def 函数名(): 代码 二.函数调用 #定义函数 def printme(str): print str return #调用函数 printme("SQYY1" ...