加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP开发:使用PHP抓取百万知乎用户以及知识点札记

发布时间:2016-09-09 21:02:05 所属栏目:PHP教程 来源:博客园
导读:根本原因是在各个子进程创建时,就已经继承了父进程一份完全一样的拷贝。对象可以拷贝,但是已创建的连接不能被拷贝成多个,由此产生的结果,就是各个进程都使用同一个redis连接,各干各的事,最终产生莫名其妙的冲突。
副标题[/!--empirenews.page--]

代码托管地址:https://github.com/hhqcontinue/zhihuSpider

开发前的准备

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

安装PHP5.6或以上版本;

安装curl、pcntl扩展。

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

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

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

PHP开发:使用PHP抓取百万知乎用户以及知识点札记

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

初始的示例:

  1. $url = 'http://www.zhihu.com/people/mora-hu/about'; //此处mora-hu代表用户ID 
  2.     $ch = curl_init($url); //初始化会话 
  3.     curl_setopt($ch, CURLOPT_HEADER, 0); 
  4.     curl_setopt($ch, CURLOPT_COOKIE, $this->config_arr['user_cookie']);  //设置请求COOKIE 
  5.     curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
  6.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。 
  7.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);   
  8.     $result = curl_exec($ch); 
  9.     return $result;  //抓取的结果 

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

图片防盗链

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

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

  1. function getImg($url, $u_id) 
  2.     if (file_exists('./images/' . $u_id . ".jpg")) 
  3.     { 
  4.         return "images/$u_id" . '.jpg'; 
  5.     } 
  6.     if (empty($url)) 
  7.     { 
  8.         return ''; 
  9.     } 
  10.     $context_options = array(   
  11.         'http' =>   
  12.         array( 
  13.             'header' => "Referer:http://www.zhihu.com"//带上referer参数  
  14.     ) 
  15. ); 
  16.        
  17.     $context = stream_context_create($context_options);   
  18.     $img = file_get_contents('http:' . $url, FALSE, $context); 
  19.     file_put_contents('./images/' . $u_id . ".jpg", $img); 
  20.     return "images/$u_id" . '.jpg'; 

 

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

PHP开发:使用PHP抓取百万知乎用户以及知识点札记

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

PHP开发:使用PHP抓取百万知乎用户以及知识点札记

分析页面的html结构,因为只要得到用户的信息,所以只需要框住的这一块的div内容,用户名都在这里面。可以看到,用户关注了的页面的url是:

PHP开发:使用PHP抓取百万知乎用户以及知识点札记

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读