91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何通過Scrapy框架實現爬取百度新冠疫情數據

發布時間:2022-03-03 15:20:41 來源:億速云 閱讀:313 作者:小新 欄目:開發技術

這篇文章主要介紹了Python如何通過Scrapy框架實現爬取百度新冠疫情數據,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    環境部署

    主要簡單推薦一下

    插件推薦

    這里先推薦一個Google Chrome的擴展插件xpath helper,可以驗證xpath語法是不是正確。

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    爬蟲目標

    需要爬取的頁面:實時更新:新型冠狀病毒肺炎疫情地圖

    主要爬取的目標選取了全國的數據以及各個身份的數據。

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    項目創建

    使用scrapy命令創建項目

    scrapy startproject yqsj

    webdriver部署

    這里就不重新講一遍了,可以參考我這篇文章的部署方法:Python 詳解通過Scrapy框架實現爬取CSDN全站熱榜標題熱詞流程

    項目代碼

    開始擼代碼,看一下百度疫情省份數據的問題。

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    頁面需要點擊展開全部span。所以在提取頁面源碼的時候需要模擬瀏覽器打開后,點擊該按鈕。所以按照這個方向,我們一步步來。

    Item定義

    定義兩個類YqsjProvinceItem和YqsjChinaItem,分別定義國內省份數據和國內數據。

    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/items.html
     
    import scrapy
     
     
    class YqsjProvinceItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        location = scrapy.Field()
        new = scrapy.Field()
        exist = scrapy.Field()
        total = scrapy.Field()
        cure = scrapy.Field()
        dead = scrapy.Field()
     
     
    class YqsjChinaItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        # 現有確診
        exist_diagnosis = scrapy.Field()
        # 無癥狀
        asymptomatic = scrapy.Field()
        # 現有疑似
        exist_suspecte = scrapy.Field()
        # 現有重癥
        exist_severe = scrapy.Field()
        # 累計確診
        cumulative_diagnosis = scrapy.Field()
        # 境外輸入
        overseas_input = scrapy.Field()
        # 累計治愈
        cumulative_cure = scrapy.Field()
        # 累計死亡
        cumulative_dead = scrapy.Field()

    中間件定義

    需要打開頁面后點擊一下展開全部。

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    完整代碼

    # Define here the models for your spider middleware
    #
    # See documentation in:
    # https://docs.scrapy.org/en/latest/topics/spider-middleware.html
     
    from scrapy import signals
     
    # useful for handling different item types with a single interface
    from itemadapter import is_item, ItemAdapter
    from scrapy.http import HtmlResponse
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver import ActionChains
    import time
     
     
    class YqsjSpiderMiddleware:
        # Not all methods need to be defined. If a method is not defined,
        # scrapy acts as if the spider middleware does not modify the
        # passed objects.
     
        @classmethod
        def from_crawler(cls, crawler):
            # This method is used by Scrapy to create your spiders.
            s = cls()
            crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
            return s
     
        def process_spider_input(self, response, spider):
            # Called for each response that goes through the spider
            # middleware and into the spider.
     
            # Should return None or raise an exception.
            return None
     
        def process_spider_output(self, response, result, spider):
            # Called with the results returned from the Spider, after
            # it has processed the response.
     
            # Must return an iterable of Request, or item objects.
            for i in result:
                yield i
     
        def process_spider_exception(self, response, exception, spider):
            # Called when a spider or process_spider_input() method
            # (from other spider middleware) raises an exception.
     
            # Should return either None or an iterable of Request or item objects.
            pass
     
        def process_start_requests(self, start_requests, spider):
            # Called with the start requests of the spider, and works
            # similarly to the process_spider_output() method, except
            # that it doesn't have a response associated.
     
            # Must return only requests (not items).
            for r in start_requests:
                yield r
     
        def spider_opened(self, spider):
            spider.logger.info('Spider opened: %s' % spider.name)
     
     
    class YqsjDownloaderMiddleware:
        # Not all methods need to be defined. If a method is not defined,
        # scrapy acts as if the downloader middleware does not modify the
        # passed objects.
     
        @classmethod
        def from_crawler(cls, crawler):
            # This method is used by Scrapy to create your spiders.
            s = cls()
            crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
            return s
     
        def process_request(self, request, spider):
            # Called for each request that goes through the downloader
            # middleware.
     
            # Must either:
            # - return None: continue processing this request
            # - or return a Response object
            # - or return a Request object
            # - or raise IgnoreRequest: process_exception() methods of
            #   installed downloader middleware will be called
            # return None
            try:
                spider.browser.get(request.url)
                spider.browser.maximize_window()
                time.sleep(2)
                spider.browser.find_element_by_xpath("//*[@id='nationTable']/div/span").click()
                # ActionChains(spider.browser).click(searchButtonElement)
                time.sleep(5)
                return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,
                                    encoding="utf-8", request=request)
            except TimeoutException as e:
                print('超時異常:{}'.format(e))
                spider.browser.execute_script('window.stop()')
            finally:
                spider.browser.close()
     
        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
            return response
     
        def process_exception(self, request, exception, spider):
            # Called when a download handler or a process_request()
            # (from other downloader middleware) raises an exception.
     
            # Must either:
            # - return None: continue processing this exception
            # - return a Response object: stops process_exception() chain
            # - return a Request object: stops process_exception() chain
            pass
     
        def spider_opened(self, spider):
            spider.logger.info('Spider opened: %s' % spider.name)

    定義爬蟲

    分別獲取國內疫情數據以及省份疫情數據。完整代碼:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2021/11/7 22:05
    # @Author  : 至尊寶
    # @Site    : 
    # @File    : baidu_yq.py
     
    import scrapy
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
     
    from yqsj.items import YqsjChinaItem, YqsjProvinceItem
     
     
    class YqsjSpider(scrapy.Spider):
        name = 'yqsj'
        # allowed_domains = ['blog.csdn.net']
        start_urls = ['https://voice.baidu.com/act/newpneumonia/newpneumonia#tab0']
        china_xpath = "//div[contains(@class, 'VirusSummarySix_1-1-317_2ZJJBJ')]/text()"
        province_xpath = "//*[@id='nationTable']/table/tbody/tr[{}]/td/text()"
        province_xpath_1 = "//*[@id='nationTable']/table/tbody/tr[{}]/td/div/span/text()"
     
        def __init__(self):
            chrome_options = Options()
            chrome_options.add_argument('--headless')  # 使用無頭谷歌瀏覽器模式
            chrome_options.add_argument('--disable-gpu')
            chrome_options.add_argument('--no-sandbox')
            self.browser = webdriver.Chrome(chrome_options=chrome_options,
                                            executable_path="E:\\chromedriver_win32\\chromedriver.exe")
            self.browser.set_page_load_timeout(30)
     
        def parse(self, response, **kwargs):
            country_info = response.xpath(self.china_xpath)
            yq_china = YqsjChinaItem()
            yq_china['exist_diagnosis'] = country_info[0].get()
            yq_china['asymptomatic'] = country_info[1].get()
            yq_china['exist_suspecte'] = country_info[2].get()
            yq_china['exist_severe'] = country_info[3].get()
            yq_china['cumulative_diagnosis'] = country_info[4].get()
            yq_china['overseas_input'] = country_info[5].get()
            yq_china['cumulative_cure'] = country_info[6].get()
            yq_china['cumulative_dead'] = country_info[7].get()
            yield yq_china
            
            # 遍歷35個地區
            for x in range(1, 35):
                path = self.province_xpath.format(x)
                path2 = self.province_xpath_1.format(x)
                province_info = response.xpath(path)
                province_name = response.xpath(path2)
                yq_province = YqsjProvinceItem()
                yq_province['location'] = province_name.get()
                yq_province['new'] = province_info[0].get()
                yq_province['exist'] = province_info[1].get()
                yq_province['total'] = province_info[2].get()
                yq_province['cure'] = province_info[3].get()
                yq_province['dead'] = province_info[4].get()
                yield yq_province

    pipeline輸出結果文本

    將結果按照一定的文本格式輸出出來。完整代碼:

    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
     
     
    # useful for handling different item types with a single interface
    from itemadapter import ItemAdapter
     
    from yqsj.items import YqsjChinaItem, YqsjProvinceItem
     
     
    class YqsjPipeline:
        def __init__(self):
            self.file = open('result.txt', 'w', encoding='utf-8')
     
        def process_item(self, item, spider):
            if isinstance(item, YqsjChinaItem):
                self.file.write(
                    "國內疫情\n現有確診\t{}\n無癥狀\t{}\n現有疑似\t{}\n現有重癥\t{}\n累計確診\t{}\n境外輸入\t{}\n累計治愈\t{}\n累計死亡\t{}\n".format(
                        item['exist_diagnosis'],
                        item['asymptomatic'],
                        item['exist_suspecte'],
                        item['exist_severe'],
                        item['cumulative_diagnosis'],
                        item['overseas_input'],
                        item['cumulative_cure'],
                        item['cumulative_dead']))
            if isinstance(item, YqsjProvinceItem):
                self.file.write(
                    "省份:{}\t新增:{}\t現有:{}\t累計:{}\t治愈:{}\t死亡:{}\n".format(
                        item['location'],
                        item['new'],
                        item['exist'],
                        item['total'],
                        item['cure'],
                        item['dead']))
            return item
     
        def close_spider(self, spider):
            self.file.close()

    配置文件改動

    直接參考,自行調整:

    # Scrapy settings for yqsj project
    #
    # For simplicity, this file contains only settings considered important or
    # commonly used. You can find more settings consulting the documentation:
    #
    #     https://docs.scrapy.org/en/latest/topics/settings.html
    #     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    #     https://docs.scrapy.org/en/latest/topics/spider-middleware.html
     
    BOT_NAME = 'yqsj'
     
    SPIDER_MODULES = ['yqsj.spiders']
    NEWSPIDER_MODULE = 'yqsj.spiders'
     
     
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    #USER_AGENT = 'yqsj (+http://www.yourdomain.com)'
    USER_AGENT = 'Mozilla/5.0'
     
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
     
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    #CONCURRENT_REQUESTS = 32
     
    # Configure a delay for requests for the same website (default: 0)
    # See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    #DOWNLOAD_DELAY = 3
    # The download delay setting will honor only one of:
    #CONCURRENT_REQUESTS_PER_DOMAIN = 16
    #CONCURRENT_REQUESTS_PER_IP = 16
     
    # Disable cookies (enabled by default)
    COOKIES_ENABLED = False
     
    # Disable Telnet Console (enabled by default)
    #TELNETCONSOLE_ENABLED = False
     
    # Override the default request headers:
    DEFAULT_REQUEST_HEADERS = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
    }
     
    # Enable or disable spider middlewares
    # See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
    SPIDER_MIDDLEWARES = {
       'yqsj.middlewares.YqsjSpiderMiddleware': 543,
    }
     
    # Enable or disable downloader middlewares
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
    DOWNLOADER_MIDDLEWARES = {
       'yqsj.middlewares.YqsjDownloaderMiddleware': 543,
    }
     
    # Enable or disable extensions
    # See https://docs.scrapy.org/en/latest/topics/extensions.html
    #EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    #}
     
    # Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
       'yqsj.pipelines.YqsjPipeline': 300,
    }
     
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/autothrottle.html
    #AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    #AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    #AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    #AUTOTHROTTLE_DEBUG = False
     
    # Enable and configure HTTP caching (disabled by default)
    # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    #HTTPCACHE_ENABLED = True
    #HTTPCACHE_EXPIRATION_SECS = 0
    #HTTPCACHE_DIR = 'httpcache'
    #HTTPCACHE_IGNORE_HTTP_CODES = []
    #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

    驗證結果

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    看看結果文件

    Python如何通過Scrapy框架實現爬取百度新冠疫情數據

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python如何通過Scrapy框架實現爬取百度新冠疫情數據”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    博野县| 天祝| 修武县| 延津县| 正安县| 罗田县| 田林县| 江城| 绿春县| 奉节县| 类乌齐县| 乐昌市| 塔河县| 英吉沙县| 永福县| 济宁市| 信阳市| 怀远县| 呼图壁县| 凤城市| 孝昌县| 宝兴县| 张家口市| 四会市| 定陶县| 阳新县| 岳西县| 普陀区| 巴彦淖尔市| 北流市| 襄汾县| 桓仁| 通江县| 舟山市| 秀山| 建德市| 安国市| 武山县| 孟津县| 绥阳县| 江源县|