一、网站分析
-
首先打开这个网站https://news.qq.com/zt2020/page/feiyan.htm#/global?nojump=1。在此选择一个国家,例如美国
-
F12打开浏览器的开发者工具,刷新一下,找到
network
,并选中XHR
。之后选中list?country
那一行
-
选择header中查看数据项具体信息
http请求为post请求,参数为contry,对应的url为https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=%E7%BE%8E%E5%9B%BD&
-
使用
urllib
解析url
# 解析url
from urllib import parse # urllib为python中用于处理http请求,parse子模块用于处理url
# 使用unquote方法解析url
URL="https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=%E7%BE%8E%E5%9B%BD&"
parse.unquote(URL)
url最后类似于乱码形式的字符串为国家名转码以后的文本。如果需要获取其他国家的数据,只需要将url变为:
https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=国家名称&
即可,在拼接时无法使用中文,可以使用quote进行转码
举例使用:
# 使用quote方式转码
URL="https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=%s&"
country=input("请输入查询国家")
print(URL%(parse.quote(country)))
二、数据获取
使用requests模块模拟浏览器获取数据。
requests模块是python中的http请求库,使用简单且功能强大。需要进行安装,可以使用pip install requests
来安装
- 模拟用户在浏览器敲回车发送请求。浏览器在发送请求时会携带一些信息,为了达到模拟浏览器的目的,爬虫也需要加入这些信息进行伪装,可以直接将浏览器中对应信息直接粘贴过来。
"Referer"、"Host"、"Origin"、"User-Agent"
为常用字段,根据浏览器中header中的这几项对应的值把他们粘贴过来。
则
import requests
URL="https://api.inews.qq.com/newsqa/v1/automation/foreign/daily/list?country=%s&"
headers={
"Referer":"Referer: https://news.qq.com/",
"Host":"api.inews.qq.com",
"Origin":"https://news.qq.com",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
requests.post(url,[data,][headers,][proxies,]*args):使用post方式向目标发送请求
-url:服务器对应地址
-data:请求时携带的数据
-headers:HTTP请求中headers字段
-proxies:设置代理IP地址
以上为post请求,若为get请求应改为requests.get(url,[data,][headers,][proxies,]*args)
- 定义get_response函数
def get_response(country):
url=URL%(parse.quote(country))
data={
"country":country,
}
response=requests.post(url,data=data,headers=headers) # 发送请求:携带拼接好的url、参数data和headers
return response
- 查看获取的内容
# 查看获取的内容
country=input("请输入查询国家:")
res=get_response(country) # 此时返回的是响应的对象
print(res.text) # response.text 查看响应中的文本信息
# 将数据写入本地
with open("yiqing.xls","a") as f:
f.write(res.text)
- 虽然已经获取数据,但是数据本身并不直观,需要进行处理。通过前面的观察可以发现,数据时字符串形式的字典(json), 我们将其转化为字典,然后使用pandas进行处理,最后保存至Excel文件中。
data=res.text
data=eval(data) # 转为字典
# 数据中只有data对应的键值对为数据
data=data["data"]
print(data)
- 导入pandas ,需要进行安装
# 导入pandas ,需要进行安装
import pandas as pd # 使用as给包起别名
df=pd.DataFrame(data) # DataFrame为pandas中的一个数据结构,类似于二维表格
df
- 此时的数据比较明了,但是数据中有一项多余:confirm_add,即新增病例
新增病例我们可以根据当前病例数减去昨日病例进行计算,所以此处可进行删除。
# DataFrame中的drop方法可以通过指定标签名称和相应的轴,或直接指定索引或列名称来删除行或列。通过axis来指定
df=df.drop(["confirm_add"],axis=1)
df
- 保存数据,写入本地Excel文件中
# 保存数据,写入本地Excel文件中
# python操作Excel文件需要安装环境依赖xlwt、xlrd工具包
df.to_excel("yiqing.xls",index=False) # to_csv可以写入到csv文件中
- 读取文件,查看写入数据
# 读取文件,查看写入数据
df=pd.read_excel("yiqing.xls",index_col=None)
df