Python中的动态Web数据库抓取

时间:2017-07-20 15:34:43

标签: python calendar beautifulsoup screen-scraping

任何人都知道以下代码有什么问题?它仅从一天开始抓取数据。然而,该网页是一个动态的网络数据库,包含多年的数据。我需要在2013-2016中每个月和每天抓取数据并存储到CSV文件中。

import calendar
import requests
from bs4 import BeautifulSoup

cal = calendar.Calendar()

base_url = 'http://www.pse.pl/index.php?modul=21&id_rap=24&data=2016'
month_url = '&Month='
day_url = '&Day='

for year in range(2015, 2017):
    for month in range(1, 13):
        monthdays = [d for d in cal.itermonthdays(year, month) if d != 0]
        for day in monthdays:
            r = requests.get(base_url + str(year) + month_url + str(month) + day_url + str(day))
            soup = BeautifulSoup(r.text,'lxml')
            findtable = soup.find('table',{'id':'tabela'})
            for i in findtable.findAll('tr'):
                for j in i.findAll('td'):
                    print (j.text)

2 个答案:

答案 0 :(得分:0)

你无法点击"点击"在BeautifulSoup的网站上。

在这种情况下,我看到两个选项:

1)浏览selenium模块以与网站进行互动。

2)请注意,链接具有这样的风格:

http://www.pse.pl/index.php?modul=21&id_rap=24&data=2017-07-19。相互关联的部分是& data = 2017-07-19

您可以构建一个循环,将具体日期传递给基本链接的尾部,并使用requests打开每个此类链接。解析更进一步。

答案 1 :(得分:0)

我注意到的主要问题是日期必须在您发送到网站的网址中以不同格式显示。日期(年,月和日)的元素之间需要连字符。我还可以建议一种更轻松的方式来度过这些日子。

箭头是用于处理日期的模块。在这种情况下,我使用它来生成从2015年1月1日到2015年1月3日(含)的天数。

我也用它来格式化这些日期。

我使用BeautifulSoup找到表,然后使用pandas将表的内容提取到数据帧中。最后,我将这些数据帧写入csv文件。

>>> import requests
>>> import arrow
>>> import bs4
>>> from datetime import datetime
>>> import pandas as pd
>>> start = arrow.get(datetime(2015,1,1))
>>> end = arrow.get(datetime(2015,1,3))
>>> base_url = 'http://www.pse.pl/index.php?modul=21&id_rap=24&data='
>>> for day in arrow.Arrow.range('day', start, end):
...     page = requests.get(base_url+day.format('YYYY-MM-DD')).content
...     soup = bs4.BeautifulSoup(page, 'lxml')
...     table = soup.find('table' ,{'id':'tabela'})
...     df = pd.read_html(str(table))
...     df[0].to_csv(day.format('YYYY-MM-DD')+'.csv')