【发布时间】:2020-11-21 01:44:35
【问题描述】:
以下代码执行以下操作:
1 打开一个特定的 URL(对于第一个日期 YYYY-MM-DD);
2 getURL() 生成所有日期在特定日期范围内的所有 URL(从第二天开始);
3 打开新标签页,其中第一个日期由 getURL() 生成;
4 返回上一个标签并关闭它;
5 重复步骤 3 和 4。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from datetime import datetime, timedelta
# Load Chrome driver and movement.uber.com/cities website
PATH = 'C:\Program Files (x86)\chromedriver.exe'
driver = webdriver.Chrome(PATH)
# Attributing the city name and the center-most zone code (or origin) to variables so they can be inserted in the URL later
city = 'atlanta'
origin_code = '1074'
coordinates = '&lat.=33.7489&lng.=-84.4234622&z.=12'
# Open URL for the first day in the desired city (change coordinates depending on city)
driver.get('https://movement.uber.com/explore/' + city + '/travel-times/query?si' + origin_code + '&ti=&ag=taz&dt[tpb]=ALL_DAY&dt[wd;]=1,2,3,4,5,6,7&dt[dr][sd]=' +
'2016-01-02' + '&dt[dr][ed]=' + '2016-01-02' + '&cd=&sa;=&sdn=' + coordinates + '&lang=en-US')
# Generating the correct URLs for each date
def getURL():
date = datetime(2016,1,4)
while date <= datetime(2020,3,31):
yield ('https://movement.uber.com/explore/' + city + '/travel-times/query?si' + origin_code + '&ti=&ag=taz&dt[tpb]=ALL_DAY&dt[wd;]=1,2,3,4,5,6,7&dt[dr][sd]=' +
date.strftime('%Y-%m-%d') + '&dt[dr][ed]=' + date.strftime('%Y-%m-%d') + '&cd=&sa;=&sdn=&lat.=33.7489&lng.=-84.4234622&z.=12&lang=en-US')
date += timedelta(days=1)
# Open new tab
i = 0
for url in getURL():
i += 1
if i < 3:
driver.execute_script("window.open(url)")
# Switch to previous tab and close it (leaving us with the newly above opened tab)
tabs = driver.window_handles
if len(tabs) > 1:
driver.switch_to.window(tabs[0])
driver.close()
driver.switch_to.window(tabs[1])
问题:每次打开新标签/“窗口”时,代码都会打开第一个日期为 YYYY-MM-DD 的 URL,完全忽略了 getURL() 生成的 URL。
问题:如何打开下一个日期的新标签,关闭前一个,重复?
我的最终目标:下载每个不同 URL 内的数据集(但其代码与这里的问题无关)。 Obs.:我为此使用 Selenium 库。
【问题讨论】:
-
代码执行后
i的值是多少? -
如果我在最后一个 if 语句中添加一个 print(i),它首先打印 1,然后是 2。如果我在 for 循环中添加,它会给我 1549。它从 1 迭代到 1549 for不管什么原因。也许这就是生成的 URL 总数?
-
这条线对吗?
driver.execute_script("window.open(url)")- 这是传递一个字符串url而不是值。我看不出这会如何打开一个标签到任何位置 -
但我想那是唯一真正打开新标签的代码行,不是吗?如果我运行代码,它实际上会打开一个新选项卡,只是它总是以 2016-01-02 打开,这是第一个日期。它不会移动到 2016-01-03。
-
在
execute_script中修复了 JS 错误后,您的代码运行良好。如果发布的答案有效并且您现在在线,那么很棒,请忽略此评论。如果你还在苦苦挣扎,请告诉我。告诉我你是如何执行脚本的——我的 VSCode 捕获了 JS 错误,现在它无需其他更改即可运行......我将i提升到 10,我得到了 10 个带有迭代日期的 URL。你的代码很棒:-)
标签: python html selenium loops url