一、昨天报错的原因和处理方法
昨天在数据爬取的过程中遇到了列表数组越界报错
在询问了大佬之后,得知是
script = soup.find(id='getListByCountryTypeService2true')
text = script.text
应该为
script = soup.find(id='getListByCountryTypeService2true')
text = script.string
原因是text已经指定了str类型,而我查找的内容超出了text的范围的“bs4.element.Script
”
将获取的数据装进一个列表里,这个列表长度是1,即只包含一根元素,就不会再出现越界的报错
执行后会得到这样的字典和字符串
小结:
json和python间的相互转换
二、疫情爬虫项目
1.实现采集最近一日世界各国疫情数据
from encodings import gbk
coding = gbk
import requests
from bs4 import BeautifulSoup
import re
import json
# 1. 发送请求, 获取疫情首页
response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia')
home_page = response.content.decode()
# 2. 从疫情首页, 提取最近一日各国疫情数据
soup = BeautifulSoup(home_page, 'lxml')
script = soup.find(id="getListByCountryTypeService2true")
text = script.string
# print(text)
# 3. 从疫情数据中, 获取json格式的字符串
json_str = re.findall(r'\[.+]', text)[0]
print(json_str)
# 4. 把json格式的字符串转换为Python类型
last_day_corona_virus = json.loads(json_str)
# print(last_day_corona_virus)
# 5. 以json格式保存, 最近一日各国疫情数据
with open('data/last_day_corona_virus.json', 'w', encoding=utf-8) as fp:
json.dump(last_day_corona_virus, fp, ensure_ascii=False)
得到数据
2.采集1月1日以来各国疫情数据
在之前爬取到的数据中,有一个叫做statisticsData的标签,这是各国疫情数据的统计内容
验证方法:
找到标签下的任意一个json地址
下载到json文件
其中有当前人数curedCount和日期dateId,能看到日期所记录的时间
由于我们的数据中有200多个国家,如果想要爬取各国数据,就要发送200多次请求,那么之前的方法就会显得有些臃肿,所以需要重构代码,使其具有更好的扩展性