回想去年写毕业论文时候需要数据,虽然数据量不大,但是手工录入,也是颇费眼神。现在自学了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')

谢谢大家,请多指教!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐