【问题标题】:how to multiprocessing a for loop with multi arguments如何使用多参数对 for 循环进行多处理
【发布时间】:2017-09-23 04:29:23
【问题描述】:

我正在编写用于从 .aspx 网页抓取信息的废代码。我想检索数据库中的所有记录,但我没有记录索引的列表。我只知道索引是1到9000000之间的整数。因此,我正在考虑通过for循环对索引使用蛮力。

我想从每条记录中检索某些信息。所以,我使用 beautifulsoup 和 pandas.DataFrame 来存储我想要的信息。然后,我附加数据框以收集记录。

例如:

df_all = pandas.DataFrame(col= ['A', 'B', 'C'])
# id: Unique id of each record; df_all: the dataframe that stores the records
def func(id, df_all):
    """
    Use beautifulsoup to collect the info from the webpage
    """
    df_temp = pd.DataFrame([1,2,3], col= ['A', 'B', 'C'])
    df_all = df_all.append(df_temp, ignore_index= True)
    return df_all

我正在考虑使用多个 for 循环同时执行 func 函数。比如第一个客户端做1到22500000;第二个客户端执行 22500001 到 4500000;等等。然后我可以结合每个客户的结果。我尝试使用 ipyparallel、multiprocessing.pool 和 joblib。但是,我的函数结构似乎不适合并行处理。我应该如何修改我的结构以执行并行 for 循环任务?或者有没有更好的方法从数据库中获取数据?数据库中只有大约 29k+ 条记录。对从 1 到 90000000 的索引使用蛮力确实不是解决此问题的最佳方法。

【问题讨论】:

  • 请详细说明。您拥有该网站,还是其他人的?如果是别人的,你如何连接到他们的数据库?为什么需要索引?你在哪里调用 BeautifulSoup,它返回什么对象?唱片长什么样?目标是将记录存储在 Pandas 数据框中吗?
  • 最简单的调用记录信息的方法是使用对应的id。我在函数内部调用了美丽的汤,因为每条记录都有自己的网页。链接类似于propaccess.trueautomation.com/clientdb/…。但我必须先从链接中获取 cookie:propaccess.trueautomation.com/clientdb/?cid=39。然后,我通过替换 id 号连接到每个页面

标签: python python-3.x web-scraping parallel-processing beautifulsoup


【解决方案1】:

好吧,这是一个肮脏的解决方案,但我认为它有效。

有一个字典映射 {owner name : process_id}

对于字母表中的每个字母,有你的程序:

  • 在搜索页面上运行“所有者名称”搜索
  • 将所有process_ids 保存在字典中
  • 转到下一页结果,重复直到所有页面都已保存

要运行搜索并转到下一页,请发送 http POST。打开开发者工具,单击按钮,查看浏览器发送的内容,然后从 Python 发送相同的内容。

然后,一旦你有了所有的process_ids,你就可以遍历字典并很容易地访问每个记录页面。

【讨论】:

  • 我尝试使用 request.post。但是,该网页似乎不使用表单数据来请求服务器。我查看了 html 代码,发现它是由一些 cookie 驱动的。你能解释一下如何使用 request.post 吗?
猜你喜欢
  • 2022-01-12
  • 2022-01-16
  • 2023-03-29
  • 1970-01-01
  • 2021-08-08
  • 2022-12-04
  • 2021-05-25
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多