Python多线程爬取海外新型肺炎每日实时更新数据!

Python多线程爬取海外新型肺炎每日实时更新新数据,并存入本地csv文件!

1. 爬取的内容。
网址:实时更新数据
内容:
在这里插入图片描述

2. 分析网页
观察网页发现,后台的数据是通过AJAX传递过来的,每一个国家的数据都在一个url里面的,再观察各国的url是相似的,只有一个请求参数不同,所以通过这个参数的改变可以请求到各国的疫情统计情况。
在这里插入图片描述
3. 编写业务代码
因为请求过来的数据是josn类型,只需简单的字段处理就行了。

# -*- coding: utf-8 -*-
#@Project filename:PythonDemo  Virus.py
#@IDE   :IntelliJ IDEA
#@Author :ganxiang
#@Date   :2020/04/01 0001 13:09

import requests
import csv
from urllib.parse import quote#用来解决url中文编码
from concurrent.futures import ThreadPoolExecutor,wait,ALL_COMPLETED
import time

def parse(url,country):
    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"}
    res =requests.get(url,headers).json()
    head =['date','confirm_add','confirm','heal','dead']
    with open("./SaveData/Virus/{}.csv".format(country),"w",newline="",encoding="gb18030") as f:
        write =csv.DictWriter(f,head)
        write.writeheader()
        for data in res['data']:
            write.writerow(data)

def run():
    #1,使用多线程获取数据
    t1 =time.time()
    countrys =['美国','意大利','西班牙','德国','法国','伊朗','英国','瑞士','土耳其','比利时','荷兰','奥地利','韩国','加拿大','葡萄牙',
               '巴西','以色列','挪威','澳大利亚','瑞典','捷克','爱尔兰','丹麦','马来西亚','智利','俄罗斯','波兰','厄瓜多尔','罗马尼亚',
               '日本','卢森堡','菲律宾','巴基斯坦','泰国','沙特阿拉伯','印度尼西亚','芬兰','印度','南非','希腊','墨西哥','巴拿马','冰岛',
               '多米尼加','秘鲁','阿根廷','新加坡','哥伦比亚','塞尔维亚','克罗地亚','斯洛文尼亚','卡塔尔','爱沙尼亚','阿尔及利亚','钻石号邮轮',
               '埃及','新西兰','伊拉克','阿联酋','乌克兰','摩洛哥','巴林','立陶宛','亚美尼亚','匈利亚','黎巴嫩','波黑','保加利亚','拉脱维亚',
               '突尼斯','安道尔','斯洛伐克','摩尔多瓦','哈沙克斯坦','哥斯达黎加','乌拉圭','北马其顿','阿塞拜疆','科威特','约旦','塞浦路斯',
               '布基纳法索','圣马力诺','越南']
    executor =ThreadPoolExecutor(max_workers=5)#设置线程个数
    tasks =[executor.submit(parse,'https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={}&'.format(quote(country)),
                            country)for  country in countrys]
    wait(tasks, return_when=ALL_COMPLETED)# 等待所有的线程完成,才进入后续的执行
    t2 =time.time()
    print("爬取完成,使用线程的执行时间为:",t2-t1)#爬取完成,使用线程的执行时间为: 11.562765836715698

    #2,不使用多线程获取数据
    # t1 =time.time()
    # countrys =['美国','意大利','西班牙','德国','法国','伊朗','英国','瑞士','土耳其','比利时','荷兰','奥地利','韩国','加拿大','葡萄牙',
    #            '巴西','以色列','挪威','澳大利亚','瑞典','捷克','爱尔兰','丹麦','马来西亚','智利','俄罗斯','波兰','厄瓜多尔','罗马尼亚',
    #            '日本','卢森堡','菲律宾','巴基斯坦','泰国','沙特阿拉伯','印度尼西亚','芬兰','印度','南非','希腊','墨西哥','巴拿马','冰岛',
    #            '多米尼加','秘鲁','阿根廷','新加坡','哥伦比亚','塞尔维亚','克罗地亚','斯洛文尼亚','卡塔尔','爱沙尼亚','阿尔及利亚','钻石号邮轮',
    #            '埃及','新西兰','伊拉克','阿联酋','乌克兰','摩洛哥','巴林','立陶宛','亚美尼亚','匈利亚','黎巴嫩','波黑','保加利亚','拉脱维亚',
    #            '突尼斯','安道尔','斯洛伐克','摩尔多瓦','哈沙克斯坦','哥斯达黎加','乌拉圭','北马其顿','阿塞拜疆','科威特','约旦','塞浦路斯',
    #            '布基纳法索','圣马力诺','越南']
    # for country in countrys:
    #     url ='https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country={}&'.format(quote(country))
    #     print(url)
    #     parse(url,country)
    # t2 =time.time()
    # print("爬取完成,不使用线程的执行时间为:",t2-t1)#使用线程的执行时间为: 55.894751310348511

if __name__ =='__main__':
    run()

4. 运行展示
在这里插入图片描述
5.部分数据展示
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值