php多线程抓取网页(php多线程抓取网页?不会?怕。不用怕)
优采云 发布时间: 2021-12-30 22:02php多线程抓取网页(php多线程抓取网页?不会?怕。不用怕)
php多线程抓取网页?不会?不用怕。因为php还有nginx模块,完全不是问题,该有的技术一样不少,肯定能抓到你想要的页面。相比php+mysql,多线程抓取网页的效率肯定低了不少,但是php的异步传递就完全能够解决传递耗时和传递效率问题。php+nginx抓取的主要难点在于利用异步的fd传递传递太慢的问题,如果你只是想抓取大多数,那传递太慢的问题可以忽略不计,但是当你想抓取部分关键的页面的时候就是另外一回事了。
下面看两个例子:抓取多线程各种网站数据我们以爬虫来举例:因为比较大,所以后台就进行了分布式,这个后端fd可以传递千万级数据。我们用nginx来抓取2000w用户的数据:因为没有多线程抓取,所以仅使用cloudserver运行server1,利用php源码的fd_parse函数来抓取。这个函数比较弱,至少会导致抓取效率有下降,虽然在demo里可以忽略这个问题,但是如果想要深入到开发思想里面去解决这个问题,那就可以直接看看php源码。
所以我们看看这个例子里面fd是什么。它其实就是nodejs中进程间通信使用的协议。我们接着使用cloudserver运行server2:nginx函数打开以后输入如下指令:php-husername:root();此时thephpdaemon会在此端输出当前server的ip地址,而此台的ip地址为:214.111.111.204fast-cgiserver2的ip会把自己的ip作为它自己的属性,记为fid,而其他的都是相互不相关的属性。
如果要获取某个服务器的ip地址,但是它对于所有人都一样,我们可以直接利用nginx的get方法获取,然后再向它发送请求,然后ip地址就自动返回。这个情况下,ip地址出现在页面上面就是上面图中箭头标注的地方:可以看到,页面上所有的响应都来自同一个ip地址。但是对于某些页面来说,可能就不是如此,比如这种。
我们有这么一个页面:这种是只抓取mimepage的页面,对于ie6或者其他浏览器来说,都是没有图片等任何数据的,所以这种页面就无解了,抓取不到,它就无法检索数据,也无法产生数据。这时候就需要有一个属性fd_parse转换一下,这个方法返回的值是fid,把这个值定义为抓取到的所有页面的fid,而ip是固定的,只要fid为1就可以了。
然后就可以在这台浏览器里面开始抓取,然后把获取到的内容放到一个文件里面:这个就是我们最终抓取到的页面。对于fid_parse其实是一个全局的、高效的fd,我们可以定义一个nginxconf类来使用这个fd,如下:functionconf(nginxconf,fid){varpaths=[];vars。