【发布时间】:2021-06-14 21:23:21
【问题描述】:
主要目标:我想在一个网站上抓取 N 条路径。我也想在 T 个线程数上执行此操作。
我可以成功运行的一个示例是每次使用 10 个线程或 10 个线程和 5 个线程执行 10 个路径。后者的问题是它打开了 5 个 chrome 浏览器,然后又打开了另外 5 个 chrome 浏览器。
我最理想的是拥有 5 个 chrome 浏览器(T 个线程),每个浏览器都有一个要通过的 id 列表。
在我下面链接的代码中,它成功地通过了每个列表的 index[0]。但是,一旦它到达下一个项目,它就会停止运行。
例如,它将运行路径 ID 1、2、3、4、5。但它将在路径/id=6、7、8、9、10 处停止。
功能:
import concurrent.futures
def pathCrawler(idList):
DRIVER_PATH = 'chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
path = 'fake.../id='
for id in idList:
print('start')
driver.get(path + str(id))
# Try Hitting #1 Button
try:
# XPath for #1 Button
driver.find_element(By.XPATH, '').click()
print(f'{id}: success 1')
#Try Hitting #2 Button
try:
# XPath for #2 Button
driver.find_element(By.XPATH, '').click()
print(f'{id}: success 2')
except:
print(f'{id} = Exception 2')
except:
print(f'Exception 1')
print('end')
return f'Done with {idList}'
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
df = [[1,6] , [2,7] , [3,8] , [4,9] , [5,10]]
results = executor.map(pathCrawler, df)
有人有什么建议吗?
谢谢,
【问题讨论】:
-
您在此处显示的代码在 for 循环之外执行
driver.getOUTSIDE。那真的是你所拥有的吗?如果是这样,那么id是一个内置函数,而不是一个 ID 号。无论如何,我确定您希望在循环中使用driver.get。 -
谢谢!这是我为堆栈溢出编辑它的最后一个错字。我会解决的。我正在使用的代码在循环中有 driver.get 。我在 for 循环的开头和结尾有两个打印语句。对于网页 1、2、3、4、5。他们将打印“开始”和“结束”,但第 6、7、8、9、10 页只会打印“开始”。
-
找出问题所在,我在开始时进行了检查,阻止了流量。
标签: python multithreading concurrent.futures