讨论做抢单爬虫,PHP缺少什么?

头像
phpmaster
33阅读2评论

抢单爬虫,我们知道最重要的事情,就是要在最大的时间,做最多的抢单次数。速度非常重要。一般做爬虫貌似更加专业的语言例如python,是没什么问题的。其实,作为一名PHPer完全不用自卑。PHP同样可以用比PYTHON毫不逊色的速度参与抢单。但是必须做一个基础的HTTP访问类。PHP缺少什么呢?

注:本文电鸭首发,电鸭(phpmaster)原创。转载请注明出处。另作者本人求各种外包,各种远程全职、兼职工作(全栈前端VUE,后端YII,各种自适应)。

我们知道,PHP可以用CURL进行网络访问。这没有问题。但是如果做抢单机器人的话,curl是绝对不行的。因为curl每一次访问,都要重新启动一个tcp连接。而建立和断开连接的过程,是比较费时间的。而通常参与一次抢单,即时不包括帐号登录的过程,只说登陆后抢单的过程,通常也会涉及好几次HTTP访问。如果这好几次HTTP访问,每次都需要重建TCP连接。那无疑是会大大增加操作时间。效率是非常非常低的。

要想提高抢单效率的话,必须是只建立一次HTTP连接。连接建立后,则不再断开,保持连接状态。下次要访问这个服务器的服务,就不需要建立新的连接,继续走这个通道即可。这样的连接方式,大大提高了操作效率。

说干就干,我们需要实现这样一个类,这里暂且命名为http.class.php。它需要实现:

1、长连接(一次访问完成,不会断开连接)

2、支持HTTPS

3、支持代理服务(一般抢单服务器,会对同一个IP进行过多的访问做限制,所以走反向IP代理很重要,这种服务价格一般也不贵)

为了实现长连接,我们需要使用stream_socket_client,实现连接管道。 每一个管道打开后,都不关闭,只等待输入指令。有输入后,立即等待获得输出。输出得到后,进行HTTP格式解析,得到访问结果。

stream_socket_client($connect,$errno,$errstr,60,STREAM_CLIENT_CONNECT,$context);

如果使用了代理服务,则需要连接的是代理服务器的IP,连接成功后,通过代理指令,使得代理服务器连接我们想要的目标服务器

			$proxy_header = "CONNECT ".$host.":".$port." HTTP/1.1\r\n";
			$proxy_header.= "Host: $host\r\n";
			$proxy_header.= "\r\n";
			$ret = fwrite($this->socket, $proxy_header);
			$proxy_response = '';
			while(!feof($this->socket))
			{
				$line = fgets($this->socket,1024);
				$proxy_response .= $line;
				if($line=="\r\n") break;
			}

			if(strpos(strtolower($proxy_response),strtolower('HTTP/1.1 200 Connection Established'))===false)
			{
				echo "PROXY CONNNECT FAILED\n";
				return false;
			}
			$ret = stream_socket_enable_crypto($this->socket, true , STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
			if(!$ret)
			{
				echo 'PROXY HAND SHAKE ERROR'."\n";
				$this->proxy_host = '';
				$this->proxy_port = '';
				if($loop==2) return false;
				return $this->exec($args,$loop+1,$check_proxy);
			}

那么通过实验证实,使用这种方式进行大批量连接和抢单,可以使得PHP抢单爬虫的操作性能提高3~4倍以上。从而让PHP成为一个可以真正开发抢单爬虫的语言。

收藏
举报
加载中…
精选评论
头像
等级6

Php缺的是并发,协程,线程池,爬虫框架,分布式爬虫,很多东西

PHP的多线程实现并发并不是问题哦~线程池只是一种处理方式,不存在语言上的障碍。爬虫框架,本文讲的正式其中一部分。至于分布式,也是一种部署方案,不是语言鸿沟。
当然python处理爬虫业务肯定会更熟门熟路一些。但是本人仅从PHPer在不跨语言的前提下,达到差不多处理效果的一种思路分享。