【问题标题】:multiprocessing python pymongo多处理 python pymongo
【发布时间】:2017-03-26 22:14:53
【问题描述】:

我正在尝试执行以下操作:从页面中获取一些信息,然后将其插入 mongodb。有一个页面列表,我想要多处理,因为这些页面可能需要一些时间来加载。一旦 webdriver 返回我想要插入到数据库中的结果。我面临的问题是我在数据库中只得到了我期望的结果的 1/4,所以我想象我管理结果的方式和插入不起作用。我希望有人能告诉我我哪里出错了。以下是代码示例:

from multiprocessing.dummy import Pool
from multiprocessing import cpu_count
from selenium import webdriver
import timeit
from pymongo import MongoClient
def mp_worker(urls):

    driver = webdriver.Chrome(chromedriver,
            chrome_options=options)
    url = "http://website"+urls
    driver.get(url)

    return what_you_want

    driver.quit() #do I do this here, close or quit?

def mp_handler():
    urls= ["14360705","4584061","13788961","6877217","13194596","13400479","9868014","8524704","16394198","16315464"]
    client = MongoClient()
    db = client.test
    collection = db['test-collection']

    p = Pool(cpu_count()*2)
    for result in p.imap(mp_worker, urls):  
        db.restaurants.update(result,{"upsert":"True"})

if __name__=='__main__':
    start = timeit.default_timer()
    mp_handler()
    stop = timeit.default_timer()
    print (stop - start) 

【问题讨论】:

  • 您是否检查过您正在抓取的所有页面都返回数据?可能只有 1/4 的人实际上会返回任何东西。
  • 是的,如果我用 for 循环按顺序抓取它,我会得到完整的结果

标签: python mongodb selenium pymongo


【解决方案1】:

此语法不正确:

db.restaurants.update(result,{"upsert":"True"})

你想要,很可能:

db.restaurants.insert(result)

或者:

db.restaurants.update(filter, result, upsert=True)

其中“过滤器”是一个 MongoDB 查询(表示为 Python 字典),它与您要更新或创建的文档唯一匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2020-07-13
    • 2021-03-08
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2018-06-11
    • 2015-05-08
    相关资源
    最近更新 更多