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.部分数据展示