网络安全 基于scrapy框架与selenium、openpyxl库爬取国外各国家疫情统计汇总信息

news/2024/7/19 10:30:35 标签: python, 爬虫, 网络安全, selenium

seleniumopenpyxl_0">网络安全 基于scrapy框架与selenium、openpyxl库爬取国外各国家疫情统计汇总信息

数据来源
https://voice.baidu.com/act/newpneumonia/newpneumonia/

思路
由于目标页面中的数据是动态加载出来的,所以直接发起请求得到的响应是不包含任何有用数据的,所以需要使用selenium的浏览器驱动器进行请求发送并获得包含数据的响应。同时继续观察页面发现,初始加载的页面只包含前面一部分数据,剩余数据需要手动点击“展开全部”才能加载全部数据,所以还需要使用动作链进行模拟点击操作。获取到的响应解析后都存储到excel表格中,方便后续的使用。
在这里插入图片描述

起始url即为目标网站,但是此次请求获得的响应是不包含数据的,所以不能直接将该响应用于解析,需要在下载中间件中进行拦截和篡改。下载中间件拦截后由浏览器驱动器再次对该网站发起请求,然后使用动作链,找到并模拟点击“展开全部”,获得到包含完整数据的响应,再将该响应封装后返回给爬虫进行解析。

python">    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
        print('开始请求……')
        spider.bro.get(request.url)  # 拦截响应,重新请求获取完整响应
        actions = ActionChains(spider.bro)
        actions.click(spider.bro.find_element_by_xpath('//*[@id="foreignTable"]/div/span')).perform()  # 点击“展开全部”
        actions.release()  # 释放动作链
        page_text = spider.bro.page_source
        new_response = http.HtmlResponse(url=request.url, body=page_text, encoding='utf-8', request=request)  # 篡改响应为新请求的完整的页面
        return new_response

使用xpath对响应进行解析,解析到的数据存储在item中提交给管道。

python">class NewCoronaCrawlerItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    area = scrapy.Field()  # 地区
    new = scrapy.Field()  # 新增
    total = scrapy.Field()  # 累计
    cured = scrapy.Field()  # 治愈
    death = scrapy.Field()  # 死亡
python">    def parse(self, response, **kwargs):
        print('开始解析……')
        tr_list = response.xpath('//*[@id="foreignTable"]/table/tbody/tr/td/table/tbody/tr')
        for tr in tr_list:
            data = tr.xpath('./td//text()').getall()
            item = NewCoronaCrawlerItem()
            item['area'] = data[0]
            item['new'] = data[1]
            item['total'] = data[2]
            item['cured'] = data[3]
            item['death'] = data[4]
            yield item

管道中使用openpyxl打开excel表格,新建一个工作表,并命名为“年-月-日_时-分-秒”,将所有数据写入并保存后关闭。

python">class NewCoronaCrawlerPipeline:
    wb = None
    ws = None

    def open_spider(self, spider):
        self.wb = openpyxl.load_workbook(r'新型冠状病毒肺炎国外各国家疫情统计汇总.xlsx')  # 打开工作簿
        self.ws = self.wb.create_sheet(time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(time.time())))  # 新建工作表,命名为年月日时分秒
        self.ws.append(['地区', '新增', '累计', '治愈', '死亡'])  # 插入表头

    def process_item(self, item, spider):
        self.ws.append([item['area'], int(item['new']), int(item['total']), int(item['cured']), int(item['death'])])  # 插入一行数据
        return item

    def close_spider(self, spider):
        print('保存数据……')
        self.wb.save(r'新型冠状病毒肺炎国外各国家疫情统计汇总.xlsx')
        self.wb.close()
        print('保存完成!')

同时为了提高效率可以将浏览器驱动器设置为无头浏览器,并且设置规避检测提高安全性。

python">    def __init__(self):
        super().__init__()
        # 设置为无头浏览器
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        # 规避检测
        option = webdriver.ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.bro = webdriver.Chrome(executable_path=r'chromedriver.exe', options=option, chrome_options=chrome_options)

对于起始请求,需要修改配置文件中的信息不遵守robots.txt协议,并且进行UA伪装,同时开启下载中间件和管道,修改显示的日志等级。

结果

在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/1712006.html

相关文章

算法设计 格雷码问题

算法设计 格雷码问题 1. 问题描述 对于给定的正整数n,格雷码为满足如下条件的一个编码序列: (1) 序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2) 序列中无相同的编码。 (3) 序列中位置相邻的两个编码恰有一位不同。 例如&#x…

python将GPS时间戳批量转换为日期时间(年月日时分秒)

#将GPS时间戳数据批量转化为日期时间 import numpy as np import pandas as pd import time#设置Spyder右侧console区的print输出行列数无限制 pd.set_option(display.max_columns, None) pd.set_option(display.max_rows, None) #读取数据 datapd.read_excel(C:/Users/Adminis…

算法设计 L型组件填图问题

算法设计 L型组件填图问题 1. 问题描述 设B是一个nn棋盘,n2k,(k1,2,3,…)。用分治法设计一个算法,使得:用若干个L型条块可以覆盖住B的除一个特殊方格外的所有方格。其中,一个L型条块可以覆盖3个方格。且任意两个L型条块不能重叠覆…

算法设计 最长递增子序列问题

算法设计 最长递增子序列问题 1. 问题描述 求一个由n个整数组成的整数序列的最长递增子序列。一个整数序列的递增子序列可以是序列中非连续的数按照原序列顺序排列而成的。 最长递增子序列是其递增子序列中长度最长的。 2. 具体要求 输入:输入的第一行是一个正整数…

算法设计 凸多边形的三角剖分

算法设计 凸多边形的三角剖分 1. 问题描述 设P是一个有n个顶点的凸多边形,P中的弦是P中连接两个非相邻顶点的线段。用P中的n-3条弦将P剖分成n-2个三角形(如下图所示)。使得n-3弦的长度之和最小的三角剖分称为最优三角剖分。 2. 具体要求 输入…

python根据excel时间表统计24小时各小时区间点的个数

1.首先使用excel中的HOUR()函数,将日期数据(年/月/日 时:分:秒)转换为小时,表格命名为hour.xlsx: 2.使用python读取excel数据hour.xlsx,将小时列转换为列表hour, 将列表hour转换为集合myset,使用count函数统计24小时各小时区间点的…

python实现几种常用的排序算法(冒泡排序,快速排序,选择排序,堆排序,插入排序,希尔排序,归并排序),带注释简单通俗易懂

1.冒泡排序算法 # 冒泡排序算法(从小到大) #方法1 def bubblesort(data):nlen(data)for i in range(0,n):for j in range(i1,n):if data[i]>data[j]:data[i],data[j]data[j],data[i]return data if __name__ __main__:a[58,47,69,20,15,66,52,80,30,64]print(bubblesort(a…

算法设计 加油问题

算法设计 加油问题 1. 问题描述 一个旅行家想驾驶汽车从城市A到城市B(设出发时油箱是空的)。给定两个城市之间的距离dis、汽车油箱的容量c、每升汽油能行驶的距离d、沿途油站数n、油站i离出发点的距离d[i]以及该站每升汽油的价格p[i],i1,2,…,n。设d[1]…