如何用PHP采集知乎数据,【php爬虫】百万级别知乎用户数据爬取与分析

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

文/Hector

这次抓取了110万的用户数据,数据分析结果如下:

如何用PHP采集知乎数据,【php爬虫】百万级别知乎用户数据爬取与分析_第1张图片

开发前的准备

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

安装PHP5.6或以上版本;

安装curl、pcntl扩展。

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

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

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

如何用PHP采集知乎数据,【php爬虫】百万级别知乎用户数据爬取与分析_第2张图片

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

初始的示例:

$url = 'http://www.zhihu.com/people/mora-hu/about';

//此处mora-hu代表用户ID

$ch = curl_init($url);

//初始化会话

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_COOKIE, $this->config_arr['user_cookie']);

//设置请求COOKIE

curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$result = curl_exec($ch);

return $result; //抓取的结果

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

图片防盗链

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

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

function getImg($url, $u_id){

if (file_exists('./images/' . $u_id . ".jpg"))

{

return "images/$u_id" . '.jpg'; } if (empty($url))

{

return '';

}

$context_options = array(

'http' =>

array(

'header' => "Referer:http://www.zhihu.com"//带上referer参数

)

);

$context = stream_context_create($context_options);

$img = file_get_contents('http:' . $url, FALSE, $context);

file_put_contents('./images/' . $u_id . ".jpg", $img);

return "images/$u_id" . '.jpg';}

爬取更多用户

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

如何用PHP采集知乎数据,【php爬虫】百万级别知乎用户数据爬取与分析_第3张图片

你可能感兴趣的:(如何用PHP采集知乎数据)