Python爬虫之Scrapy框架使用selenium

在scrapy中使用selenium的编码流程:

    1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性)
    2.重写spider的一个方法closed(self,spider),在该方法中执行浏览器关闭的操作
    3.在下载中间件的process_response方法中,通过spider参数获取浏览器对象
    4.在中间件的process_response中定制基于浏览器自动化的操作代码(获取动态加载出来的页面源码数据)
    5.实例化一个响应对象,且将page_source返回的页面源码封装到该对象中
    6.返回该新的响应对象

需求 在Scrapy框架中使用selenium来实现编程 网易页面

wangyi.py

import scrapy
from selenium import webdriver
# 实例化浏览器可以通过中间件的process_response中的spider来获取
#因此实例化浏览器可以写在这里
class WangyiSpider(scrapy.Spider):
    name = 'wangyi'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['http://war.163.com/']
    #实例化浏览器对象  只能被调一次
    def __init__(self):
        self.bro = webdriver.Chrome(r'C:\pacong_data\day3\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()

middlewares.py

from time import sleep
#1 HtmlResponse是response对应的类
from scrapy.http import HtmlResponse

class WangyiproDownloaderMiddleware(object):
    #拦截响应 重新生成一个新的响应对象 包含动态数据 实例化浏览器中不能写在这 这个方法可能会调多次
    #实例化浏览器可以通过中间件的process_response中的spider来获取
    #这里的request是response中所对应的请求对象
    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
        #核心内容  如何获取动态加载的数据  使用selenium

        #获取实例化的浏览器对象 通过spider来获取
        #让这个浏览器发送get请求  是请求的url
        #也就是wangyi.py中的start_urls = ['http://war.163.com/']  这个url
        print('即将返回一个新的响应对象')
        bro = spider.bro
        bro.get(url=request.url)
        #注意 这两个写法是一致的
        # bro.get(url='http://war.163.com/')
        # bro.get(url=spider.bro.current_url)
        sleep(3)
        #包含了动态加载出来的数据   获取到页面源码数据
        page_text = bro.page_source
        #body 响应体

        return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)

settings.py

BOT_NAME = 'wangyiPro'

SPIDER_MODULES = ['wangyiPro.spiders']
NEWSPIDER_MODULE = 'wangyiPro.spiders'

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'wangyiPro (+http://www.yourdomain.com)'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

DOWNLOADER_MIDDLEWARES = {
   'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
}
posted @ 2019-03-04 21:55  茉莉花M  阅读(1285)  评论(1编辑  收藏  举报