通过迭代几年的日期来创建URL列表

时间:2018-09-22 15:55:29

标签: python date for-loop web-scraping web-crawler

  

http://weather.ap.polyu.edu.hk/displayHandler.php year = 2018&month = 8&date = 19 &optStation = 6100&optElement = f1&isFlag =

大家好!我是一名建筑专业的学生,​​他正在尝试从气象站网站上收集一些数据。我对return collect([ ['name' => 'Povilas','email'=>'povilas@laraveldaily.com'], ['name' => 'Taylor','email' => 'taylor@laravel.com'] ])->each(function($value){ return $value; // Do what you want here }); 不太了解,所以我尝试使用名为web-crawling的chrome浏览器下载以下链接的所有图像。

为此,我首先需要创建一个包含所有链接的CSV文件,我想知道是否有更快的方法可以在Python中使用data miner来做到这一点。

从图片中我们可以看到,所有这些链接的唯一更改参数是日期期限。对于日期,我需要将其迭代3年。

我尝试用Python切片,但是有太多语句使我感到困惑。所以我想知道导入dates是否可以帮助实现这一点。有人介意向我展示如何在这几年中进行迭代,并将年月日准确地放入URL中,并最终得到一个CSV文件吗?

我更喜欢使用Python。

非常感谢!

1 个答案:

答案 0 :(得分:0)

Python 3

from datetime import datetime, timedelta
from urllib.parse import urlencode, urlparse, urlunparse


def all_dates(start_date, end_date):
    current_date = start_date
    one_day = timedelta(days=1)
    while current_date != end_date:
        yield current_date
        current_date += one_day
    yield current_date


def generate_url(date):
    base_url = 'http://weather.ap.polyu.edu.hk/displayHandler.php'
    parsed = urlparse(base_url)
    query = urlencode({
        'year': date.year,
        'month': date.month,
        'date': date.day,
        'optStation': 6100,
        'optElement': 'f1',
        'isFlag': ''
    })
    return urlunparse((
        parsed.scheme,
        parsed.netloc,
        parsed.path,
        parsed.params,
        query,
        parsed.fragment
    ))


if __name__ == '__main__':
    start_date = datetime(year=2015, month=1, day=1)
    end_date = datetime(year=2018, month=1, day=1)

    with open('outfile.csv', 'w') as f:
        for date in all_dates(start_date, end_date):
            f.write('{}\n'.format(generate_url(date)))

您没有回答确切的开始/结束日期应该是什么,因此我只想猜测一个例子(2015年1月1日至2018年1月1日)。您可以简单地将这两个变量start_dateend_date更改为 任何你想要的。

outfile.csv

您还可以使用Python下载这些图像,而不使用chrome扩展名,但我现在尝试使此答案保持简单。