【php爬虫】百万级别知乎用户数据爬取与剖析

优采云 发布时间: 2020-06-14 08:03

  代码托管地址:

  文/Hector

  这次抓取了110万的用户数据php 网络爬虫 抓取数据,数据剖析结果如下:

  开发前的打算

  安装linux系统(Ubuntu14.04),在VMWare虚拟机下安装一个Ubuntu;

  安装PHP5.6或以上版本;

  安装curl、pcntl扩充。

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

  PHP的curl扩充是PHP支持的容许你与各类服务器使用各类类型的合同进行联接和通讯的库。

  本程序是抓取知乎的用户数据,要能访问用户个人页面,需要用户登陆后的能够访问。当我们在浏览器的页面中点击一个用户头像链接步入用户个人中心页面的时侯,之所以还能看见用户的信息,是因为在点击链接的时侯,浏览器帮你将本地的cookie带上一同递交到新的页面,所以你才能步入到用户的个人中心页面。因此实现访问个人页面之前须要先获得用户的cookie信息,然后在每次curl恳求的时侯带上cookie信息。在获取cookie信息方面,我是用了自己的cookie,在页面中可以看见自己的cookie信息:

  一个个地复制,以"__utma=?;__utmb=?;"这样的方式组成一个cookie字符串。接下来就可以使用该cookie字符串来发送恳求。

  初始的示例:

   $url = ''; <br /> //此处mora-hu代表用户ID

$ch = curl_init($url); <br /> //初始化会话

curl_setopt($ch, CURLOPT_HEADER, 0); <br /> curl_setopt($ch, CURLOPT_COOKIE, $this-&gt;config_arr['user_cookie']); <br /> //设置请求COOKIE

curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); <br /> curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); <br /> //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); <br /> $result = curl_exec($ch); <br /> return $result; //抓取的结果

  运行里面的代码可以获得mora-hu用户的个人中心页面。利用该结果再使用正则表达式对页面进行处理,就能获取到姓名,性别等所须要抓取的信息。

  图片防盗链

  在对返回结果进行正则处理后输出个人信息的时侯,发现在页面中输出用户头像时难以打开。经过查阅资料获知,是因为知乎对图片做了防盗链处理。解决方案就是恳求图片的时侯在恳求头里伪造一个referer。

  在使用正则表达式获取到图片的链接以后,再发一次恳求,这时候带上图片恳求的来源,说明该恳求来自知乎网站的转发。具体事例如下:

  function getImg($url, $u_id){ <br /> if (file_exists('./images/' . $u_id . ".jpg")) <br /> { <br /> return "images/$u_id" . '.jpg'; } if (empty($url)) <br /> { <br /> return ''; <br /> }<br /> $context_options = array( <br /> 'http' =&gt;

array(<br /> 'header' =&gt; "Referer:"//带上referer参数

  )<br />  );<br /> $context = stream_context_create($context_options);<br /> $img = file_get_contents('http:' . $url, FALSE, $context);<br /> file_put_contents('./images/' . $u_id . ".jpg", $img);<br /> return "images/$u_id" . '.jpg';}

  爬取更多用户

  抓取了自己的个人信息后,就须要再访问用户的关注者和关注了的用户列表获取更多的用户信息。然后一层一层地访问。可以见到,在个人中心页面里,有两个链接如下:

  这里有两个链接,一个是关注了,另一个是关注者,以“关注了”的链接为例。用正则匹配去匹配到相应的链接,得到url以后用curl带上cookie再发一次恳求。抓取到用户关注了的用于列表页以后,可以得到下边的页面:

  分析页面的html结构php 网络爬虫 抓取数据,因为只要得到用户的信息,所以只须要框住的这一块的div内容,用户名都在这上面。可以看见,用户关注了的页面的url是:

  不同的用户的这个url几乎是一样的,不同的地方就在于用户名哪里。用正则匹配领到用户名列表,一个一个地拼url,然后再挨个发恳求(当然,一个一个是比较慢的,下面有解决方案,这个稍后会说到)。进入到新用户的页面然后,再重复前面的步骤,就这样不断循环,直到达到你所要的数据量。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线