Maison développement back-end tutoriel php 浅谈利用php爬取和分析知乎用户数据的方法

浅谈利用php爬取和分析知乎用户数据的方法

May 16, 2016 pm 07:59 PM
php爬虫

本文给大家介绍的是利用php的curl编写的爬取知乎用户数据的爬虫,并分析用户的各种属性。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

浅谈利用php爬取和分析知乎用户数据的方法

移动端分析数据截图

1.png

pc端分析数据截图

2.png

整个爬取,分析,展现过程大概分如下几步,小拽将分别介绍

  • 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"
Copier après la connexion

通过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;
 }
Copier après la connexion

正则分析网页数据分析新链接,进一步爬取

对于抓取过来的网页进行存储,要想进行进一步的爬取,页面必须包含有可用于进一步爬取用户的链接。通过对知乎页面分析发现:在个人中心页面中有关注人和部分点赞人和被关注人。
如下所示

代码如下:

// 抓取的html页面中发现了新的用户,可用于爬虫
<a class="zm-item-link-avatar avatar-link" href="/people/new-user" data-tip="p$t$new-user">
Copier après la connexion

ok,这样子就可以通过自己-》关注人-》关注人的关注人-》。。。进行不断爬取。接下来就是通过正则匹配提取该信息

代码如下:

// 匹配到抓取页面的所有用户
preg_match_all(&#39;/\/people\/([\w-]+)\"/i&#39;, $str, $match_arr);
// 去重合并入新的用户数组,用户进一步抓取
self::$newUserArr = array_unique(array_merge($match_arr[1], self::$newUserArr));
Copier après la connexion

到此,整个爬虫过程就可以顺利进行了。

如果需要大量的抓取数据,可以研究下curl_multipcntl进行多线程的快速抓取,此处不做赘述。

分析用户数据,提供分析

通过正则可以进一步匹配出更多的该用户数据,直接上码。

// 获取用户头像
preg_match(&#39;/<img.+src=\"?([^\s]+\.(jpg|gif|bmp|bnp|png))\"?.+>/i&#39;, $str, $match_img);
$img_url = $match_img[1];

// 匹配用户名:
// <span class="name">崔小拽</span>
preg_match(&#39;/<span.+class=\"?name\"?>([\x{4e00}-\x{9fa5}]+).+span>/u&#39;, $str, $match_name);
$user_name = $match_name[1];

// 匹配用户简介
// class bio span 中文
preg_match(&#39;/<span.+class=\"?bio\"?.+\>([\x{4e00}-\x{9fa5}]+).+span>/u&#39;, $str, $match_title);
$user_title = $match_title[1];

// 匹配性别
//<input type="radio" name="gender" value="1" checked="checked" class="male"/> 男  
// gender value1 ;结束 中文
preg_match(&#39;/<input.+name=\"?gender\"?.+value=\"?1\"?.+([\x{4e00}-\x{9fa5}]+).+\;/u&#39;, $str, $match_sex);
$user_sex = $match_sex[1];

// 匹配地区
//<span class="location item" title="北京">
preg_match(&#39;/<span.+class=\"?location.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $str, $match_city);
$user_city = $match_city[1];

// 匹配工作
//<span class="employment item" title="人见人骂的公司">人见人骂的公司</span>
preg_match(&#39;/<span.+class=\"?employment.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $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(&#39;/<span.+class=\"?position.+\"?.+\"([\x{4e00}-\x{9fa5}]+).+\">/u&#39;, $str, $match_position);
$user_position = $match_position[1];

// 匹配学历
// <span class="education item" title="研究僧">研究僧</span>
preg_match(&#39;/<span.+class=\"?education.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $str, $match_education);
$user_education = $match_education[1];

// 工作情况
// <span class="education-extra item" title=&#39;挨踢&#39;>挨踢</span>
preg_match(&#39;/<span.+class=\"?education-extra.+\"?.+>([\x{4e00}-
\x{9fa5}]+)</u&#39;, $str, $match_education_extra);
$user_education_extra = $match_education_extra[1];


// 匹配关注话题数量
// class="zg-link-litblue"><strong>41 个话题</strong></a>
preg_match(&#39;/class=\"?zg-link-litblue\"?><strong>(\d+)\s.+strong>/i&#39;, $str, $match_topic);
$user_topic = $match_topic[1];

// 关注人数
// <span class="zg-gray-normal">关注了
preg_match_all(&#39;/<strong>(\d+)<.+<label>/i&#39;, $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(&#39;/class=\"?zg-gray-normal\"?.+>(\d+)<.+span>/i&#39;, $str, $match_browse);
$user_browse = $match_browse[1];
Copier après la connexion
Copier après la connexion

在抓取的过程中,有条件的话,一定要通过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), ...;
Copier après la connexion

部署操作。程序在抓取过程中,有可能会出现异常挂掉,为了保证高效稳定,尽可能的写一个定时脚本。每隔一段时间干掉,重新跑,这样即使异常挂掉也不会浪费太多宝贵时间,毕竟,time is money。

#!/bin/bash

# 干掉
ps aux |grep spider |awk &#39;{print $2}&#39;|xargs kill -9
sleep 5s

# 重新跑
nohup /home/cuixiaohuan/lamp/php5/bin/php /home/cuixiaohuan/php/zhihu_spider/spider_new.php &
Copier après la connexion

数据分析呈现

数据的呈现主要使用echarts 3.0,感觉对于移动端兼容还不错。兼容移动端的页面响应式布局主要通过几个简单的css控制,代码如下

// 获取用户头像
preg_match(&#39;/<img.+src=\"?([^\s]+\.(jpg|gif|bmp|bnp|png))\"?.+>/i&#39;, $str, $match_img);
$img_url = $match_img[1];

// 匹配用户名:
// <span class="name">崔小拽</span>
preg_match(&#39;/<span.+class=\"?name\"?>([\x{4e00}-\x{9fa5}]+).+span>/u&#39;, $str, $match_name);
$user_name = $match_name[1];

// 匹配用户简介
// class bio span 中文
preg_match(&#39;/<span.+class=\"?bio\"?.+\>([\x{4e00}-\x{9fa5}]+).+span>/u&#39;, $str, $match_title);
$user_title = $match_title[1];

// 匹配性别
//<input type="radio" name="gender" value="1" checked="checked" class="male"/> 男  
// gender value1 ;结束 中文
preg_match(&#39;/<input.+name=\"?gender\"?.+value=\"?1\"?.+([\x{4e00}-\x{9fa5}]+).+\;/u&#39;, $str, $match_sex);
$user_sex = $match_sex[1];

// 匹配地区
//<span class="location item" title="北京">
preg_match(&#39;/<span.+class=\"?location.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $str, $match_city);
$user_city = $match_city[1];

// 匹配工作
//<span class="employment item" title="人见人骂的公司">人见人骂的公司</span>
preg_match(&#39;/<span.+class=\"?employment.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $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(&#39;/<span.+class=\"?position.+\"?.+\"([\x{4e00}-\x{9fa5}]+).+\">/u&#39;, $str, $match_position);
$user_position = $match_position[1];

// 匹配学历
// <span class="education item" title="研究僧">研究僧</span>
preg_match(&#39;/<span.+class=\"?education.+\"?.+\"([\x{4e00}-\x{9fa5}]+)\">/u&#39;, $str, $match_education);
$user_education = $match_education[1];

// 工作情况
// <span class="education-extra item" title=&#39;挨踢&#39;>挨踢</span>
preg_match(&#39;/<span.+class=\"?education-extra.+\"?.+>([\x{4e00}-
\x{9fa5}]+)</u&#39;, $str, $match_education_extra);
$user_education_extra = $match_education_extra[1];


// 匹配关注话题数量
// class="zg-link-litblue"><strong>41 个话题</strong></a>
preg_match(&#39;/class=\"?zg-link-litblue\"?><strong>(\d+)\s.+strong>/i&#39;, $str, $match_topic);
$user_topic = $match_topic[1];

// 关注人数
// <span class="zg-gray-normal">关注了
preg_match_all(&#39;/<strong>(\d+)<.+<label>/i&#39;, $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(&#39;/class=\"?zg-gray-normal\"?.+>(\d+)<.+span>/i&#39;, $str, $match_browse);
$user_browse = $match_browse[1];
Copier après la connexion
Copier après la connexion

推荐学习:《PHP视频教程

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser le robot d'exploration PHP pour explorer le Big Data Comment utiliser le robot d'exploration PHP pour explorer le Big Data Jun 14, 2023 pm 12:52 PM

Avec l’avènement de l’ère des données et la diversification des volumes et des types de données, de plus en plus d’entreprises et de particuliers ont besoin d’obtenir et de traiter des quantités massives de données. À l’heure actuelle, la technologie des robots devient une méthode très efficace. Cet article explique comment utiliser le robot d'exploration PHP pour explorer le Big Data. 1. Introduction aux robots d'exploration Les robots d'exploration sont une technologie qui obtient automatiquement des informations sur Internet. Le principe est d'obtenir et d'analyser automatiquement le contenu d'un site Web sur Internet en écrivant des programmes, et de capturer les données nécessaires au traitement ou au stockage. Dans l'évolution des programmes d'exploration, de nombreux

Méthode d'implémentation d'un robot d'exploration PHP haute performance Méthode d'implémentation d'un robot d'exploration PHP haute performance Jun 13, 2023 pm 03:22 PM

Avec le développement d'Internet, la quantité d'informations contenues dans les pages Web devient de plus en plus importante et de nombreuses personnes doivent extraire rapidement les informations dont elles ont besoin à partir d'énormes quantités de données. À l’heure actuelle, les robots d’exploration sont devenus l’un des outils importants. Cet article explique comment utiliser PHP pour écrire un robot d'exploration hautes performances afin d'obtenir rapidement et précisément les informations requises du réseau. 1. Comprendre les principes de base des robots d'exploration La fonction de base d'un robot d'exploration est de simuler un navigateur pour accéder à des pages Web et obtenir des informations spécifiques. Il peut simuler une série d'opérations effectuées par les utilisateurs dans un navigateur Web, comme l'envoi de requêtes au serveur.

Premiers pas avec les robots PHP : Comment choisir la bonne bibliothèque de classes ? Premiers pas avec les robots PHP : Comment choisir la bonne bibliothèque de classes ? Aug 09, 2023 pm 02:52 PM

Premiers pas avec les robots PHP : Comment choisir la bonne bibliothèque de classes ? Avec le développement rapide d’Internet, une grande quantité de données est dispersée sur différents sites Web. Afin d'obtenir ces données, nous devons souvent utiliser des robots d'exploration pour extraire des informations des pages Web. En tant que langage de développement Web couramment utilisé, PHP propose également de nombreuses bibliothèques de classes adaptées aux robots d'exploration. Cependant, certains facteurs clés doivent être pris en compte lors du choix d'une bibliothèque adaptée aux besoins de votre projet. Richesse fonctionnelle : différentes bibliothèques de robots fournissent différentes fonctions. Certaines bibliothèques ne peuvent être utilisées que pour du simple web scraping, tandis que d'autres

Stratégies anti-exploration courantes pour les robots d'exploration Web PHP Stratégies anti-exploration courantes pour les robots d'exploration Web PHP Jun 14, 2023 pm 03:29 PM

Un robot d'exploration Web est un programme qui explore automatiquement les informations Internet. Il peut obtenir une grande quantité de données en peu de temps. Cependant, en raison de l’évolutivité et de l’efficacité des robots d’exploration, de nombreux sites Web craignent d’être attaqués par des robots d’exploration, c’est pourquoi ils ont adopté diverses stratégies anti-exploration. Parmi elles, les stratégies anti-exploration courantes pour les robots d'exploration Web PHP incluent principalement les suivantes : Restriction IP La restriction IP est la technologie anti-exploration la plus courante. En restreignant l'accès IP, les attaques malveillantes des robots d'exploration peuvent être efficacement empêchées. Pour faire face à cette stratégie anti-crawling, les robots d'exploration PHP peuvent

Techniques de concurrence et multithreading pour les robots d'exploration PHP Techniques de concurrence et multithreading pour les robots d'exploration PHP Aug 08, 2023 pm 02:31 PM

Introduction aux compétences de traitement simultané et multithread des robots d'exploration PHP : avec le développement rapide d'Internet, une grande quantité d'informations de données est stockée sur divers sites Web, et l'obtention de ces données est devenue une exigence dans de nombreux scénarios commerciaux. En tant qu'outil permettant d'obtenir automatiquement des informations sur le réseau, les robots d'exploration sont largement utilisés dans la collecte de données, les moteurs de recherche, l'analyse de l'opinion publique et d'autres domaines. Cet article présentera une technique de traitement simultané et multithread pour une classe de robot d'exploration basée sur PHP et illustrera sa mise en œuvre à travers des exemples de code. 1. La structure de base de la classe reptile est utilisée pour réaliser la concurrence et le multithread de la classe reptile.

Utilisez PHP pour explorer les données du jeu StarCraft 2 Utilisez PHP pour explorer les données du jeu StarCraft 2 Jun 13, 2023 am 09:34 AM

Ces dernières années, avec le développement rapide de l’industrie du jeu, de nombreux joueurs ont commencé à s’intéresser aux données des jeux. Quant au jeu « StarCraft 2 » (ci-après dénommé SC2), sa richesse en données de jeu est sans aucun doute une caractéristique majeure qui attire de nombreux joueurs. Afin de mieux comprendre la situation du jeu, de nombreux joueurs souhaitent utiliser leurs compétences en programmation pour obtenir des données de jeu. Cet article explique comment utiliser le langage de programmation PHP pour implémenter le processus d'exploration des données du jeu SC2. Explorer une page Web Avant de commencer à explorer les données du jeu SC2, nous devons d'abord comprendre comment explorer une page Web. exister

Méthodes et précautions d'implémentation du robot d'exploration basé sur PHP Méthodes et précautions d'implémentation du robot d'exploration basé sur PHP Jun 13, 2023 pm 06:21 PM

Avec le développement et la vulgarisation rapides d’Internet, de plus en plus de données doivent être collectées et traitées. Crawler, en tant qu'outil d'exploration Web couramment utilisé, peut aider à accéder, collecter et organiser rapidement les données Web. Selon les différents besoins, il y aura plusieurs langages pour implémenter les robots d'exploration, parmi lesquels PHP est également un langage populaire. Aujourd'hui, nous allons parler des méthodes de mise en œuvre et des précautions des robots basés sur PHP. 1. Méthode d'implémentation du robot PHP Il est conseillé aux débutants d'utiliser des bibliothèques prêtes à l'emploi. Pour les débutants, vous devrez peut-être accumuler une certaine expérience en matière de codage et de réseau.

Comment utiliser PHP pour implémenter un robot et capturer des données Comment utiliser PHP pour implémenter un robot et capturer des données Jun 27, 2023 am 10:56 AM

Avec le développement continu d'Internet, une grande quantité de données est stockée sur divers sites Web, ce qui revêt une valeur importante pour les entreprises et la recherche scientifique. Cependant, ces données ne sont pas forcément faciles à obtenir. À ce stade, le robot d’exploration devient un outil très important et efficace, capable d’accéder automatiquement au site Web et de capturer des données. PHP est un langage de programmation interprété populaire. Il est facile à apprendre et possède un code efficace, ce qui le rend adapté à la mise en œuvre de robots d'exploration. Cet article expliquera comment utiliser PHP pour implémenter des robots d'exploration et capturer des données sous les aspects suivants. 1. Principe de fonctionnement du robot

See all articles