ホームページ バックエンド開発 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"
ログイン後にコピー

通过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(&#39;/\/people\/([\w-]+)\"/i&#39;, $str, $match_arr);
// 去重合并入新的用户数组,用户进一步抓取
self::$newUserArr = array_unique(array_merge($match_arr[1], self::$newUserArr));
ログイン後にコピー

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

如果需要大量的抓取数据,可以研究下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];
ログイン後にコピー
ログイン後にコピー

在抓取的过程中,有条件的话,一定要通过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 &#39;{print $2}&#39;|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(&#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];
ログイン後にコピー
ログイン後にコピー

推荐学习:《PHP视频教程

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP クローラーを使用してビッグデータをクロールする方法 PHP クローラーを使用してビッグデータをクロールする方法 Jun 14, 2023 pm 12:52 PM

データ時代の到来とデータ量とデータの種類の多様化に伴い、ますます多くの企業や個人が大量のデータを取得して処理する必要があります。このとき、クローラ技術は非常に有効な手段となります。この記事では、PHP クローラーを使用してビッグデータをクロールする方法を紹介します。 1. クローラーの概要 クローラーとは、インターネットの情報を自動的に取得する技術です。原理は、プログラムを作成することによってインターネット上の Web サイトのコンテンツを自動的に取得および解析し、処理または保存に必要なデータをキャプチャすることです。クローラー プログラムの進化の中で、多くのプログラムが成熟しています。

高性能PHPクローラーの実装方法 高性能PHPクローラーの実装方法 Jun 13, 2023 pm 03:22 PM

インターネットの発展に伴い、Web ページの情報量はますます深くなり、多くの人が大量のデータから必要な情報を迅速に抽出する必要があります。現時点では、クローラーは重要なツールの 1 つとなっています。この記事では、PHP を使用して、ネットワークから必要な情報を迅速かつ正確に取得する高性能クローラを作成する方法を紹介します。 1. クローラーの基本原理を理解する クローラーの基本的な機能は、ブラウザーをシミュレートして Web ページにアクセスし、特定の情報を取得することです。サーバーへのリクエスト送信など、ユーザーがWebブラウザ上で実行する一連の操作をシミュレートできます。

PHP クローラーの入門: 適切なクラス ライブラリを選択するには? PHP クローラーの入門: 適切なクラス ライブラリを選択するには? Aug 09, 2023 pm 02:52 PM

PHP クローラーの入門: 適切なクラス ライブラリを選択するには?インターネットの急速な発展に伴い、大量のデータがさまざまな Web サイトに散在しています。このデータを取得するには、多くの場合、クローラーを使用して Web ページから情報を抽出する必要があります。一般的に使用される Web 開発言語として、PHP には、クローラーが選択できるクラス ライブラリも多数あります。ただし、プロジェクトのニーズに合ったライブラリを選択する際には、考慮すべき重要な要素がいくつかあります。豊富な機能: さまざまなクローラ ライブラリがさまざまな機能を提供します。一部のライブラリは単純な Web スクレイピングにのみ使用できますが、その他のライブラリは

PHP Web クローラーの一般的なクロール防止戦略 PHP Web クローラーの一般的なクロール防止戦略 Jun 14, 2023 pm 03:29 PM

Web クローラーとは、インターネットの情報を自動的に巡回するプログラムで、短時間に大量のデータを取得できます。しかし、Web クローラーの拡張性と効率性により、多くの Web サイトはクローラーによる攻撃を受けるのではないかと懸念しており、さまざまなクロール対策戦略を採用しています。その中で、PHP Web クローラーに対する一般的なクロール対策戦略は主に次のとおりです: IP 制限 IP 制限は最も一般的なクロール対策技術であり、IP アクセスを制限することで、悪意のあるクローラー攻撃を効果的に防止できます。このクロール防止戦略に対処するために、PHP Web クローラーは次のことができます。

PHP クローラーの同時実行およびマルチスレッド技術 PHP クローラーの同時実行およびマルチスレッド技術 Aug 08, 2023 pm 02:31 PM

PHP クローラーの同時実行性とマルチスレッド処理スキルの紹介: インターネットの急速な発展に伴い、さまざまな Web サイトに大量のデータ情報が保存され、このデータを取得することが多くのビジネス シナリオで要件になりました。クローラーは、ネットワーク情報を自動的に取得するツールとして、データ収集、検索エンジン、世論分析などの分野で広く利用されています。この記事では、PHP ベースのクローラー クラスの同時実行およびマルチスレッド処理手法を紹介し、コード例を通じてその実装を説明します。 1. Reptile クラスの基本構造は、Reptile クラスの同時実行性とマルチスレッドを実現するために使用されます。

PHPベースのクローラの導入方法と注意点 PHPベースのクローラの導入方法と注意点 Jun 13, 2023 pm 06:21 PM

インターネットの急速な発展と普及に伴い、より多くのデータを収集し、処理する必要があります。クローラーは、一般的に使用される Web クローリング ツールであり、Web データへの迅速なアクセス、収集、整理に役立ちます。さまざまなニーズに応じて、クローラーを実装する言語は複数ありますが、その中でも PHP も人気があります。今回はPHPをベースにしたクローラーの実装方法と注意点についてお話します。 1. PHP クローラーの実装方法 初心者は既製のライブラリを使用することをお勧めします 初心者の場合は、ある程度のコーディング経験とネットワークを積む必要がある場合があります

PHP を使用してクローラーを実装し、データをキャプチャする方法 PHP を使用してクローラーを実装し、データをキャプチャする方法 Jun 27, 2023 am 10:56 AM

インターネットの継続的な発展に伴い、ビジネスや科学研究にとって重要な価値を持つ大量のデータがさまざまな Web サイトに保存されています。しかし、これらのデータは必ずしも簡単に入手できるわけではありません。この時点で、クローラーは Web サイトに自動的にアクセスしてデータをキャプチャできる、非常に重要かつ効果的なツールになります。 PHP は人気のあるインタープリタ型プログラミング言語で、学習が簡単で効率的なコードを備えているため、クローラーの実装に適しています。この記事では、PHP を使用してクローラを実装し、データをキャプチャする方法を次の側面から紹介します。 1. クローラーの動作原理

PHP クローラーを使用してフォームに自動的に入力し、データを送信するにはどうすればよいですか? PHP クローラーを使用してフォームに自動的に入力し、データを送信するにはどうすればよいですか? Aug 08, 2023 pm 12:49 PM

PHP クローラーを使用してフォームに自動的に入力し、データを送信するにはどうすればよいですか?インターネットの発展に伴い、Web ページからデータを取得したり、フォームに自動的に入力してデータを送信したりする必要性がますます高まっています。 PHP は強力なサーバーサイド言語として、これらの機能を実装するための多数のツールとクラス ライブラリを提供します。この記事では、PHP でクローラーを使用してフォームに自動的に入力し、データを送信する方法を説明します。まず、PHP のカール ライブラリを使用して、Web ページ データを取得して送信する必要があります。 CURL ライブラリは強力です

See all articles