欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫之Scrapy框架使用selenium

程序员文章站 2022-05-06 18:50:57
...

在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,
}