在通过scrapy框架进行某些网站数据爬取的时候,往往会有页面数据动态加载的情况,如果不做其他操作,获取到的仅仅是当前页面加载的数据,是获取不到动态加载出来的那部分的,所以这时候我们就用到了selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据

  • selenium在scrapy中的使用流程 1.在spider的init方法中实例化一个浏览器对象
        2.在spider的closed方法中关闭浏览器对象
        3.在下载中间件类的process_response方法中接收spider中的浏览器对象
        4.处理执行相关自动化操作(发起请求,获取页面数据)
        5.实例化一个新的响应对象(from scrapy.http import HtmlResponse),且将页面数据存储到该对象中
        6.返回新的响应对象
        7.在配置文件中开启中间件

 

代码示例 : 爬取网易新闻的国内板块下的新闻数据

爬虫文件 :

# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver


class WangyiSpider(scrapy.Spider):
    name = 'wangyi'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['http://war.163.com/']

    def __init__(self):
        self.bro = webdriver.Chrome(executable_path=r'C:\Users\Administrator\Desktop\爬虫+数据\day_03_爬虫\chromedriver.exe')

    def parse(self, response):
        div_list = response.xpath('//div[@class="data_row news_article clearfix "]')
        for div in div_list:
            title = div.xpath('.//div[@class="news_title"]/h3/a/text()').extract_first()
            print(title)

    def closed(self,spider):
        print('关闭浏览器对象!')
        self.bro.quit()

 

下载中间件:

class WangyiproDownloaderMiddleware(object):
    
    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        print('即将返回一个新的响应对象!!!')
        #如何获取动态加载出来的数据
        bro = spider.bro
        bro.get(url=request.url)
        sleep(3)
        #包含了动态加载出来的新闻数据
        page_text = bro.page_source
        sleep(3)
        return HtmlResponse(url=spider.bro.current_url,body=page_text,encoding='utf-8',request=request)

 

settings.py : 解注释下载中间件配置