使用Selenium和Multiprocessing的Python Web scraper

时间:2018-02-18 10:34:13

标签: python selenium web-scraping python-multithreading

我有以下函数。它将一个链接作为参数,并在最后给我提供我需要的数据(base_list)

def extract_BS(link):

    base_list = []

    try:

        browser = webdriver.Firefox()
        browser.get(link)                   
        print('Processing..' + link)

        respData = browser.page_source
        soup = bs.BeautifulSoup(respData, 'html.parser')
        browser.quit()
        shipping_options = soup.find("div", class_ = "modal_shipping_con").find_all("input", class_="inputChangePrice")
        base_list.append(shipping_options)

    except Exception as e:
        print(urls)
        print('Exception:',e)
        pass

    return base_list

但是,我的网址列表大约是1000,因此单独执行它们需要很长时间。我在多处理上找到this blog,我试图调整

我使用多线程的其他代码如下

with Pool(4) as p:
    records = p.map(extract_BS,urls)

p.terminate()
p.join()

然而,当我运行它时,我收到以下错误。

MaybeEncodingError: Error sending result:
Reason: 'RecursionError('maximum recursion depth exceeded in       comparison',)'

当我运行脚本时,4个窗口弹出,webscraper完成它的工作,但问题似乎是'records = p.map(extract_BS,urls)'。我的函数输出一个列表,我想将其存储在“结果”中,但由于某种原因,这不起作用。

非常感谢任何建议/帮助/观察,谢谢

1 个答案:

答案 0 :(得分:0)

你需要放置

if __name__ == "__main__":

之前使用Pool(4)作为p以防止在每个池中创建导致递归错误的池。