51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 999|回复: 0
打印 上一主题 下一主题

Scrapy框架下的Selenium模拟登录

[复制链接]
  • TA的每日心情
    无聊
    5 天前
  • 签到天数: 941 天

    连续签到: 3 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2022-10-13 15:02:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    前言
      最近有一点点爬虫需求,想总结一下scrapy框架的一些基本使用方法,加深印象,自己一直习惯使用一些脚本文件运行爬虫,面对数据量非常大,稳定性要求比较高的,效率需求比较高的情况下还是用scrapy较为合适,scrapy是一个异步的框架,所有的请求都是阻塞的,虽然在单文件脚本中也可以实现,但是代码就非常的难看,难以维护,过了几天就会忘记复杂的流程,调试起来就非常的困难,scrapy我自己用得也不多,但是觉得它非常地优秀,有成熟的中间件支持,方便的下载器,稳定性效率非常地高,但是其中的运行流程也稍微有些复杂,难以理解,异步框架处理BUG调试非常的麻烦。
      初始化scrapy
      首选需要安装scrapy 和selenium框架。
    1. <font size="3">pip install scrapy

    2.   pip install selenium</font>
    复制代码
    初始化框架
    1. <font size="3">  scrapy startproject testSpider</font>
    复制代码

     依据参考接着进入文件夹,新建爬虫文件。
    1. <font size="3"> cd testSpider

    2.    scrapy genspider myspider example.com</font>
    复制代码
    看看目录

    selenium基本使用
      selenium前言
      今天只讲selenium的基本使用,scrapy框架的流程后面再总结,为什么要在在scrapy中使用selenium,因为有些目标站点的接口是通过分析非常难以复现的,通常会有一些混淆参数导致出现请求遇到拦截的情况,也就是碰到反爬虫措施了,需要分析Javascript代码,分析其中参数的意思,这种过程非常的复杂,工程量非常大,这也是目前高级爬虫的必备知识,需要一些Javascript逆向知识,例如行业中有非常著名的瑞数信息做了翻盘是属于顶尖的存在,专门在一些金融,政府网站上使用这种Javascript代码混淆技术,自己也是稍微了解了一点点。
      通过selenium可以绕过一些关键的有反扒的接口,得到一些重要的信息。通常的情况就是使用selenium模拟有反爬措施的登录接口从而得到登录后cookie,然后登陆过后的接口就没有反爬措施。
      下载驱动
      使用selenium就需要配套的浏览器驱动。我配套的浏览器就是chrome,我自己的浏览器版本。


    下载的版本:

    然后我把浏览器驱动放在浏览器的目录,然后配置了环境变量:

    关键代码
      testSpider/spider/myspider.py就是关键代码,目前的代码如下:

    1. <font size="3">import scrapy

    2.   class MyspiderSpider(scrapy.Spider):

    3.       name = 'myspider'

    4.       allowed_domains = ['example.com']

    5.       start_urls = ['http://example.com/']

    6.       def parse(self, response):

    7.           pass</font>
    复制代码
     根据文章标题的需求我只需要使用在以上的文件进行编码就行了,加入要使用到其他的接口爬取方法就要去更改testSpider/setting.py里面的设置,如果感兴趣可以参考我之前的文章:使用Scrapy框架爬取V2ex看看程序员中秋节都在讨论啥
      直接亮代码,拿七牛云的登录试了一下,因为感觉他比较简单,步骤较少,适合做教程分享,详细情况在注释中讲解:

    1. <font size="3">import scrapy

    2.   from selenium.webdriver.chrome.options import Options

    3.   from selenium import webdriver

    4.   from selenium.webdriver.common.by import By

    5.   from selenium.webdriver.support.wait import WebDriverWait

    6.   from selenium.webdriver.support import expected_conditions as EC

    7.   class MyspiderSpider(scrapy.Spider):

    8.       name = 'myspider'

    9.       allowed_domains = ['portal.qiniu.com'] # 注意设置好允许爬取的网址列表,这里踩了坑,试了半天发现框架默认的解析器一直没有调用,要写网址的整合域名而不是单单一级域名。

    10.       start_urls = ['http://example.com/']

    11.       user_name = '********@**.com'

    12.       password = '********'

    13.       chorme_options = Options()

    14.       chorme_options.add_argument("--disable-gpu")

    15.       driver = webdriver.Chrome(options=chorme_options)  # 初始化Chrome驱动

    16.       driver.implicitly_wait(20)

    17.       headers = {

    18.           'authority': 'portal.qiniu.com',

    19.           'accept': '*/*',

    20.           'accept-language': 'zh-CN,zh;q=0.9',

    21.           'cache-control': 'no-cache',

    22.           'referer': 'https://portal.qiniu.com/certificate/ssl',

    23.           'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"',

    24.           'sec-ch-ua-mobile': '?0',

    25.           'sec-ch-ua-platform': '"Windows"',

    26.           'sec-fetch-dest': 'empty',

    27.           'sec-fetch-mode': 'cors',

    28.           'sec-fetch-site': 'same-origin',

    29.           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36',

    30.       }  # header

    31.       cookie = {}

    32.       def __del__(self):

    33.           self.driver.close()

    34.       def parse(self, response, *args, **kwargs):

    35.           print('默认的解析器方法,接口请求内容:')

    36.           print(response.json())

    37.       def start_requests(self):

    38.           self.driver.get(url='https://sso.qiniu.com/')  # 直接访问登录页

    39.           user_input = self.driver.find_element(By.ID, 'email')  # 获取用户名输入框

    40.           user_input.send_keys(self.user_name)  # 输入用户名

    41.           password_input = self.driver.find_element(By.ID, 'password')  # 获取密码框

    42.           password_input.send_keys(self.password)  # 输入密码

    43.           self.driver.find_element(By.ID, 'login-button').click()  # 登录

    44.           try:

    45.               WebDriverWait(self.driver, 60).until(EC.visibility_of_element_located(

    46.                   (By.CLASS_NAME, "user-plane-entry")))  # 等待网页跳转,超时等待60秒

    47.           except:

    48.               print('登陆超时,失败')  # 等待超过了60

    49.               self.driver.quit()

    50.           self.cookie = self.driver.get_cookies()  # 获取cookie 此时是键值对

    51.           print(self.cookie)

    52.           print(self.headers)

    53.           yield scrapy.Request(url='https://portal.qiniu.com/api/gaea/billboard/list?status=1', callback=self.parse,

    54.                                cookies=self.cookie,

    55.                                headers=self.headers)  # 迭代器 放入异步任务中请求</font>
    复制代码
    从日志看看效果:

    已经正确打印了接口返回的内容,假如直接请求接口会报错:


    总结
      在scrapy 中使用selenium是一个非常常见的情况,今天只稍微做一下简单的总结,以后碰到的难点会一一记下来分享出来,敬请期待。


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-5 20:35 , Processed in 0.067854 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表