本文介绍的内容是关于水平PHP爬虫百万知乎抓取和用户数据的分析,有一定的参考价值,现在分享给大家,有需要的朋友可以参考的



本文介绍了相关信息PHP知道近百万级用户的数据抓取和分析,需要的朋友可以参考以下

准备开发

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

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

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



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

最初的例子:


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

1,防盗链图片

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

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


2,更多的用户爬行

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

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



html页面结构分析,只要用户得到的信息,这其中的所以只有框架P的含量,在那里用户名。你可以看到,用户在网页的网址:

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

3,Linux文件统计数

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


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

如图4所示,数据插入过程被重复的MySQL

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

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

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

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

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

第一个选项是最简单也是最糟糕的方案的效率,因此不采取。该方案的两个和四个执行结果是一样的,所不同的是,在相同的数据的面部,INSERT INTO 。对重复密钥更新直接更新,和REPLACE INTO是删除旧数据并插入一个新的,在这个过程中,还需要维护索引,这么慢。因此,二和四之间都选择了第二个选项。第三个选项,INSERT INGNORE忽略发生INSERT语句执行错误,问题不会忽视语法,但忽略了主键的存在。其结果是,使用INSERT INGNORE越好。最后,考虑到重复数据的数量被记录在数据库中,所以在程序中使用的第二方案。

5,采用多线程curl_multi的抓取页面。

起初单一的过程和一个卷曲抢数据,速度很慢,挂爬一个晚上只捕获数据的2W,这样他们就可以认为进入了一个新的用户时请求一个页面卷曲的头发比一次性要求更多用户,后来我发现curl_multi的好东西。curl_multi这些功能可同时实现请求多个URL,而不是一个请求,它类似于在一个过程中的Linux系统打开多个线程中执行的功能。下面是一个例子curl_multi多线程履带使用:


6,HTTP 429个请求过多

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

7,使用Redis的保存用户已访问

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

在PHP中使用Redis的例子:


8,使用PHP扩展来实现多进程PTL

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


9,查看在Linux下系统信息的CPU

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


结果如下:

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

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

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

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


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

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

改造后的代码如下:


11,PHP脚本的执行时间统计

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


这就是这篇文章,供大家参考,我们希望能帮助学习。

相关建议:

PHP比爬行动物的水平以上百万知乎用户抓取的数据和分析的细节,更请PHP的中国其他相关文章!


本文链接:PHP爬虫之百万级别知乎用户数据爬取与分析

您可能也会喜欢

友情链接:

经文 大悲咒注音 心经唱诵