在Scrapy中使用Selenium

1. selenium在scrapy中的使用流程

  • 重写爬虫文件的构造方法,在该方法中使用selenium实例化一个浏览器对象(因为浏览器对象只需要被实例化一次)
  • 重写爬虫文件的closed(self,spider)方法,在其内部关闭浏览器对象。该方法是在爬虫结束时被调用
  • 重写下载中间件的process_response方法,让该方法对响应对象进行拦截,并篡改response中存储的页面数据
  • 在配置文件中开启下载中间件

2. 代码展示

- 爬虫文件:

 class WangyiSpider(RedisSpider):
     name = ‘wangyi‘
     #allowed_domains = [‘www.xxxx.com‘]
     start_urls = [‘https://news.163.com‘]
     def __init__(self):
         #实例化一个浏览器对象(实例化一次)
         self.bro = webdriver.Chrome(executable_path=‘/Users/bobo/Desktop/chromedriver‘)
 ?
     #必须在整个爬虫结束后,关闭浏览器
     def closed(self,spider):
         print(‘爬虫结束‘)
         self.bro.quit()

- 中间件文件:

 from scrapy.http import HtmlResponse
     #参数介绍:
     #拦截到响应对象(下载器传递给Spider的响应对象)
     #request:响应对象对应的请求对象
     #response:拦截到的响应对象
     #spider:爬虫文件中对应的爬虫类的实例
     def process_response(self, request, response, spider):
         #响应对象中存储页面数据的篡改
         if request.url in[‘http://news.163.com/domestic/‘,‘http://news.163.com/world/‘,‘http://news.163.com/air/‘,‘http://war.163.com/‘]:
             spider.bro.get(url=request.url)
             js = ‘window.scrollTo(0,document.body.scrollHeight)‘
             spider.bro.execute_script(js)
             time.sleep(2)  #一定要给与浏览器一定的缓冲加载数据的时间
             #页面数据就是包含了动态加载出来的新闻数据对应的页面数据
             page_text = spider.bro.page_source
             #篡改响应对象
             return HtmlResponse(url=spider.bro.current_url,body=page_text,encoding=‘utf-8‘,request=request)
         else:
             return response

- 配置文件:

 DOWNLOADER_MIDDLEWARES = {
     ‘wangyiPro.middlewares.WangyiproDownloaderMiddleware‘: 543,
 ?
 }

原文地址:https://www.cnblogs.com/yzg-14/p/12207872.html

时间: 2024-10-30 01:47:31

在Scrapy中使用Selenium的相关文章

scrapy中的selenium

引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 1.案例分析: - 需求:爬取网易新闻的国内板块下的新闻数据 - 需求分析:当点击

爬虫之scrapy框架应用selenium

一.利用selenium 爬取 网易军事新闻 使用流程: ''' 在scrapy中使用selenium的编码流程: 1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性) 2.重写spider的一个方法closed(self,spider),在该方法中执行浏览器关闭的操作 3.在下载中间件的process_response方法中,通过spider参数获取浏览器对象 4.在中间件的process_response中定制基于浏览器自动化的操作代码(获取动态加载出来的页面源

scrapy中selenium的应用

引子: 在通过scrapy框架进行某些网站数据爬取的时候,旺旺会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据,但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium穿件浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 1.案例分析: - 需求:爬取网易新闻的国内板块下的新闻数据 - 需求分析: 当点

scrapy中间件中使用selenium切换ip

scrapy抓取一些需要js加载页面时一般要么是通过接口直接获取数据,要么是js加载,但是我通过selenium也可以获取动态页面 但是有个问题,容易给反爬,因为在scrapy中间件mid中使用selenium的ip不会跟着你在中间件中切换的ip变化,还是使用本机的ip在访问网站, 这里通过 确定网页url进行过滤,什么网页使用selenium,什么使用scrapy自带的抓取, 为selenium单独设置一个获取ip的办法,当然也可以使用全局变量 from selenium import web

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 2. 中间件的使用 3. selenium在scrapy中的应用 4. CrawlSpider 5. 分布式 5. 增量式 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 爬取流程: 爬虫类中将解析到的图片

爬虫学习 15.scrapy中selenium的应用

爬虫学习 15.scrapy中selenium的应用 引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 今日详情 1.案例分析: -

scrapy中的canonicalize_url【转】

转自:http://www.leyle.com/archives/canonicalize_url.html 思考一下:对url进行规范化处理是否是必须的?因为这一步处理涉及到编码转换,对于一个网页的新链发现来说是比较耗时的. 为什么需要格式化 url? 比如下面几个url: http://www.example.com/path/xxx?name=leyle&passwd=leyle http://www.example.com/path/xxx?passwd=leyle&name=le

Java中通过Selenium WebDriver定位iframe中的元素

问题:有一些元素,无论是通过id或是xpath等等,怎么都定位不到. 分析:这很可能是因为你要定位的元素被嵌套在了当前页面的一个iframe元素中,Selenium对iframe中的元素有特殊的定位规则,WebDriver不能够直接进行定位. 解决办法:我们要把这个iframe元素找出来,让WebDriver转移到这个iframe元素上,之后再让WebDriver对iframe中的元素进行定位. 因为最近在用Java来做一些东西,所以就顺便说一下Selenium在Java环境下的使用,总共分三步

Scrapy中对xpath使用re

Scrapy中使用xpath时,根据xpath的语法不一定能得到想要的. 如下面的html源码: 1 <div class="db_contout"> <div class="db_cont"> <div class="details_nav"> <a href="http://movie.mtime.com/79055/addimage.html" class="db_ad