我正在尝试使用 selenium 的多线程策略。简而言之,我正在尝试用id填充输入字段。
这是我的剧本:
from concurrent.futures import ThreadPoolExecutor
from selenium.webdriver.common.by import By
import numpy as np
import sys
from selenium import webdriver
def driver_setup():
path = "geckodriver.exe"
options = webdriver.FirefoxOptions()
options.add_argument('--incognito')
# options.add_argument('--headless')
driver = webdriver.Firefox(options=options, executable_path=path)
return driver
def fetcher(id, driver):
print(id) #this works
# this doesnt work
driver.get(
"https://www.roboform.com/filling-test-all-fields")
driver.find_element(By.XPATH, '//input[@name="30_user_id"]').send_keys(id)
time.sleep(2)
print(i, " sent")
#return data
def crawler(ids):
for id in ids:
print(i)
results = fetcher(id, driver_setup())
drivers = [driver_setup() for _ in range(4)]
ids = list(range(0,50)) # generates ids
print(ids)
chunks = np.array_split(np.array(ids),4) #splits the id list into 4 chunks
with ThreadPoolExecutor(max_workers=4) as executor:
bucket = executor.map(crawler, chunks)
#results = [item for block in bucket for item in block]
[driver.quit() for driver in drivers]
除了send_keys方法外,所有的函数都可以正常工作。两个print()函数都可以正常工作,所以ID好像都被发送到了两个函数。奇怪的是,我没有收到错误消息(我得到了pycharm的进程结束,退出代码为0的通知),所以我不知道我做错了什么。
知道丢了什么吗?
我用了这个例子:https://blog.devgenius.io/multi-threaded-web-scraping-with-selenium-dbcfb0635e83如果有用的话
2条答案
按热度按时间2ul0zpep1#
当使用threading时,注意exceptions因为它们被嵌入到futures中。例如,改变你的代码以具有下面的tweaked代码(不要改变任何其它行)
你会看到你会得到异常错误,如:
print(i, " sent")
和print(i)
语句。1.一旦你修正以上的错误,下一个错误将是在发送键的id中-
send_keys(id)
,id is of type numpy.int64
.通过typecast,str(),send_keys(str(id))
改变它到str所以你的代码在修复后会像这样:
myzjeezk2#
可能您试图过早调用
send_keys()
,甚至在<input>
字段完全具有rendered之前。溶液
理想情况下,要向元素发送 * 字符序列 *,需要为element_to_be_clickable()引入WebDriverWait,可以使用以下locator strategies之一: