python - 寻找更好的解决方案来用beautifulsoup 抓取多个网页
问题描述
我正在尝试从网站上抓取体育比赛的结果。该网站包含所有完美游戏的所有结果,但它们位于许多页面上。每个页面代表一天,我正在收集数月的游戏数据,因此输入的网址将相当多。
我现在设置它的方式是我有一个基本 url,以及我可以使用 for 循环附加的日期列表。这种方法效果很好,但我很好奇在我输入许多我将刮擦的日期之前是否有更好的方法。
url = 'http://www.url.com?'
#this list would hold hundreds of dates
dates = ['month=11&day=1&year=2016', 'month=11&day=2&year=2016', ...]
for i in dates:
page = requests.get(url+i)
soup = BeautifulSoup(page.text, 'html.parser')
#and so on, this part works as intended
解决方案
如果您真的希望每天都进行搜索,那么datetime
和timedelta
可用于遍历所有可能的日子。给它一个开始日期,然后可以一次推进一天,直到结束日期(可能是datetime.now()
今天):
from datetime import datetime, timedelta
base_url = "http://www.url.com?month={}&day={}&year={}"
search_date = datetime(2016, 11, 1)
end_date = datetime(2017, 1, 1)
one_day = timedelta(days=1)
while search_date < end_date:
url = base_url.format(search_date.month, search_date.day, search_date.year)
print(url)
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
search_date += one_day
这会给你类似的东西:
http://www.url.com?month=11&day=1&year=2016
http://www.url.com?month=11&day=2&year=2016
http://www.url.com?month=11&day=3&year=2016
http://www.url.com?month=11&day=4&year=2016
.
.
.
http://www.url.com?month=12&day=29&year=2016
http://www.url.com?month=12&day=30&year=2016
http://www.url.com?month=12&day=31&year=2016
不过,更好的方法是使用next
页面上的链接。为此,需要实际页面的 URL。然后可以使用 BeautifulSoup 轻松提取链接。
推荐阅读
- coq - 归纳定义中 Coq 隐式类型推导的规则是什么?
- mysql - 我不了解数据库的 docker 卷
- ios - xCode Archive 在完成前自动取消
- razor - 为什么 Blazor Webassembly 应用程序中的每个 razor 页面导航都会出现“加载...”延迟?
- r - 需要从另一个 DataFrame 更新 R 中的 DataFrame,一个 DataFrame 的 colnames 与另一个 DataFrame 的内容匹配
- netsuite - 将自定义字段添加到付款、存款和退款 (NetSuite)
- discord.py - “RawReactionActionEvent”对象没有属性“作者”添加事件冷却时间的问题
- mongodb - 使用 $match 从具有相同键值的不同数组中查询
- postgresql - 在比较 postgres 和 timescaledb 之间的插入性能时,timescaledb 没有表现得那么好?
- flutter - 如何在颤动中从单例中删除共享首选项的数据?