Python 3.4 中的 Selenium Multiprocessing 帮助



我试图使用Selenium来获取网站上特定搜索的结果数量。基本上,我想让这个过程运行得更快。我有代码,通过迭代搜索词,然后通过报纸并将收集的数据输出到CSV中。目前,这在 3 年内生成 3 个搜索词 x 3 份报纸,每个 CSV 在大约 10 分钟内为我提供了 9 个 CSV。

我想使用多处理来同时或至少更快地运行每个搜索和报纸组合。我试图遵循这里的其他示例,但未能成功实现它们。以下是我到目前为止的代码:

from selenium import webdriver
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
import os
import pandas as pd
from multiprocessing import Pool
def websitesearch(search):
try:
start = list_of_inputs[0]
end = list_of_inputs[1]
newsabbv=list_of_inputs[2]
directory=list_of_inputs[3]
os.chdir(directory)
if search == broad:
specification = "broad"
relPapers = newsabbv
elif search == narrow:
specification = "narrow"
relPapers = newsabbv
elif search == general:
specification = "allarticles"
relPapers = newsabbv
else:
for newspapers in relPapers:
...rest of code here that gets the data and puts it in a list named all_Data...
browser.close()
df = pd.DataFrame(all_Data)
df.to_csv(filename, index=False)          
except:
print('error with item')

if __name__ == '__main__':
...Initializing values and things like that go here. This helps with the setup for search...
#These are things that go into the function        
start = ["January",2015]
end = ["August",2017]
directory = "STUFF GOES HERE"
newsabbv = all_news_abbv
search_list = [narrow, broad, general]
list_of_inputs = [start,end,newsabbv,directory]    
pool = Pool(processes=4)
for search in search_list:
pool.map(websitesearch, search_list)
print(list_of_inputs)        

如果我在 main(( 函数中添加一个 print 语句,它会打印,但最终什么都没有发生。我将不胜感激任何和所有的帮助。 我省略了获取值并将其放入列表中的代码,因为它很复杂,但我知道它有效。

提前感谢任何和所有的帮助!如果我可以提供更多信息,请告诉我。

艾萨克

编辑:我在网上查看了更多帮助,并意识到我误解了使用pool.map(fn,list(将列表映射到函数的目的。我已经更新了我的代码以反映我当前仍然不起作用的方法。我还将初始化值移动到主函数中。

我认为它不能以你的方式进行多处理。因为它仍然有由硒引起的队列进程(不是队列模块(。

原因是...Selenium只能处理一个窗口,不能同时处理多个窗口或选项卡浏览器(window_handle功能的限制(。那是意思...您的多进程仅处理内存中发送到硒或由硒爬网的数据处理。通过尝试处理在一个脚本文件中抓取硒,将使硒成为瓶颈过程的来源。

制作真正的多进程的最佳方法是:

  1. 制作一个脚本,使用 Selenium 来处理该 URL 以通过 Selenium 爬网并将其另存为文件。 例如 crawler.py 并确保脚本具有打印命令来打印结果

例如:

import -> all modules that you need to run selenium
import sys
url = sys.argv[1] #you will catch the url 
driver = ......#open browser
driver.get(url)
#just continue the script base on your method
print(--the result that you want--)
sys.exit(0)

我可以给出更多的解释,因为这是这个过程的主要核心,你想在那个网络上做什么,只有你自己理解。

  1. 制作另一个脚本文件:

A.设计URL,多进程意味着制作一些进程并将其与所有CPU内核一起运行,这是制作它的最佳方法...它首先设计输入过程,在您的情况下可能是 URL 目标(您没有给我们您想要抓取的网站目标(。但是网站的每个页面都有不同的URL。只需收集所有 URL 并将其划分为多个组(最佳实践:您的 CPU 内核 - 1(

例如:

import multiprocessing as mp
cpucore=int(mp.cpu_count())-1.

b. 使用您之前已经创建的 crawl.py(通过子进程或其他模块,例如:OS.system(发送 URL 进行处理。 确保运行 crawl.py max == CPU 核心。

例如:

crawler = r'YOUR FILE DIRECTORYcrawler.py'
def devideurl():
global url1, url2, url3, url4
make script that result:
urls1 = groups or list of url
urls2 = groups or list of url
urls3 = groups or list of url
urls4 = groups or list of url
def target1():
for url in url1:
t1 = subprocess.Popen(['python', crawler, url], stdout = PIPE)
#continue the script, base on your need...
#do you see the combination between python crawler and url?
#the cmd command will be: python crawler.py "value", the "value" is captured by sys.argv[1] command in crawler.py
def target2():
for url in url2:
t1 = subprocess.Popen(['python', crawler, url], stdout = PIPE)
#continue the script, base on your need...
def target3():
for url in url1:
t1 = subprocess.Popen(['python', crawler, url], stdout = PIPE)
#continue the script, base on your need...
def target4():
for url in url2:
t1 = subprocess.Popen(['python', crawler, url], stdout = PIPE)
#continue the script, base on your need...
cpucore = int(mp.cpu_count())-1
pool = Pool(processes="max is the value of cpucore")
for search in search_list:
pool.map(target1, devideurl)
pool.map(target2, devideurl)
pool.map(target3, devideurl)
pool.map(target4, devideurl)
#you can make it, more, depend on your cpu core

C.将打印结果获取到主脚本的内存中

d. 连续执行脚本进程以处理已获得的数据。

  1. 最后,在主脚本中制作整个过程的多进程脚本。

使用此方法:

您可以打开许多浏览器窗口并同时处理它,并且由于从网站抓取的数据处理比内存中的数据处理慢,这种方法至少减少了数据流的瓶颈。 意味着它比以前的方法更快。

希望对...干杯

相关内容

  • 没有找到相关文章

最新更新