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

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

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

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

最初的例子:

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

图片防盗链

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

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

爬行更多用户

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

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

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

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

Linux的文件数目统计

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

其中,

数据插入过程被重复的MySQL

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

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

2)添加一个唯一的索引,在插入期间使用

3)加入一个唯一的索引,在插入期间使用

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

第一个选项是最简单也是最糟糕的方案的效率,因此不采取。该方案的两个和四个执行结果是一样的,所不同的是,在相同的数据的面部,

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

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

HTTP 429个请求过多

使用curl_multi功能可以同时发送多个请求,但在操作的执行期间发出同样的请求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的,太。

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

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

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

PHP脚本的执行时间统计

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

原文地址:


20%

本文链接:PHP爬虫

您可能也会喜欢

友情链接:

经文 大悲咒注音 心经唱诵