地址:

代码托管地址:

文/赫克托

用户数据提取1.1万元,数据分析结果如下:

准备开发

安装Linux系统(Ubuntu14.04),安装在Ubuntu的VMWar?虚拟机;

安装PHP5。版本6或以上;

安装卷曲,PTL延伸。

使用PHP的curl扩展的数据抓取页面。

PHP PHP的curl扩展支持与各种服务器允许您使用不同类型的连接和通信协议库的。

这个过程被称为几乎抢用户数据,能够访问用户的个人页面,访问用户登录。当我们在浏览器用户头像的网页链接到页面的用户的个人中心,点击,当用户能够看到的信息,因为点击链接时,浏览器会帮你放在一起提交到一个新的本地饼干页面,这样你就可以进入用户的个人中心页面。因此,我们需要实现访问您的个人页面之前,得到用户的cooki?信息,然后把Cooki?信息,每次卷曲的请求。在收购,我已经使用了cookie的cookie信息方面,您可以看到您在网页中的cookie信息:

一个副本,以“__utma =? ; __ UTMB =? ; 在cookie字符串的形式“这样的组合物。然后你可以使用cookie字符串发送请求。

最初的例子:

运行上面的代码可以猜拳虎用户的个人中心页面。有了这个结果,然后使用正则表达式来处理页面,你可以得到的信息如姓名,性别等。需要抓取。

图片防盗链

当返回的结果常规后处理个人信息的输出,我们发现无法打开头像页输出。通过查阅资料得知,因为图片也知道几乎防盗链流程。该解决方案是一种假照片时提前的referer在请求中所请求。

以链接到该图像的正则表达式之后,再发一次请求,此时,以使图像请求源,该请求被从几乎站已知的描述转发。具体实例如下:

功能 GETIMG($网址$ U_ID){    
    如果文件已存在(‘ 。$ U_ID 。“。JPG“))    
    {       
       返回 “图片 /$ U_ID“ 。“。JPG“;}    如果$网址))    
    {        
       返回 ’‘; 
    }
    $语境_options=排列(         
 ’HTTP‘=>  
        排列(
            ’标题‘=> “的Referer:”//带引荐参数 
      )
  );
          $语境=stream_context_create$ Context_options);
      $图=的file_get_contents( ’HTTP:‘ 。$网址$ Context);
    file_put_contents(’ 。$ U_ID 。“。JPG”, $图);
    返回 “图片 /$ U_ID“ 。“。JPG“;}

爬行更多用户

爬上自己的个人信息之后,您需要访问用户和更多的用户信息的用户列表。然后,通过层接入层。它可以在个人页面的中心中可以看出,有以下两个链接:

这里有两个环节,一个是,和其他人是联系“”榜样。与对应于所述匹配链路n至匹配,获得卷曲URL磁带的cookie请求再发一次后。爬行到用户的列表页面后,您可以进入以下页面:

html页面结构分析,只要用户得到的信息,所以只箱子div的内容住在这其中,用户名在那里。你可以看到,用户在网页的网址:

此URL的不同的用户几乎是相同的,不同的地方的用户名是存在的。与普通的比赛来获得用户名列表,一个接一个,打网址,然后逐一提出的要求(当然,一个是一个缓慢的,下面有一个解决方案,我们将讨论这个版本)。进入新用户的页面后,再重复上述步骤,从而不断循环,直到你想要的数据量。

Linux的文件数目统计

脚本运行一段时间后,我们需要看看到底有多少图像获取,当大量的数据,打开文件夹编号,以查看图片有点慢。该脚本在Linux环境下运行,所以你可以使用Linux命令计数的文件数:

其中,在所述目录的ls -l长列表输出文件信息(文件可以是在一个目录中,连杆装置文件等。); grep“可以^ - ”长滤波器输出列表“^ - “一般只保留文件,如果只保留目录为‘^ d';厕所-l出口统计数据是信息的行数。下面是操作的一个例子:

数据插入过程被重复的MySQL

一段时间运行后,我们发现数据的很多用户是重复的,因此需要在插入重复的用户数据处理的时间内完成。处理方案如下:

1)检查是否该数据到数据库中的数据库中存在之前;

2)添加一个唯一的索引,插入INSERT INTO期间使用 。上的重复密钥更新。

3)加入一个唯一的索引,插入INSERT INTO INGNORE期间使用。

4)加入一个唯一的索引,在插入期间使用REPLACE INTO。

使用curl_multi实现I / O复用抓取页面。

起初单一的过程和一个卷曲抢数据,速度很慢,挂爬一个晚上只捕获数据的2W,这样他们就可以认为进入了一个新的用户时请求一个页面卷曲的头发比一次性要求更多用户,后来我发现curl_multi的好东西。这样的功能可以被实现同时curl_multi多个请求URL的,而不是一个请求,该请求是用于I / O复用的机构。以下是使用curl_multi爬行动物的例子:

HTTP 429?过多的请求

使用curl_multi功能可以同时发送多个请求,但在操作的执行期间发出同样的请求200时,很多请求不能返回找到的,我。e。丢包发现。使用打印功能curl_getinfo每个处理信息的请求进一步的分析,该函数返回一个包含HTTP响应关联数组信息,这是一个字段HTTP_CODE,示出HTTP状态代码返回的请求。看到很多的请求是HTTP_CODE 429,此返回代码意味着发送过多的请求。我猜知乎制成的保护反爬行动物,所以我又站做测试,并没有发现任何问题,当一次性发送200个请求,证实了我的猜测,知乎做保护在这方面,我。e。一次性请求数量是有限。所以,我继续减少请求的数量,在五月的时候发现不会有任何数据包丢失了。说明在这个程序中一次只能发五个申请,虽然不多,但也是一点点改进。

使用Redis的保存用户已访问

抓住用户的过程中,人们发现,一些用户已经访问过,他和已经收购谁的用户,虽然做重复的数据交易在数据库的水平,但该计划仍然会发送一个请求使用卷曲,所以有许多重复发送请求重复网络开销。有必要为用户捕捉暂时存储在一个地方下一个执行,一开始就是把数组里面,后来才发现是在程序中多进程,多进程编程,子进程添加到其它进程所使用共享程序代码,所述库中,但过程变量使用不同。不同的过程变量之间是分开的,并且不能被其他进程读取,则不能使用的阵列。因此,认为用户的使用Redis的缓存来存储用户和已处理好的被捕获。因此,在关于一个队列already_request_queue被执行的用户推每次,用户被抓握(ⅰ。e。,每个用户的列表中,并且用户)推request_queue内,并在request_queue每次执行之前弹出一个用户,然后确定是否already_request_queue内,如果是的话,那么接下来,否则继续。

在PHP中使用Redis的例子:

PHP扩展使用多进程PTL的

到curl_multi函数来实现多线程抓取用户信息的开关,程序运行一晚后,将所得数据具有10W。我们不能达到自己预期的目标,所以他们不断优化,后来发现PTL PHP扩展里面可以实现多进程编程。以下是编程多编程的示例:

查看系统linux下的CPU信息

多进程的编程实现,想一些更开放的过程中继续抢用户的数据,以及后来开了一个晚上经过八年的传递过程跑去,发现只有获取数据的20W,也没有太大的起色。这样获得的信息,根据系统优化的CPU性能调整,的进程的最大数目不能只给该程序,根据CPU内核的数量,并给予的进程的最大数目优选为2倍CPU核心的数量。有必要看一下视图的信息CPU CPU的审计。cpu命令以查看在linux信息:

其中,型号名称指示信息的CPU类型,CPU内核代表CPU核心数量。审计这里是1,因为它是在分配给CPU芯数虚拟机中运行比较小,它只能打开2个处理。最终的结果是,与该用户数据的一个周末取1。百万。

多进程编程,MySQL和Redis的连接问题

在多工艺条件下,运行一段时间后,发现该数据无法插入到数据库中,错误将被报告的mysql连接过多是,Redis的,太。

下面的代码将执行部分失败:

<?php
     for$ I= 0; $ I <10; $ I++){
          $ PID= Ptl_fork();
          如果$ PID==  -  1){
               回声 “无法fork!\ N“;
               出口(1);
          }
          如果 (!$ PID){
               $ Redis的= :: PRedis的getInstance();
               // 做一点事     
               出口;
          }
     }

其根本原因是在创建每个子进程的时候,它继承父进程完全相同的副本。对象可以被复制,但已创建的连接不能被复制到多,造成的结果是,每一个进程使用相同的连接redis的,所有的干物质,最终产生莫名其妙的冲突。

解:

该方案不能保证直到叉,父进程不创建的连接例子的Redis。因此,只能由孩子自己解决这个问题。试想一下,如果只与当前进程相关联的子过程中获得的情况下,那么这个问题就不存在了。因此该解决方案被稍微修改外表redis的类被实例化静态,绑定当前进程ID。

改造后的代码如下:

PHP脚本的执行时间统计

时间,因为我想知道有多少是花在每一个过程,因此,写一个脚本执行时间统计功能:

如果在正确的地方没有文字,我希望大家注意的是,为了纠正。



文/信息/ 50452103

本文链接:PHP写爬虫

您可能也会喜欢

友情链接:

心经唱诵 大悲咒注音 经文