首页 > 解决方案 > 多次从网站上抓取信息

问题描述

新手程序员请提前,如果我写的东西措辞不好或只是愚蠢的,对不起。

我正在尝试从网站上抓取信息并将结果存储在数据库中。目标是获取所有列车号、车站并查看列车是否晚点。我开始这样做的方式是在一个循环中,我一直在通过更改字母表中的每个字母来构建这个 URL $LETTER,一次一个:https ://reservia.viarail.ca/GetStations.aspx?q=$LETTER

然后我解析结果并将所有内容正确存储在数据库中。该脚本不需要很长时间即可运行,因此没问题。当我试图让所有通过每个车站的火车时,问题就来了。为此,我浏览了之前存储的每个电台(其中 580 个),然后使用此 URL 并在电台代码中更改今天的$DATE内容:YYY-MM-DD$CODE

reservia.viarail.ca/tsi/GetTrainList.aspx?OriginStationCode=$CODE&Date=$DATE

例如,我会有蒙特利尔的这个链接

我会浏览表格的每个元素并查看列车号,然后将其插入表格中。到目前为止,这是我的计划,但运行此脚本(超过 7 分钟)花费了太多时间,这是有道理的,因为我们要打开 580 页。

有什么更好的方法来做到这一点?我正在使用 python,因为我正在尝试学习它,所以我一直在导入 urllib 库并使用它来解码页面,然后我会对数据进行排序。感谢您的任何建议/帮助!

标签: pythonperformanceweb-scraping

解决方案


我喜欢这样的问题!好的,下面的代码应该几乎完全符合您的要求。

import json,urllib.request
import requests
import pandas as pd
from string import ascii_lowercase

alldata = []
for c in ascii_lowercase:
    response = requests.get('https://reservia.viarail.ca/GetStations.aspx?q=' + c)
    json_data = response.text.encode('utf-8', 'ignore') 
    df = pd.DataFrame(json.loads(json_data), columns=['sc', 'sn', 'pv'])  # etc., 
    alldata.append(df)

现在,只需将该列表加载到您的数据库中。完毕。


推荐阅读