• 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_dataday3chromedriver.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,
    }
    
  • 相关阅读:
    newifi3-D2 openwrt挂载u盘扩容/overlay
    # mac使用homebrew安装jdk和tomcat
    React学习小记--setState的同步与异步
    [vscode直接运行js文件报错]: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
    # js权威指南之对象篇
    # 初体验之腾讯位置服务彩云天气开发者api
    自用资源合集(持续更新)
    网页嵌入播客
    网页嵌入音乐歌单
    All live
  • 原文地址:https://www.cnblogs.com/mlhz/p/10473517.html
Copyright © 2020-2023  润新知