【问题标题】:How to order the result while web scraping with multiprocessing?如何在使用多处理进行网络抓取时对结果进行排序?
【发布时间】:2021-11-04 03:22:49
【问题描述】:

我正在编写一个程序,用于使用多处理从多个 url 中抓取数据。在这里,我将所有 URL 存储在 bond_url 列表中。它正在工作,我正在获得输出,但这里的问题是输出是随机顺序的。我希望抓取的数据与 bond_url 中的 URL 顺序相同。 有什么解决办法吗?

from requests_html import HTMLSession
import constants

bonds_url  =[]   
from multiprocessing import Pool
    
def f(url):        
    session = HTMLSession()
    response = session.get(url) 
    
    try:    
        data = [i.text.strip() for i in response.html.find(".value") ]
        bonds_values.append(float(data[0])) 
        print(data[0])             
    except:    
        data =  [i.text.strip() for i in response.html.find("div>span[data-reactid='31']")]
        bonds_values.append(float(data[0]))
        print(data[0])
    
if __name__ == '__main__':
    with Pool(len(bonds_url)) as p:
        p.map(f, bonds_url)

【问题讨论】:

  • 要么对结果进行排序,要么实现同步机制。排序应该容易得多。
  • 你能解释一下怎么做吗?我知道的一件事是我们需要枚举该 URL 列表,但我对传递 'f' 的内容感到困惑
  • 欢迎来到 SO。请拨打tour,阅读How do I ask a good question?How to create a Minimal, Reproducible Example。提供的代码不会运行,它会引发ModuleNotFoundError: No module named 'constants',一旦修复,它将引发NameError: name 'bonds_values' is not defined。为了帮助你,我需要能够重现你的结果。即使只是输入/输出的一个子集也足够了。
  • 等一下,看来map preserves order。这意味着bond_values 将按bonds_url 排序,但您的print 语句可能会出现故障。

标签: python python-multiprocessing


【解决方案1】:

解决方案

f中的printS改为returnS,以便依次得到multiprocessing.Pool.map的结果。

from multiprocessing import Pool

from requests_html import HTMLSession

import constants

bonds_url = []


def f(url):    
    session = HTMLSession()
    response = session.get(url) 
    try:
        data = [i.text.strip() for i in response.html.find(".value")]
    except:
        data =  [i.text.strip() for i in response.html.find("div>span[data-reactid='31']")]
    return float(data[0])


if __name__ == '__main__':
    with Pool(len(bonds_url)) as p:
        bond_values = p.map(f, bonds_url)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2021-12-29
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多