您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:selenium在scrapy中的使用代码

51自学网 2021-10-30 22:37:53
  python
这篇教程selenium在scrapy中的使用代码写得很实用,希望能帮到您。

在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据。那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值。本文重点给大家介绍selenium在scrapy中的使用,具体内容如下所示:

使用目的

爬取网易新闻国内、国际、军事、航空4个版块的新闻。在测试中发现各版块的新闻是动态加载的,如果直接爬取无法获取,使用selenium帮助获取此部分数据。

代码

spider

import scrapyfrom selenium import webdriverfrom wangyiPro.items import WangyiproItemclass WangyiSpider(scrapy.Spider):    name = 'wangyi'    # allowed_domains = ['www.xxx.com']    start_urls = ['https://news.163.com/']    model_url = []       hro = webdriver.Chrome()    def parse(self, response):    # 从所有版块中筛选出所需要下载的4个版块        li_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')        indexs = [3,4,6,7]        for index in indexs:            model_li = li_list[index]            model_list = model_li.xpath('./a/@href').extract_first()            self.model_url.append(model_list)        for url in self.model_url:            yield scrapy.Request(url=url,callback=self.parse_model)    # 数据解析:新闻标题+新闻详情页的url(动态加载数据)    def parse_model(self,response):        # 直接对response解析无法获取该数据(动态加载数据)        # 无法拿到动态加载数据返回的响应数据就不足        # 使用中间件修改不满足需求的响应对象中的响应数据,将其改为包含动态加载数据的响应数据        div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div')        for div in div_list:            title = div.xpath('./div/div[1]/h3/a/text()').extract_first()            new_url_detail = div.xpath('./div/div[1]/h3/a/@href').extract_first()            if new_url_detail:                item = WangyiproItem()                item['title'] = title                yield scrapy.Request(url=new_url_detail,callback=self.parse_detail,meta={'item':item})    def parse_detail(self,response):        # 返回的列表,需要将其转换为字符串        content = response.xpath('/html/body/div[3]/div[1]/div[3]/div[2]/p/text()').extract()        content = ''.join(content)        item = response.meta['item']        item['content'] = content        yield item    # 重写爬虫类父类方法,该方法在爬虫程序执行结束后立即执行    def closed(self,spider):        # 打开selenium需要关闭        self.hro.quit()

middlewares

from time import sleepfrom scrapy.http import HtmlResponse#scrapy封装好的响应类class WangyiproDownloaderMiddleware:    def process_request(self, request, spider):        return None    # 拦截所有的响应对象    # 整个工程发起的请求:1+4+n 对应相同的响应    def process_response(self, request, response, spider):        # 从所有拦截对象中找到4个需修改的响应对象        if request.url in spider.model_url:            hro = spider.hro            hro.get(request.url)            sleep(2)            # 网页下拉到底,获取更多动态加载数据            hro.execute_script('window.scrollTo(0,document.body.scrollHeight)')            sleep(1)            page_text = hro.page_source            # response.text = page_text            # 返回一个新的响应对象            return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)        # 如果不是需要修改的响应数据,不做修改        else:            return response    def process_exception(self, request, exception, spider):        pass

效果

在这里插入图片描述

总结

  •  hro = webdriver.Chrome() 我是直接将Chromedriver写入配置文件,所以直接实例化对象即可,如果没有写入配置文件,写为hro = webdriver.Chrome(executable_path='绝对路径')。尝试过将Chromedriver放到pycharm的文件下写入相对路径,没有成功。
  • 使用selenium在结束后需要关闭,可以改写爬虫类父类方法closed()
  • settings里修改三件套并且打开下载中间件和items

以上就是selenium如何在scrapy中的使用的详细内容,更多关于scrapy中使用selenium的资料请关注51zixue.net其它相关文章!


关于keras多任务多loss回传的思考
对Keras自带Loss Function的深入研究
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。