• Scrapy 中的模拟登陆


      目前,大部分网站都具有用户登陆功能,其中某些网站只有在用户登陆后才能获得有价值的信息,在爬取这类网站时,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': 123456}
    >>> 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 直接登录

  • 相关阅读:
    OpenCV 脸部跟踪(2)
    OpenCV 脸部跟踪(1)
    opencv2.4中SVD分解的几种调用方法
    OpenCV教程(42) xml/yaml文件的读写
    OpenCV教程(41) 人脸特征检测
    OpenCV学习(40) 人脸识别(4)
    OpenCV学习(39) OpenCV中的LBP图像
    目标检测的图像特征提取之(三)Haar特征
    目标检测的图像特征提取之(二)LBP特征
    目标检测的图像特征提取之(一)HOG特征
  • 原文地址:https://www.cnblogs.com/jcjc/p/10917658.html
Copyright © 2020-2023  润新知