• php curl_multi系列函数实现多线程抓取网页


    最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名。

    在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜索10次,十分影响用户体验,没有人会为了查询一次关键字排名而愿意等待打开10次的网页时间。

    这时我想到了用多线程做并发抓取,正好php curlcurl_multi系列函数能实现此功能。

    一、curl_multi系列的函数介绍:
    1. curl_multi_init:

    用来初始化一个"curl_multi"句柄,然后将多个"curl_init"函数生成的"curl"句柄传递给"curl_multi"句柄;此函数不需要然后参数。

    2. curl_multi_add_handle:

    "curl_multi_add_handle"函数用来将"curl_init"生成的"curl"句柄添加到上面"curl_multi_init"函数生成的"curl_multi"句柄。"curl_multi_add_handle"函数的第一个参数为"curl_multi"句柄,第二个参数为"curl"句柄。

    3. curl_multi_exec:

    "curl_multi_exec"用于发起curl_multi请求。"curl_multi_add_handle"函数的第一个参数为"curl_multi"句柄,第二个参数是一个"引用参数",它记录未处理完成的请求数,当第二个参数值变为0时,代表所有的请求都已经处理完成(所有请求成功返回或者到达超时时间)。

    4. curl_multi_info_read:

    "curl_multi_info_read"函数用来读取curl_multi句柄是否有curl返回信息,如果有则返回最先的"curl返回值(数组形式)",否则返回"false",循环调用此函数,直到其返回"false";"curl_multi_info_read"的参数为"curl_mulit"句柄。

    5. curl_multi_getcontent:

    当所有curl句柄处理完成,这时我们就可以使用"curl_multi_getcontent"函数读取"curl"的返回内容了。"curl_multi_getcontent"的参数为"curl"句柄。

    6. curl_multi_remove_handle:

    读取完内容后,使用"curl_multi_remove_handle"函数从"curl_mulit"句柄中移出所有"curl"句柄。"curl_multi_remove_handle"函数的第一个参数为"curl_multi"句柄,第二个参数为"curl"句柄。

    7. curl_multi_close:

    "curl_multi_close"函数用于关闭"curl_mulit"句柄,释放占用的资源。"curl_multi_close"的参数为"curl_mulit"句柄。

    二、curl_multi使用流程:

    1、 "curl_multi_init"初始化"curl_multi"句柄;
    2、 循环创建并添加"curl"句柄,并用"curl_multi_add_handle"函数将其添加到"curl_multi"句柄;
    3、 使用"curl_multi_exec"发起请求,并等待所有请求处理完成;
    4、 使用"curl_multi_info_read"函数读取返回值;
    5、 使用"curl_multi_getcontent"函数读取返回内容;
    6、 使用"curl_multi_remove_handle"函数移除curl句柄;
    7、 使用"curl_multi_close"关闭curl_multi句柄。

    三、下面是我使用curl_multi多线程并发抓取360搜索返回结果的代码片段:
    常见错误:

    1、调用curl_multi系列函数时出现如下错误:

    解答:1、需要php5版本才支持curl_multi系列函数;2.需要开启php curl扩展,windows: 在php.ini中把";extension=php_curl.dll"前面的分号去掉; linux:确认/etc/php.ini或者"/etc/php.d/curl.ini"中有类似"extension=curl.so"的行,并重启apache;

    2、调用curl系列函数时出现如下错误:

    解答:同上。

    3、用curl抓取网页时,发现网页的中文是乱码:

    解答:这是由于被抓取的网页编码与您的网页编码不一致引起的,设置"curl_setopt($ch, CURLOPT_HEADER, 1);"可以返回http头,然后从中查看到类似"Content-Type: text/html; charset=gb2312"的行,从中可以看出其编码为"gb2312"在使用$html = iconv("gb2312", "utf-8//ignore", $html); 将编码转为一致即可。

  • 相关阅读:
    使用微软WPF技术开发产品优势究竟在那里
    北京地铁的众生相,发上来和大家分享(北京白领生活真实写照)
    长期提供WindowsPhone7培训 & HTML5培训 & Silverlight培训 & WPF培训
    Silverlight中开发和设计人员的合作
    Silverlight 动态调用 WebService
    (学)Lazarus 在 WinCE 下如何取消标题栏上的 OK 或 X 按钮
    (学)新版动态表单研发,阶段成果4
    (学)新版动态表单研发,阶段成果5
    (原)Lazarus下WinCE终端、服务器心跳监控(Ping)源码
    (原)Lazarus 在 Thread 中使用 SQLQuery 查询Oracle 会出现异常
  • 原文地址:https://www.cnblogs.com/chunguang/p/5895179.html
Copyright © 2020-2023  润新知