Scrapy中selenium的使用

2023-11-03

场景1:项目中有多个爬虫时,将driver对象的初始化放在各个spider中

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@author: carry
@time: 2019/6/19 15:56
@desc:
'''
import scrapy
from selenium import webdriver
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
from scrapy.http import HtmlResponse
from selenium.webdriver.chrome.options import Options


class ZhihuSpider(scrapy.Spider):
    '''
    项目中有多个爬虫时,将driver对象的初始化放在各个spider中
    '''
    name = 'zhihu'
    allowed_domains = ['oschina.net/blog']
    start_urls = ['https://www.oschina.net/blog']

    def __init__(self):
        # 初始化chrome对象
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        self.browser = webdriver.Chrome('D:\chromedriver_win32\chromedriver.exe', chrome_options=chrome_options)
        super(ZhihuSpider, self).__init__()

        # 当爬虫关闭时scrapy会发出一个spider_closed的信息,当这个信号发出时就调用closeSpider函数关闭这个浏览器.
        dispatcher.connect(receiver=self.closeSpider, signal=signals.spider_closed)

    def closeSpider(self, spider):
        print("spider closed")
        self.browser.quit()

    def parse(self, response):
        pass


class SeleniumMiddleware(object):
    '''
    Middleware中的类设置
    '''
    def process_request(self, request, spider):
        if spider.name == "zhihu":
            spider.browser.get(request.url)
            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8",
                                request=request)

 

场景2:当需要用selenium进行 键入搜索,而此时得到的是list,需循环点击获取详情页

def use_selenium_step01(self, request, spider):
    '''
    键入搜索逻辑,返回搜索结果页面到
    '''
    driver = spider.browser
    driver.get(request.url)
    try:
        input = spider.browser.find_element_by_xpath('//textarea')
        input.send_keys(request.meta['keyword'])
        btn_submit = spider.browser.find_element_by_xpath(
            '//span[contains(text(),"Find")]/..')
        btn_submit.click()
        WebDriverWait(spider.browser, 5, 0.5).until(
            EC.presence_of_element_located(
                (By.XPATH, '//div[@class="ui-datatable-tablewrapper"]/table/tbody')))
    except Exception as e:
        print(e)
        return

def use_selenium_setp02(self, request, spider):
    '''
    此为点击list页面每个详情链接的处理逻辑
    在parser_01中得到1获取每个链接的唯一Xpath定位标识
    '''
    driver = spider.browser
    driver.get(request.url)
    try:
        # 重复键入搜索逻辑
        input = spider.browser.find_element_by_xpath('//textarea')
        input.send_keys(request.meta['keyword'])
        btn_submit = spider.browser.find_element_by_xpath(
            '//span[contains(text(),"Find")]/..')
        btn_submit.click()
        WebDriverWait(spider.browser, 5, 0.5).until(
            EC.presence_of_element_located(
                (By.XPATH, '//div[@class="ui-datatable-tablewrapper"]/table/tbody')))
       
        #接着点击所要获取的每个链接
        btn_submit = driver.find_element_by_xpath(
            '//div[@class="ui-datatable-tablewrapper"]/table/tbody/tr[{}]//a'.format(request.meta['i']))
        btn_submit.click()
        WebDriverWait(spider.browser, 5, 0.5).until(
            EC.presence_of_element_located(
                (By.XPATH, '//span[contains(text(),"Back")]')))
    except Exception as e:
        print(e)
        return

 

 

----------------------------------------------------我是分割线--------------------------------------------------------------------------------------------

欢迎关注博主个人公众号,一起来嗨皮呀
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy中selenium的使用 的相关文章

  • 正则知识点滴

    s S 与 的区别 s S 支持跨行匹配
  • Ubuntu下使用ls命令显示文件颜色相关内容及修改

    lt 转载自 http pcyoyo com p 465 gt 在Ubuntu下 使用ls命令显示目录下文件及文件夹时会先显示不同颜色 如下图所示 如果知道了不同颜色分别代表的含义 那么对于我们查看目录下文件信息方便了很多 所以就搜索了一下
  • css实现:after中使用图片

    先看一下效果 下面是代码实现 xin position relative font size 20rpx color 15bf5d border 1rpx dashed ccc padding top 20rpx xin after con
  • pg常用插件

    pg软件包自带插件 前言 pg的插件是基于库的 pg的数据字典介绍 1 pg stat statements插件 Pg stat statements 是一个扩展 而不是核心数据库的一部分 它是一个contrib 扩展 随 postgres
  • 推荐一个冷门又逆天的副业(Python兼职可月入15k+)

    最近在论坛上看到一个测试 特扎心 以下三种情况 哪个让你最绝望 发薪日开心三分钟 各种家庭花销和贷款过一遍立马所剩无几 被领导骂到哭 因为没钱不敢裸辞 公司业绩不好 自己更是活成了一个小透明 薪资拿的少 还要随时担心被新人优化 说实话 我真
  • DirectX11 简介+环境配置

    文章目录 前言 获取SDK 安装 项目环境配置 创建项目 链接库 方法一 方法二 前言 DX11是Win7的产物 它是09年发布的 可谓是非常古老 那么为什么我们还要学习呢 这是为了给下一步的DX12做准备 如果你是Win10用户 且安装了
  • JAVA代码编写哈夫曼编码实现数据和文件的压缩和解压算法

    压缩算法思路 1 将待压缩的字符串变成字节数组 byte contentBytes 2 将字节数组每个字符出现的次数统计出来变为Node类 value为字符对应的Ascci码 weight为字符出现的次数也是哈夫曼树的权值 存入List集合
  • Kibana导出csv数据

    适用版本 ElasticSearch 6 8 0 Kibana 6 8 0 导出CSV文件配置 kibana配置文件 添加以下配置 xpack reporting csv maxSizeBytes 209715200 csv文件大小 默认为
  • SQL注入-盲注(布尔盲注与时间盲注)

    目录 一 什么是盲注 二 盲注的分类 三 利用盲注的前提条件 四 盲注的优缺点 五 基于布尔类型的盲注 1 什么情况下使用布尔类型的盲注 2 使用布尔类型盲注的操作步骤 3 布尔类型盲注的操作过程 以获取当前数据库为例 4 使用其他函数进行
  • iview—Table表格render 渲染

    1 序号 2 if判断 a标签 3 if判断 Input输入 4 renderHeader自定义列头的点击事件 render的Input点击事件 nativeOn click 5 正常列 6 按钮Button 7 复选框Checkbox 8
  • VSCode 远程开发:WLS 2 + ZeroTier 内网穿透

    前置条件 两台 Win 10 主机 其中一台 记为本地机 远程访问另一台主机 记为远程机 的 WSL 本地机安装好 VSCode 两台主机不在一个局域网内 且均无公网 IP 后续需要在两台主机上配置内网穿透 如果两台主机可相互 ping 通
  • Java 数据库编程 ResultSet 的 使用方法

    结果集 ResultSet 是数据中查询结果返回的一种对象 可以说结果集是一个存储查询结果的对象 但是结果集并不仅仅具有存储的功能 他同时还具有操纵数据的功能 可能完成对数据的更新等 结果集读取数据的方法主要是getXXX 他的参数可以使整
  • C++ string替换指定字符

    string自带replace 方法并没有实现这一功能 需要借助
  • git commit时权限被否定问题解决

    今天在提交博客时 git commit m 时出现了一些问题 问题如下 could not open git COMMIT EDITMSG Permission denied 意思大概就是无法打开 git COMMIT EDITMSG 权限
  • Java8 HashMap底层原理

    一 树集结构 1 1二叉查找树 二叉查找树 BST 具备什么特性呢 1 左子树上所有结点的值均小于或等于它的根结点的值 2 右子树上所有结点的值均大于或等于它的根结点的值 3 左 右子树也分别为二叉排序树 查找效率 二叉查找树查找的最大次数
  • Macbook配置工作环境

    Xcode 在App Store中搜索Xcode 下载安装 安装包大概6G 无需配置 直接App Store中安装即可 速度取决于网速 iterm2 mac下较好用的终端 下载地址 使用和配置文档参照 https iterm2 com in
  • Docker+Linux_Centos(内核:3.10.0-957.1.3.el7.x86_64)安装

    前言声明 如果您有更好的技术与作者分享 或者商业合作 请访问作者个人网站 http www esqabc com view message html 留言给作者 如果该案例触犯您的专利 请在这里 http www esqabc com vi
  • DBSCAN算法研究(2)--matlab代码实现

    DBSCAN聚类算法三部分 1 DBSCAN原理 流程 参数设置 优缺点以及算法 http blog csdn net zhouxianen1987 article details 68945844 2 matlab代码实现 blog ht
  • Python、Java的一些区别

    共同点 二者都是面向对象的编程语言 二者都是解释型语言 说明 解释型语言释义 程序不需要编译 而是在运行时一句一句翻译成机器语言 每运行一次都要翻译一次 所以效率相比较低 不同点 Python是弱类型语言 而Java是强类型语言 说明 强类

随机推荐

  • Vue 父组件中触发子组件的方法

    Vue 父组件中触发子组件的方法 使用场景 在父组件点击子组件时 触发子组件的初始化方法 方式一 子组件中使用 ref 属性
  • arch linux windows,使用ArchWSL在微软Windows WSL上运行Arch Linux系统

    本文教您在微软Windows WSL上运行Arch Linux系统的方法 ArchWSL使ArchLinux作为WSL实例 支持多次安装 本文操作步骤为 安装用于Linux的Windows子系统 前往GitHub下载ArchWSL 解压缩下
  • 哈夫曼树实现文件的压缩与解压缩

    利用哈夫曼树实现文件的压缩与解压缩 压缩 1 统计出文件中相同字符出现的次数 2 获取哈夫曼编码 次数作为权值构建哈夫曼树 3 重新编码 写回压缩文件 保存头文件 源文件后缀 编码信息的行数 每个字符的权 保存编码 解压缩 1 获取原文件后
  • 超详细Shell学习教程第三篇

    1 1shell脚本创建 下面讲解创建shell脚本 并赋予脚本可执行权限 写一个脚本实现创建文件夹 如果文件夹不存在 mkdir sh if d html then mkdir html elif d html1 then mkdir h
  • 比较快速排序和归并排序

    虽然归并排序和快速排序的时间复杂度都为O nlogn 但实际上快速排序的速度会比归并排序快2 3倍 原因如下 1 归并排序在执行时 需要一个额外的temp数组去拷贝原数组的数据 会大量占用程序的空间 2 快速排序再运行时 实际上是直接再原数
  • 信息安全之SQL注入攻击

    目录 一 简介 二 案例 1 案例1 SQL恶意填入 2 案例2 危险字符注入 三 预防 1 过滤特殊字符 2 严格使用参数绑定 3 合理使用框架防注入机制 一 简介 SQL注入是注入式攻击中的常见类型 SQL注入式攻击是未将代码与数据进行
  • 【计蒜客——复赛A题】贝壳找房函数最值

    题意 对于结构 f x ax b 这样的一次函数 我们要做的就是 对 fi fj x ai ajx bj bi 这样的可换序嵌套函数求它的最大值f f f f x 接下来先分享一下令我忧伤的WA让大家快乐一下 include
  • mobx操作详解

    在操作mobx之前首先你得先了解一下mobx是用来干嘛的 mobx官网 https cn mobx js org 其次拥有自己得一个react mobx项目 前几天发了一次项目创建流程 1 src 创建store js用来存放数据 impo
  • 用crt远程linux提示密码错误,SecureCRT ssh连接一直提示密码错误

    遇到在密码正确的情况下ssh密码不对 最后一种是我遇到的问题上面的是网上大家遇到的总结一下 我的问题是selinux没有关闭 被改动了配置 1 权限问题 ssh目录 以及 home 当前用户 需要700权限 参考以下操作调整 sudo ch
  • 机器学习入门先知

    选择机器学习的原因 如果你已经读到了硕士还在做普通的编程开发 不涉及高等数学知识 那么感觉这个知识是不是浪费了 会有不甘心的 和大学生 培训出来的童鞋有什么差别呢 所以 为了知识不浪费 拿高薪 做高级程序员 机器学习是个很好的跳板 机器学习
  • CRMEB电商商城系统腾讯云ECS服务器安装配置搭建教程文档

    一 推荐使用宝塔Linux面板 简单好用 二 放行服务器端口 详细步骤 1 登录腾讯云服务器 点击右上角 控制台 2 我的资源 点击进入云服务器 3 进入实例列表 选择您要安装的服务器 点击更多 4 选择重装系统 5 如果您的服务器有数据
  • thinkphp5 ajax如何返回json

    刚用thinkphp5 不知道怎么返回json 参考这个文章 收藏一下 thinkphp5 ajax如何返回json 使用thinkphp框架开发 不知道如何返回JSON字符串 ajax无法调用 有两种方式可以返回 1 若是数据库实体 可以
  • react的深度解析: 状态提升

    在react中是单向数据流的设计 即 只有父组件可以传递数据给子组件 而没有子组件传递数据给父组件的概念 以正确的技术说明 是 拥有者组件 可以设置 被拥有者组件 中的资料 也就是主人与仆人的关系 那么子组件要传递数据给父组件该如何沟通呢
  • 微信小程序开发-001 注册以及开发工具的安装与绑定

    学习目标 快速入门小程序开发 学习内容 1 申请帐号 2 登录 小程序后台 3 获取自己的APP ID 4 下载微信开发者工具 5 开发者工具的使用 学习时间 2022 2 17 学习产出 1 申请帐号 进入小程序注册页 根据指引填写信息和
  • 刷脸支付与我们的生活越来越密不可分

    随着支付宝 微信刷脸支付产品的迭代升级 以及补贴政策的加码 越来越多的刷脸支付进入了这个风口 移动支付革命刷脸支付为创业者提供新机遇 从蜻蜓 青蛙到蓝鲸 从支付宝微信到银联 官方 服务商 加盟的刷脸支付代理以及商户 支撑起这场支付革命 给刷
  • 带你“手撕代码”,了解基本原理实现

    文章目录 前言 常见的 手撕代码 都是高频题哦 curry 柯里化 compose 函数组合 pipe 函数管道 throttle 函数节流 debounce 函数防抖 formatMoney 千分位 deepClone 深拷贝 模拟ins
  • IAR和KEIL调试工具栏的debug快捷键

    IAR Reset复位 Break停止运行 Step Over逐步运行 F10 Step Into跳入运行 F11 Step Out跳出运行 F11 Go全速运行 F5 Stop Debugging停止调试 Ctrl Shift D Mak
  • Python 常用第三方包介绍及相关使用方法汇总

    转自 https www cnblogs com wf linux archive 2018 08 01 9400354 html
  • tesseract-ocr3.02字符识别过程操作步骤

    1 从http code google com p tesseract ocr downloads list下载tesseract ocr 3 02 vs2008 tesseract ocr 3 02 chi sim tar tessera
  • Scrapy中selenium的使用

    场景1 项目中有多个爬虫时 将driver对象的初始化放在各个spider中 usr bin env python coding UTF 8 author carry time 2019 6 19 15 56 desc import scr