zoukankan      html  css  js  c++  java
  • 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,
    }
    
  • 相关阅读:
    Java集合框架--List 遍历
    Java集合框架--List 类
    Leetcode 239 Sliding Window Maximum (指定滑动窗最大值) (滑动窗口)
    Vim配置
    子字符串模板 (双指针, 滑动窗口)
    Leetcode 76 Minimum Window Substring. (最小窗口子字符串) (滑动窗口, 双指针)
    Leetcode 3 Longest Substring Without Repeating Characters. (最长无重复字符子串) (滑动窗口, 双指针)
    一切从赞美开始
    Leetcode 10 regular expression matching (正则表达式匹配) (动态规划)
    Leetcode 5 Longest Palindromic Substring (最长回文子字符串)(动态规划)
  • 原文地址:https://www.cnblogs.com/mlhz/p/10473517.html
Copyright © 2011-2022 走看看