回想去年写毕业论文时候需要数据,虽然数据量不大,但是手工录入,也是颇费眼神。现在自学了Python,就拿曾经的需求当做案例吧!
爬取目标:最近20年每个月的仔猪价格,生猪价格和猪肉价格
爬取软件:python 3.7.2 IDE:PyCharm
爬取包:requests, pandas ,lxml, time
打开如下部分:
打开检查,如下图
很好,数据就在最后的大红框里面,分别对应着时间和价格。有前端基础一眼就能看出这是一个xml文档.html为树结构,xml也是树结构,因此我们可以像解析html一样解析xml。到这里我们就可以爬取仔猪价格数据了。
还有生猪价格和猪肉价格没爬取呢,别急,看一下网址构造:
发现这个链接变化之处有两个地方,因此可以构建一个dict以构造多个URL。循环每个URL,请求,解析,存储为bj_prok.xlsx
pigdata ={'smallpig':1565318072807,'livepig':1565327925160,'pork':1565328013572}
最终爬取效果(展示部分):
全部代码如下:
import requests
from lxml import etree
import pandas as pd
import time
#构造字典
pigdata ={'smallpig':1565318072807,'livepig':1565327925160,'pork':1565328013572}
#构造函数get_info,解析网页
def get_info(link):
#请求url
res = requests.get(url)
#转换类型
html = etree.HTML(res.text)
#解析属性值,用@属性
date = html.xpath('//*[@name="2000"]/point/@name')
prices = html.xpath('//*[@name="2000"]/point/@y')
#返回日期和价格
return date,prices
i=1
#遍历字典pigdata,同时遍历键和值
for pigtype,pignum in pigdata.items():
#构造url
url = 'http://www.caaa.cn/market/trend/local/xml/2-1-{type}.xml?&XMLCallDate={num}'.format(type=pigtype,num=pignum)
# print(url)
#调用函数get_info
pigs = get_info(url)
if i ==1:
small_pig = pd.DataFrame({'时间': pigs[0], '仔猪价格(元/千克)': pigs[1]}, index=range(1, len(pigs[0]) + 1))
elif i==2:
live_pig = pd.DataFrame({'活猪价格(元/千克)': pigs[1]}, index=range(1, len(pigs[0]) + 1))
else:
pig = pd.DataFrame({'猪肉价格(元/千克)': pigs[1]}, index=range(1, len(pigs[0]) + 1))
i+=1
#控制循环时间,3秒循环一次
time.sleep(3)
#pandas合并DataFrame
pork = pd.concat([small_pig,live_pig,pig],axis=1)
print(pork)
#存储到硬盘
pork.to_excel('bj_pork.xlsx')
谢谢大家,请多指教!