Scrapy 框架 使用 selenium 爬取动态加载内容

使用 selenium 爬取动态加载内容

  • 开启中间件

    DOWNLOADER_MIDDLEWARES = {
       'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
    }
  1. 在爬虫文件中 创建 浏览器对象

    使用 爬虫文件的 init 方法

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

    数据解析:

    start_urls = ['http://news.163.com/domestic/']
    ....... 
    def parse(self, response):
        div_list = response.xpath('//div[@class="ndi_main"]/div')
        for div in div_list:
            title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
            detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first()
            print(title,detail_url)
  2. 操作在 process_response(self,request,response,spider) 中 编写 浏览器自动化操作

    进行点击 或者 页面滚动

    返回新的 response 对象

    rom time import sleep
    from scrapy.http import HtmlResponse
    
    class WangyiproDownloaderMiddleware(object):
        #拦截所有的响应对象
        def process_response(self, request, response, spider):
            # request.url  拦截到响应的 url 判断是否是请求的响应 对象
            # 有些页面 不需要 使用 selenium 直接返回 response
            # 参数spider表示的就是爬虫类的一个对象
            # 使用一个满足需求的新的响应对象替换原有的
            bro = spider.bro # 浏览器对象
            url = spider.start_urls[0]
            bro.get(url)
            bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            sleep(2)
            bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            sleep(2)
            bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            sleep(2)
            a_tag = bro.find_elements_by_class_name('load_more_btn')[0]
            a_tag.click()
            sleep(2)
            page_text = bro.page_source
            #实例化一个新的响应对象
            response = HtmlResponse(url=bro.current_url,body=page_text,encoding='utf-8',request=request)
            return response
  3. 关闭 浏览器对象

    • 重写 closed(self,spider):

      def closed(self,spider):
          self.bro.quit()

猜你喜欢

转载自www.cnblogs.com/zhang-zi-yi/p/10749447.html