3

我正在编写一个简单的网络爬虫,并生成了一堆 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 cincurrent reqs

-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)). 
4

1 回答 1

6

1.错误信息

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

2.并行化

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

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

于 2012-09-10T15:11:08.937 回答