PHP를 사용하여 Zhihu 사용자 데이터를 크롤링하고 분석하는 방법에 대한 간략한 토론
本文给大家介绍的是利用php的curl编写的爬取知乎用户数据的爬虫,并分析用户的各种属性。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
移动端分析数据截图
pc端分析数据截图
整个爬取,分析,展现过程大概分如下几步,小拽将分别介绍
curl爬取知乎网页数据
正则分析知乎网页数据
数据数据入库和程序部署
数据分析和呈现
curl爬取网页数据
PHP的curl扩展是PHP支持的,允许你与各种服务器使用各种类型的协议进行连接和通信的库。是一个非常便捷的抓取网页的工具,同时,支持多线程扩展。
本程序抓取的是知乎对外提供用户访问的个人信息页面https://www.zhihu.com/people/xxx,抓取过程需要携带用户cookie才能获取页面。直接上码
获取页面cookie
代码如下:
// 登录知乎,打开个人中心,打开控制台,获取cookie document.cookie "_za=67254197-3wwb8d-43f6-94f0-fb0e2d521c31; _ga=GA1.2.2142818188.1433767929; q_c1=78ee1604225d47d08cddd8142a08288b23|1452172601000|1452172601000; _xsrf=15f0639cbe6fb607560c075269064393; cap_id="N2QwMTExNGQ0YTY2NGVddlMGIyNmQ4NjdjOTU0YTM5MmQ=|1453444256|49fdc6b43dc51f702b7d6575451e228f56cdaf5d"; __utmt=1; unlock_ticket="QUJDTWpmM0lsZdd2dYQUFBQVlRSlZUVTNVb1ZaNDVoQXJlblVmWGJ0WGwyaHlDdVdscXdZU1VRPT0=|1453444421|c47a2afde1ff334d416bafb1cc267b41014c9d5f"; __utma=51854390.21428dd18188.1433767929.1453187421.1453444257.3; __utmb=51854390.14.8.1453444425011; __utmc=51854390; __utmz=51854390.1452846679.1.dd1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmv=51854390.100-1|2=registration_date=20150823=1^dd3=entry_date=20150823=1"
通过curl,携带cookie,先抓取本人中心页面
/** * 通过用户名抓取个人中心页面并存储 * * @param $username str :用户名 flag * @return boolean :成功与否标志 */ public function spiderUser($username) { $cookie = "xxxx" ; $url_info = 'http://www.zhihu.com/people/' . $username; //此处cui-xiao-zhuai代表用户ID,可以直接看url获取本人id $ch = curl_init($url_info); //初始化会话 curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_COOKIE, $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); file_put_contents('/home/work/zxdata_ch/php/zhihu_spider/file/'.$username.'.html',$result); return true; }
正则分析网页数据分析新链接,进一步爬取
对于抓取过来的网页进行存储,要想进行进一步的爬取,页面必须包含有可用于进一步爬取用户的链接
。通过对知乎页面分析发现:在个人中心页面中有关注人和部分点赞人和被关注人。
如下所示
代码如下:
// 抓取的html页面中发现了新的用户,可用于爬虫 <a class="zm-item-link-avatar avatar-link" href="/people/new-user" data-tip="p$t$new-user">
ok,这样子就可以通过自己-》关注人-》关注人的关注人-》。。。进行不断爬取。接下来就是通过正则匹配提取该信息
代码如下:
// 匹配到抓取页面的所有用户 preg_match_all('/\/people\/([\w-]+)\"/i', $str, $match_arr); // 去重合并入新的用户数组,用户进一步抓取 self::$newUserArr = array_unique(array_merge($match_arr[1], self::$newUserArr));
到此,整个爬虫过程就可以顺利进行了。
如果需要大量的抓取数据,可以研究下curl_multi
和pcntl
进行多线程的快速抓取,此处不做赘述。
分析用户数据,提供分析
通过正则可以进一步匹配出更多的该用户数据,直接上码。
// 获取用户头像 preg_match('/<img .+src=\"?([^\s]+\.(jpg|gif|bmp|bnp|png))\"?.+ alt="PHP를 사용하여 Zhihu 사용자 데이터를 크롤링하고 분석하는 방법에 대한 간략한 토론" >/i', $str, $match_img); $img_url = $match_img[1]; // 匹配用户名: // <span class="name">崔小拽</span> preg_match('/<span.+class=\"?name\"?>([\x{4e00}-\x{9fa5}]+).+span>/u', $str, $match_name); $user_name = $match_name[1]; // 匹配用户简介 // class bio span 中文 preg_match('/<span.+class=\"?bio\"?.+\>([\x{4e00}-\x{9fa5}]+).+span>/u', $str, $match_title); $user_title = $match_title[1]; // 匹配性别 //<input type="radio" name="gender" value="1" checked="checked" class="male"/> 男 // gender value1 ;结束 中文 preg_match('/<input.+name=\"?gender\"?.+value=\"?1\"?.+([\x{4e00}-\x{9fa5}]+).+\;/u', $str, $match_sex); $user_sex = $match_sex[1]; // 匹配地区 //<span class="location item" title="北京"> preg_match('/<span.+class=\"?location.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_city); $user_city = $match_city[1]; // 匹配工作 //<span class="employment item" title="人见人骂的公司">人见人骂的公司</span> preg_match('/<span.+class=\"?employment.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_employment); $user_employ = $match_employment[1]; // 匹配职位 // <span class="position item" title="程序猿"><a href="/topic/19590046" title="程序猿" class="topic-link" data-token="19590046" data-topicid="13253">程序猿</a></span> preg_match('/<span.+class=\"?position.+\"?.+\"([\x{4e00}-\x{9fa5}]+).+\">/u', $str, $match_position); $user_position = $match_position[1]; // 匹配学历 // <span class="education item" title="研究僧">研究僧</span> preg_match('/<span.+class=\"?education.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_education); $user_education = $match_education[1]; // 工作情况 // <span class="education-extra item" title='挨踢'>挨踢</span> preg_match('/<span.+class=\"?education-extra.+\"?.+>([\x{4e00}- \x{9fa5}]+)</u', $str, $match_education_extra); $user_education_extra = $match_education_extra[1]; // 匹配关注话题数量 // class="zg-link-litblue"><strong>41 个话题</strong></a> preg_match('/class=\"?zg-link-litblue\"?><strong>(\d+)\s.+strong>/i', $str, $match_topic); $user_topic = $match_topic[1]; // 关注人数 // <span class="zg-gray-normal">关注了 preg_match_all('/<strong>(\d+)<.+<label>/i', $str, $match_care); $user_care = $match_care[1][0]; $user_be_careed = $match_care[1][1]; // 历史浏览量 // <span class="zg-gray-normal">个人主页被 <strong>17</strong> 人浏览</span> preg_match('/class=\"?zg-gray-normal\"?.+>(\d+)<.+span>/i', $str, $match_browse); $user_browse = $match_browse[1];
在抓取的过程中,有条件的话,一定要通过redis入库,确实能提升抓取和入库效率。没有条件的话只能通过sql优化。这里来几发心德。
数据库表设计索引一定要慎重。在spider爬取的过程中,建议出了用户名,左右字段都不要索引,包括主键都不要,尽可能的提高入库效率
,试想5000w的数据,每次添加一个,建立索引需要多少消耗。等抓取完毕,需要分析数据时,批量建立索引。
数据入库和更新操作,一定要批量。 mysql 官方给出的增删改的建议和速度:http://dev.mysql.com/doc/refman/5.7/en/insert-speed.html
# 官方的最优批量插入 INSERT INTO yourtable VALUES (1,2), (5,5), ...;
部署操作。程序在抓取过程中,有可能会出现异常挂掉,为了保证高效稳定,尽可能的写一个定时脚本。每隔一段时间干掉,重新跑,这样即使异常挂掉也不会浪费太多宝贵时间,毕竟,time is money。
#!/bin/bash # 干掉 ps aux |grep spider |awk '{print $2}'|xargs kill -9 sleep 5s # 重新跑 nohup /home/cuixiaohuan/lamp/php5/bin/php /home/cuixiaohuan/php/zhihu_spider/spider_new.php &
数据分析呈现
数据的呈现主要使用echarts 3.0,感觉对于移动端兼容还不错。兼容移动端的页面响应式布局主要通过几个简单的css控制,代码如下
// 获取用户头像 preg_match('/<img .+src=\"?([^\s]+\.(jpg|gif|bmp|bnp|png))\"?.+ alt="PHP를 사용하여 Zhihu 사용자 데이터를 크롤링하고 분석하는 방법에 대한 간략한 토론" >/i', $str, $match_img); $img_url = $match_img[1]; // 匹配用户名: // <span class="name">崔小拽</span> preg_match('/<span.+class=\"?name\"?>([\x{4e00}-\x{9fa5}]+).+span>/u', $str, $match_name); $user_name = $match_name[1]; // 匹配用户简介 // class bio span 中文 preg_match('/<span.+class=\"?bio\"?.+\>([\x{4e00}-\x{9fa5}]+).+span>/u', $str, $match_title); $user_title = $match_title[1]; // 匹配性别 //<input type="radio" name="gender" value="1" checked="checked" class="male"/> 男 // gender value1 ;结束 中文 preg_match('/<input.+name=\"?gender\"?.+value=\"?1\"?.+([\x{4e00}-\x{9fa5}]+).+\;/u', $str, $match_sex); $user_sex = $match_sex[1]; // 匹配地区 //<span class="location item" title="北京"> preg_match('/<span.+class=\"?location.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_city); $user_city = $match_city[1]; // 匹配工作 //<span class="employment item" title="人见人骂的公司">人见人骂的公司</span> preg_match('/<span.+class=\"?employment.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_employment); $user_employ = $match_employment[1]; // 匹配职位 // <span class="position item" title="程序猿"><a href="/topic/19590046" title="程序猿" class="topic-link" data-token="19590046" data-topicid="13253">程序猿</a></span> preg_match('/<span.+class=\"?position.+\"?.+\"([\x{4e00}-\x{9fa5}]+).+\">/u', $str, $match_position); $user_position = $match_position[1]; // 匹配学历 // <span class="education item" title="研究僧">研究僧</span> preg_match('/<span.+class=\"?education.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u', $str, $match_education); $user_education = $match_education[1]; // 工作情况 // <span class="education-extra item" title='挨踢'>挨踢</span> preg_match('/<span.+class=\"?education-extra.+\"?.+>([\x{4e00}- \x{9fa5}]+)</u', $str, $match_education_extra); $user_education_extra = $match_education_extra[1]; // 匹配关注话题数量 // class="zg-link-litblue"><strong>41 个话题</strong></a> preg_match('/class=\"?zg-link-litblue\"?><strong>(\d+)\s.+strong>/i', $str, $match_topic); $user_topic = $match_topic[1]; // 关注人数 // <span class="zg-gray-normal">关注了 preg_match_all('/<strong>(\d+)<.+<label>/i', $str, $match_care); $user_care = $match_care[1][0]; $user_be_careed = $match_care[1][1]; // 历史浏览量 // <span class="zg-gray-normal">个人主页被 <strong>17</strong> 人浏览</span> preg_match('/class=\"?zg-gray-normal\"?.+>(\d+)<.+span>/i', $str, $match_browse); $user_browse = $match_browse[1];
推荐学习:《PHP视频教程》

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











데이터 시대의 도래와 데이터의 양과 유형이 다양해짐에 따라, 방대한 양의 데이터를 획득하고 처리해야 하는 기업과 개인이 점점 더 많아지고 있습니다. 이때 크롤러 기술은 매우 효과적인 방법이 됩니다. 이 기사에서는 PHP 크롤러를 사용하여 빅데이터를 크롤링하는 방법을 소개합니다. 1. 크롤러 소개 크롤러는 인터넷 정보를 자동으로 얻는 기술입니다. 원칙은 프로그램을 작성하여 인터넷에서 웹사이트 콘텐츠를 자동으로 얻고 구문 분석하며 처리 또는 저장에 필요한 데이터를 캡처하는 것입니다. 크롤러 프로그램이 발전하면서 많은 것들이 성숙해졌습니다.

인터넷의 발달로 인해 웹 페이지에 담긴 정보의 양은 점점 더 많아지고, 많은 사람들은 방대한 양의 데이터에서 필요한 정보를 빠르게 추출해야 합니다. 현재 크롤러는 중요한 도구 중 하나가 되었습니다. 이 기사에서는 PHP를 사용하여 고성능 크롤러를 작성하여 네트워크에서 필요한 정보를 빠르고 정확하게 얻는 방법을 소개합니다. 1. 크롤러의 기본 원리를 이해합니다. 크롤러의 기본 기능은 브라우저를 시뮬레이션하여 웹 페이지에 액세스하고 특정 정보를 얻는 것입니다. 서버에 요청을 보내는 등 웹 브라우저에서 사용자가 수행하는 일련의 작업을 시뮬레이션할 수 있습니다.

PHP 크롤러 시작하기: 올바른 클래스 라이브러리를 선택하는 방법은 무엇입니까? 인터넷의 급속한 발전으로 인해 많은 양의 데이터가 다양한 웹사이트에 분산되어 있습니다. 이 데이터를 얻으려면 크롤러를 사용하여 웹 페이지에서 정보를 추출해야 하는 경우가 많습니다. 일반적으로 사용되는 웹 개발 언어인 PHP에는 크롤러가 선택할 수 있는 다양한 클래스 라이브러리도 있습니다. 그러나 프로젝트 요구 사항에 맞는 라이브러리를 선택할 때 고려해야 할 몇 가지 주요 요소가 있습니다. 기능적 풍부함: 다양한 크롤러 라이브러리는 다양한 기능을 제공합니다. 일부 라이브러리는 간단한 웹 스크래핑에만 사용할 수 있지만 다른 라이브러리는

웹 크롤러는 인터넷 정보를 자동으로 크롤링하는 프로그램으로, 단시간에 많은 양의 데이터를 얻을 수 있습니다. 그러나 웹 크롤러의 확장성과 효율성으로 인해 많은 웹사이트에서는 크롤러의 공격을 받을 것을 우려하여 다양한 크롤링 방지 전략을 채택했습니다. 그 중 PHP 웹 크롤러에 대한 일반적인 크롤링 방지 전략은 주로 다음과 같습니다. IP 제한 IP 제한은 가장 일반적인 크롤링 방지 기술입니다. IP 액세스를 제한하면 악의적인 크롤러 공격을 효과적으로 예방할 수 있습니다. 이러한 크롤링 방지 전략을 처리하기 위해 PHP 웹 크롤러는 다음을 수행할 수 있습니다.

PHP 크롤러의 동시성 및 다중 스레드 처리 기술 소개: 인터넷의 급속한 발전으로 인해 많은 양의 데이터 정보가 다양한 웹 사이트에 저장되고 이 데이터를 얻는 것이 많은 비즈니스 시나리오에서 필수 사항이 되었습니다. 크롤러는 네트워크 정보를 자동으로 얻기 위한 도구로서 데이터 수집, 검색 엔진, 여론 분석 및 기타 분야에서 널리 사용됩니다. 이 기사에서는 PHP 기반 크롤러 클래스에 대한 동시성 및 멀티스레딩 처리 기술을 소개하고 코드 예제를 통해 그 구현을 보여줍니다. 1. 파충류 클래스의 기본 구조를 사용하여 파충류 클래스의 동시성 및 멀티스레딩을 구현합니다.

인터넷의 급속한 발전과 대중화로 인해 점점 더 많은 데이터를 수집하고 처리해야 합니다. 일반적으로 사용되는 웹 크롤링 도구인 크롤러는 웹 데이터에 빠르게 액세스하고 수집하고 구성하는 데 도움이 됩니다. 다양한 요구에 따라 크롤러를 구현하는 데는 여러 언어가 있을 것이며, 그 중 PHP도 널리 사용됩니다. 오늘은 PHP를 기반으로 한 크롤러의 구현방법과 주의사항에 대해 이야기해보겠습니다. 1. PHP 크롤러 구현 방법 초보자는 기성 라이브러리를 사용하는 것이 좋습니다. 초보자의 경우 일정한 코딩 경험과 네트워크가 축적되어야 할 수도 있습니다.

인터넷의 지속적인 발전으로 인해 다양한 웹사이트에 많은 양의 데이터가 저장되어 있으며 이는 비즈니스 및 과학 연구에 중요한 가치를 갖고 있습니다. 그러나 이러한 데이터를 얻는 것이 반드시 쉬운 것은 아닙니다. 이 시점에서 크롤러는 자동으로 웹 사이트에 액세스하고 데이터를 캡처할 수 있는 매우 중요하고 효과적인 도구가 됩니다. PHP는 널리 사용되는 해석형 프로그래밍 언어로 배우기 쉽고 효율적인 코드를 갖추고 있어 크롤러 구현에 적합합니다. 이 기사에서는 PHP를 사용하여 크롤러를 구현하고 다음 측면에서 데이터를 캡처하는 방법을 소개합니다. 1. 크롤러의 작동 원리

PHP 크롤러를 사용하여 자동으로 양식을 채우고 데이터를 제출하는 방법은 무엇입니까? 인터넷이 발전함에 따라 웹 페이지에서 데이터를 얻거나 자동으로 양식을 작성하고 데이터를 제출해야 하는 필요성이 점점 더 커지고 있습니다. 강력한 서버측 언어인 PHP는 이러한 기능을 구현하기 위한 수많은 도구와 클래스 라이브러리를 제공합니다. 이 기사에서는 PHP에서 크롤러를 사용하여 자동으로 양식을 채우고 데이터를 제출하는 방법을 설명합니다. 먼저 웹 페이지 데이터를 얻고 제출하려면 PHP의 컬 라이브러리를 사용해야 합니다. 컬 라이브러리는 강력하다
