Python 为每个页面启动一个新线程?

Python 为每个页面启动一个新线程?,python,multithreading,Python,Multithreading,我试图为每个页面启动一个新线程,但这样,它会在另一个线程/函数完成后启动一个新线程。 有人能帮我独立运行它们吗? 例子: 线程1: 打开第1页 线程2: 打开第2页 对X数量的页面执行此操作。 我是python的初学者,请原谅我的代码太乱 随机导入 导入字符串 导入线程 从时间上导入睡眠 从bs4导入BeautifulSoup 从selenium导入webdriver 从selenium.webdriver.common.keys导入密钥 从selenium.webdriver.support.

我试图为每个页面启动一个新线程,但这样,它会在另一个线程/函数完成后启动一个新线程。 有人能帮我独立运行它们吗? 例子: 线程1: 打开第1页 线程2: 打开第2页

对X数量的页面执行此操作。 我是python的初学者,请原谅我的代码太乱

随机导入
导入字符串
导入线程
从时间上导入睡眠
从bs4导入BeautifulSoup
从selenium导入webdriver
从selenium.webdriver.common.keys导入密钥
从selenium.webdriver.support.ui导入WebDriverWait
#driver.find_element_by_css_选择器(“a[onclick*='if(!window.\uu cfrlunbuckHandlers)返回false;bail()']))
def随机字符串数字(字符串长度=6):
“”“生成随机的字母和数字字符串”“”
字母和数字=string.ascii_字母+string.digits
返回“”。为范围(stringLength)内的i加入(随机选择(字母和数字))
def STARTSCRAP(url):
driver=webdriver.Chrome(可执行文件\u path='chromedriver.exe')
driver.get(“urlhere”)
cookies\u list=驱动程序。获取\u cookies()
cookies_dict={}#创建字典
usrelem=驱动程序。通过名称(“登录”)查找元素
usrelem.发送密钥(“用户”)
pwdelem=驱动程序。通过名称(“密码”)查找元素
pwdelem.发送密钥(“通过”)
pwdelem.发送密钥(密钥返回)
睡眠(1)
获取驱动程序(url)
wait=WebDriverWait(驱动程序,10)
soup=BeautifulSoup(driver.page_源代码'html.parser')
xx=soup.find(“输入”,
{“类”:“输入输入—数字js NumberOutExtInput输入—数字箭头js页面跳转页面”})
获取驱动程序(第页)
wait=WebDriverWait(驱动程序,10)
soup=BeautifulSoup(driver.page_源代码'html.parser')
xxx=soup.findAll(“a”,{“class”:“js lbImage”})
#全力以赴
对于xxx中的链接:
xxx=soup.find(“a”,{“href”:link.get('href')})
dlfullimg=driver.find_element_by_xpath(“//a[@href=”+xxx.get('href')+“]))
wait=WebDriverWait(驱动程序,10)
dlfullimg.click()
thumbs=soup.findAll(“div”,“class”:“lg thumb item”})
dlfullimg=驱动程序。通过id(“lg-download”)查找元素。单击()
close=driver。通过xpath(//span[@class='lg-close lg-icon'])查找元素。单击()
睡眠(1)
断言“未找到结果”。不在driver.page\u source中
url=输入(“主url:”)
driver=webdriver.Chrome(可执行文件\u path='chromedriver.exe')
driver.get(“urlhere”)
cookies\u list=驱动程序。获取\u cookies()
cookies_dict={}#创建字典
usrelem=驱动程序。通过名称(“登录”)查找元素
usrelem.发送密钥(“用户”)
pwdelem=驱动程序。通过名称(“密码”)查找元素
pwdelem.发送密钥(“通过”)
pwdelem.发送密钥(密钥返回)
睡眠(1)
获取驱动程序(url)
wait=WebDriverWait(驱动程序,10)
soup=BeautifulSoup(driver.page_源代码'html.parser')
#使用soup.Find查找页码
xx=soup.find(“输入”,
{“类”:“输入输入—数字js NumberOutExtInput输入—数字箭头js页面跳转页面”})
驱动程序关闭()
线程=[]
对于范围内的i(int(xx.get('max')):
page=url+“page-”+str(i+1)
t=threading.Thread(target=startscrape(url),args=[])
threads.append(t)
对于螺纹中的t:
t、 开始()
对于螺纹中的t:
t、 加入

您可以使用concurrent.futures为您搬运重物

这里有一个伪代码来实现它

import concurrent.futures
from selenium import webdriver

def process_url(url):
    driver = webdriver.Chrome()
    driver.get(url)
    # process page 
    driver.close

# Find number of pages here 
driver = webdriver.Chrome()
driver.get(url)
# urls = find list of urls
driver.close

threads_count = 10
with concurrent.futures.ThreadPoolExecutor(threads_count) as executor:
    executor.map(process_url, urls)

好的开始!要记住的几件事你想限制你创建的线程数量,否则这可能会很混乱,集成一个队列并将所有URL推送到它,然后根据需要弹出,selenium需要大量资源,这也是为什么你有一个单独的线程来启动程序(最后两行),还有一件事“target”需要一个参数元组,因此您应该在page target=startthread(第页)之后添加一个逗号谢谢您的回复,我刚刚意识到我不应该在最后两行中启动线程。我将查看ARGS.Np,也可以考虑将“驱动程序= WebCuror,ChrMeMe”移动到StistType函数的内部,以启动不同驱动程序上的所有线程,或者它们都将在同一个驱动变量中打开URL,函数名应该遵循<代码> LoeRyasCaseLy,下划线样式。一致性是最高优先级,我在代码中看到至少3种不同的命名约定。在任何情况下,你能更具体一点吗?一个好的开始是线程文档,不是吗?