为了爬取拉钩,今天学习了selenum的使用技巧.
 
from scrapy.http import HtmlResponse
 
class JSPageMiddleware(object):
 
    def process_request(self, request, spider):
        if spider.name == "zhihu":
            browser = webdriver.Firefox(executable_path="C:/codeapp/seleniumDriver/firefox/geckodriver.exe")
            browser.get(request.url)
            time.sleep(3)
            print("访问:{0}".format(request.url))
            # 请求已完成,所以不用再发送到下载器。用HtmlResponse 之后就不会发送到downlaoder,而是直接返回给spider
            return HtmlResponse(url=browser.current_url, body=browser.page_source, encoding="utf-8", request=request)
 
这样有个不好的地方就是每次来一个请求时都会启动一次浏览器,浏览器启动是很慢的,可以在类中初始化一个浏览器,
class JSPageMiddleware(object):
    def __init__(self):
        self.browser=webdriver.Firefox(executable_path="C:/codeapp/seleniumDriver/firefox/geckodriver.exe")
        super(JSPageMiddleware,self).__init__()
 
    def process_request(self, request, spider):
        if spider.name == "zhihu":
            self.browser.get(request.url)
            time.sleep(3)
            print("访问:{0}".format(request.url))
            # 请求已完成,所以不用再发送到下载器。用HtmlResponse 之后就不会发送到downlaoder,而是直接返回给spider
            return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding="utf-8", request=request)
 
用上述方法,爬虫自动关闭时,浏览器不会关闭,并且每个spider会共用一个打开的浏览器,这样也不方便调试,可以把这个初始化的工作放在各个spider中
# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher
from scrapy.http import HtmlResponse
 
 
class ZhihuSpider(scrapy.Spider):
    name = 'zhihu'
    allowed_domains = ['oschina.net/blog']
    start_urls = ['https://www.oschina.net/blog']
 
    def __init__(self):
        self.browser = webdriver.Firefox(executable_path="C:/codeapp/seleniumDriver/firefox/geckodriver.exe")
        super(ZhihuSpider, self).__init__()
#传递信息,也就是当爬虫关闭时scrapy会发出一个spider_closed的信息,当这个信号发出时就调用closeSpider函数关闭这个浏览器.
        dispatcher.connect(self.closeSpider, signals.spider_closed)
 
    def closeSpider(self, spider):
        print("spider closed")
        # 当爬虫退出的时关闭浏览器
        self.browser.quit()
 
    def parse(self, response):
        # data=response.css(".SignFlow-accountInpu input[]").extract()
        pass
 
Middleware 中的类
class JSPageMiddleware(object):
    def process_request(self, request, spider):
        if spider.name == "zhihu":
            spider.browser.get(request.url)
            time.sleep(3)
            print("访问:{0}".format(request.url))
            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8",request=request)
 
注意 上面三种方法都必须在settings中把JSPageMiddleware加入
DOWNLOADER_MIDDLEWARES = {
# 'outlook.middlewares.MyCustomDownloaderMiddleware': 543,
'outlook.middlewares.JSPageMiddleware': 1,
 

selenium的使用技巧及集成到scrapy的更多相关文章

  1. 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中 1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信 ...

  2. 三十 Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 # -*- coding: u ...

  3. Selenium Web 自动化 - 项目持续集成(进阶)

    Selenium Web 自动化 - 项目持续集成(进阶) 2017-03-09 目录 1 背景及目标2 环境配置  2.1 SVN的安装及使用  2.2 新建Jenkins任务3 过程分析 1 背景 ...

  4. Selenium Web 自动化 - 项目持续集成

    Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备  1.1 安装git  1.2 安装jenkins  1.3 安装jenkins插件  1.4 jekins ...

  5. 将selenium集成到scrapy框架中

    一 首先想到的是将selenium 写在下载中间件的process_request中.如以下代码. middleware.py from selenium import webdriver from ...

  6. phantomjs集成到scrapy中,并禁用图片,切换UA

    phantomjs是一个没有界面的浏览器,支持各种web标准,提供DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG,对于爬取一些经过js渲染的页面非常有用.但是phantomj ...

  7. sublime使用技巧之集成VI

    熟悉开发工具,减少多余的操作流程有助于提高开发效率,而Sublime Text 2是sublime产品的经典版本,因此本文基于Sublime Text 2讲解sublime的使用技巧. VI的主要作用 ...

  8. selenium+testng+reportng+ant+jenkins集成日记

    1.新建一个项目 2.编写测试脚本 3.配置ant的build.xml脚本 4.集成到jenkins,并运行 1.新建项目   注意jdk的版本要一致 eclipse  Window --Prefer ...

  9. selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装

    今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...

随机推荐

  1. STOI补番队互测#2

    Round2轮到我出了>_<(目测总共10人参加 实际共七人) 具体情况: #1: KPM,360 #2:ccz181078,160 #3:child,150 可惜KPM没看到第一题样例里 ...

  2. poj_2503(map映射)

    题目链接poj2503 Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 38820   Accepted: ...

  3. 【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码

    [CC2530入门教程-增强版]基础技能综合实训案例(基础版)-上位机源码 广东职业技术学院  欧浩源 一.需求分析 按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体 ...

  4. python网络编程(进程与多线程)

    multiprocessing模块 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. multiproce ...

  5. js object 常用方法总结

    Object.assign(target,source1,source2,...) 该方法主要用于对象的合并,将源对象source的所有可枚举属性合并到目标对象target上,此方法只拷贝源对象的自身 ...

  6. 云计算之路-阿里云上:节点 CPU 波动引发 docker swarm 集群故障

    非常抱歉,今天 10:05-10:20 左右,我们用阿里云服务器搭建的 docker swarm 集群又出现故障,又是因为突然的节点 CPU 波动. 受这次故障影响的站点有 闪存,博问,班级,园子,短 ...

  7. {style}/index_article.htm {style}表示什么意思啊

    LS有点安全意识好不好.... 在你的后台系统设置有个"模板默认风格:________  cfg_df_style " 默认是default也就是 {style}=模板路径+模板默 ...

  8. Cocoa的MVC架构分析

    Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...

  9. 使用git bash提交代码到github托管

    1.首先登录到https://github.com注册Github帐号,并且创建一个repository.  或者登录到  https://git.oschina.net/注册账号,并且创建一个rep ...

  10. JAVA正则表达式 Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...