使用 Socket 抓取数据

要在客户端操作 Socket ,可使用 fsockopen、socket_create、stream_socket_client 等函数实现。如果是PHP 5,建议使用 stream_socket。

 

fsockopen 实现长连接。Client 方与 Server 方先建立通信连接,连接建立后不断开,然后再进行报文发送和接收。

 

使用 Socket 获取数据的实现,GET 方法。

 

<?php
$fp = fsockopen("www.guaten.com",80, $errno, $errstr, 10) or die("$errstr ($errno)<br />\n");   
$out = "GET / HTTP/1.1\r\n";   
$out .= "Host: www.guaten.com\r\n";   
$out .= "Connection: Close\r\n\r\n";   

fwrite($fp, $out);   
while (!feof($fp)) {   
	echo fgets($fp, 128);   
}   
fclose($fp);   
?>

 

使用 Socket 获取数据的实现,POST 方法。

 

<?php
$post = ['username' => '15521071089','password' => 123456,'captcha' => 'CT4Y','act' => 'act_login'];
$data = http_build_query($post);
$fp = fsockopen("www.guaten.com",80, $errno, $errstr, 10) or die("$errstr ($errno)<br />\n");   

$out = "POST http://www.guaten.com/user.php HTTP/1.1\r\n";   
$out .= "Host: www.guaten.com\r\n";   
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36\r\n";   
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($data)."\r\n";
$out .= "Referer: http://www.guaten.com/user.php?act=login\r\n";
$out .= "Connection: Close\r\n\r\n";   
$out .= $data."\r\n\r\n";

fwrite($fp, $out);   
while (!feof($fp)) {   
	echo fgets($fp, 1280);   
}   
fclose($fp);   
?>

 

Web 应用程序是无法区分机器和人的,人和机器都是通过 Socket 提交数据,只不过人是通过浏览器调用操作系统的 Socket 提交,而机器人是通过自己写代码调用 Socket 提交。

 

最后,注意以下几点:

  • fsockopen 的第一个参数 $hostname 不要带“http://”字符串,除非使用 SSL 等。
  • Headers 请求不一定都要按照抓包数据全部带上,除非调试不成功或者不熟练或者有特殊请求可以全部照搬,否则只带上几个核心的 headers 。
  • 在 Connection 和 data 后有两个换行。
  • 有些表单可能有 hidden 值务必仔细抓包
  • 注意编码问题

前面说过,建议使用 stream_socket 实现。若使用 stream_socket  实现只改一行代码就行,如下:

 

$fp = stream_socket_client("tcp://www.guaten.com:80", $errno, $errstr, 3);

 

在 PHP 中,99.9% 的 Socket 应用属于流套接字范畴,数据报套接字和原始套接字涉及比较底层的协议知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值