gpt4 book ai didi

http - Erlang 中的并行 HTTP 网络爬虫

转载 作者:可可西里 更新时间:2023-11-01 16:25:50 49 4
gpt4 key购买 nike

我正在编写一个简单的网络爬虫,并生成了一堆 gf 静态文件,我尝试通过底部的代码进行爬网。我有两个问题/问题我不知道:

1.) 遍历序列 1..200 会在抓取 100 个页面后恰好向我抛出一个错误:

** exception error: no match of right hand side value {error,socket_closed_remotely}
in function erlang_test_01:fetch_page/1 (erlang_test_01.erl, line 11)
in call from lists:foreach/2 (lists.erl, line 1262)

2.) 如何并行化请求,例如20 个顺流请求

-module(erlang_test_01).
-export([start/0]).

-define(BASE_URL, "http://46.4.117.69/").

to_url(Id) ->
?BASE_URL ++ io_lib:format("~p", [Id]).

fetch_page(Id) ->
Uri = to_url(Id),
{ok, {{_, Status, _}, _, Data}} = httpc:request(get, {Uri, []}, [], [{body_format,binary}]),
Status,
Data.

start() ->
inets:start(),
lists:foreach(fun(I) -> fetch_page(I) end, lists:seq(1, 200)).

最佳答案

<强>1。错误信息

socket_closed_remotely 表示服务器关闭了连接,可能是因为您在短时间内发出了太多请求。

<强>2。并行化

创建 20 个工作进程和一个持有 URL 队列的进程。让每个进程向队列询问 URL(通过向其发送消息)。这样您就可以控制 worker 的数量。

一种更“Erlangy”的方法是为每个 URL 生成一个进程!这样做的好处是您的代码将非常简单。缺点是您无法以简单的方式控制带宽使用或与同一远程服务器的连接数。

关于http - Erlang 中的并行 HTTP 网络爬虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12349916/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com