用Python实现web抓取的周期性执行

2024-04-19 18:20:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的想法和我早期的工作。你知道吗

我的目标

  • 持续从中国政府获取1小时分辨率的空气污染数据。你知道吗
  • 该网站的数据收集的监测网站在全国各地每小时更新。你知道吗

我的代码

现在,我可以在一个小时内获得有用的信息。这是我的密码:

  1. 输入不同污染(co、no2、pm10等)的网站链接

    html_co = urllib.urlopen("http://www.pm25.in/api/querys/co.json?city=beijing&token=5j1znBVAsnSf5xQyNQyq").read().decode('utf-8')
    html_no2 = urllib.urlopen("http://www.pm25.in/api/querys/no2.json?city=beijing&token=5j1znBVAsnSf5xQyNQyq").read().decode('utf-8')
    html_pm10 = urllib.urlopen("http://www.pm25.in/api/querys/pm10.json?city=beijing&token=5j1znBVAsnSf5xQyNQyq").read().decode('utf-8')
    
  2. 获取html文档的内容。

    soup_co = BeautifulSoup(html_co)
    soup_no2 = BeautifulSoup(html_no2)
    soup_pm10 = BeautifulSoup(html_pm10)
    
  3. 从整个内容中提取有用的信息。

    l = soup_co.p.get_text() 
    co= json.loads(l) 
    l = soup_no2.p.get_text() 
    no2= json.loads(l) 
    l = soup_pm10.p.get_text() 
    pm10= json.loads(l)       
    
  4. 把原始数据压缩成整齐的1.数据帧.

    data = {"time":[],"station":[],"code":[],"co":[],"no2":[],"pm10":[]}
    for i in range(0,len(pm10)-1,1):
        ## 'station' is the monitor station's name in Chinese
        data["station"].append(co[i]["position_name"])
        data["time"].append(co[i]["time_point"])
        data["co"].append(co[i]["co"])
        ## 'code' is the monitor station's index
        data["code"].append(co[i]["station_code"])
        data["no2"].append(no2[i]["no2"])
        data["pm10"].append(pm10[i]["pm10"])
    

我的结果

一些预先的解释

  • 忽略表中的汉字。你知道吗
  • 我只抓取了一个城市(这里是北京)的数据,从0-11的指数通知北京有12个监测站点。你知道吗
  • ‘co’/‘NO2’/‘PM10’列代表这些空气污染物的浓度。
    http://i8.tietuku.com/cf59fbec6f89566d.png

我的问题

现在,我可以根据上面的代码手动获取web数据。但是,我想自动实现每小时以下的工作流程。你知道吗

一小时

  • 执行代码

  • (1)从网站上抓取一小时空气污染物数据;

  • (2)根据真实日期将数据保存到.csv中(如20160101.csv)

一小时后。你知道吗

  • 执行代码

  • (1)从网站抓取i+1小时大气污染物数据;

  • (2)根据真实日期将数据保存到.csv中。
    如果是同一天,则将其比作一小时-->;same.csv(如2016-01-01.csv)
    如果现在已经过去-->;创建一个新的.csv(如2016-01-02.csv)

我以前从没做过这种事。有人能给我一些建议吗?
所以,我可以得到一个有用的数据刮除工具在后台运行,我不必担心它。你知道吗


Tags: csv数据代码injsondata网站html
1条回答
网友
1楼 · 发布于 2024-04-19 18:20:22

如果你不关心你的程序,只是等了一个小时,你可以做:

def func(): 
    print('Time has passed')

while True:   
    delay = 1 * 60 * 60 # x hrs * 60 mins * 60 sec (waiting time in hrs)
    func()              # run your code
    time.sleep(delay)   # wait

这是v basic,不允许您在程序休眠时执行任何操作。你知道吗

相关问题 更多 >