浅谈利用php爬取和分析知乎用户数据的方法
本文给大家介绍的是利用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))\"?.+>/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))\"?.+>/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视频教程》

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Dengan kemunculan era data dan kepelbagaian volum data dan jenis data, semakin banyak syarikat dan individu perlu mendapatkan dan memproses sejumlah besar data. Pada masa ini, teknologi crawler menjadi kaedah yang sangat berkesan. Artikel ini akan memperkenalkan cara menggunakan perangkak PHP untuk merangkak data besar. 1. Pengenalan kepada crawler: Crawler ialah teknologi yang memperoleh maklumat Internet secara automatik. Prinsipnya adalah untuk mendapatkan dan menghuraikan kandungan laman web secara automatik di Internet dengan menulis program, dan menangkap data yang diperlukan untuk pemprosesan atau penyimpanan. Dalam evolusi program perangkak, ramai yang matang

Dengan perkembangan Internet, jumlah maklumat dalam halaman web semakin besar dan mendalam, dan ramai orang perlu mengekstrak maklumat yang mereka perlukan dengan cepat daripada jumlah data yang besar. Pada masa ini, crawler telah menjadi salah satu alat penting. Artikel ini akan memperkenalkan cara menggunakan PHP untuk menulis perangkak berprestasi tinggi untuk mendapatkan maklumat yang diperlukan dengan cepat dan tepat daripada rangkaian. 1. Fahami prinsip asas crawler Fungsi asas crawler adalah untuk mensimulasikan pelayar untuk mengakses halaman web dan mendapatkan maklumat tertentu. Ia boleh mensimulasikan satu siri operasi yang dilakukan oleh pengguna dalam pelayar web, seperti menghantar permintaan kepada pelayan.

Bermula dengan perangkak PHP: Bagaimana untuk memilih perpustakaan kelas yang betul? Dengan perkembangan pesat Internet, sejumlah besar data bertaburan di pelbagai laman web. Untuk mendapatkan data ini, kami selalunya perlu menggunakan perangkak untuk mengekstrak maklumat daripada halaman web. Sebagai bahasa pembangunan web yang biasa digunakan, PHP juga mempunyai banyak perpustakaan kelas yang sesuai untuk perangkak untuk dipilih. Walau bagaimanapun, terdapat beberapa faktor utama yang perlu dipertimbangkan semasa memilih perpustakaan yang sesuai dengan keperluan projek anda. Kekayaan fungsi: Perpustakaan perangkak yang berbeza menyediakan fungsi yang berbeza. Sesetengah perpustakaan hanya boleh digunakan untuk mengikis web mudah, manakala yang lain

Perangkak web ialah program yang secara automatik merangkak maklumat Internet Ia boleh memperoleh sejumlah besar data dalam tempoh masa yang singkat. Walau bagaimanapun, disebabkan oleh kebolehskalaan dan kecekapan perangkak web, banyak tapak web bimbang mereka mungkin diserang oleh perangkak, jadi mereka telah menggunakan pelbagai strategi anti-rangkak. Antaranya, strategi anti-rangkak biasa untuk perangkak web PHP terutamanya termasuk yang berikut: Sekatan IP Sekatan IP ialah teknologi anti-rangkak yang paling biasa Dengan menyekat akses IP, serangan perangkak berniat jahat boleh dicegah dengan berkesan. Untuk menangani strategi anti-merangkak ini, perangkak web PHP boleh

Pengenalan kepada kemahiran pemprosesan serentak dan berbilang benang perangkak PHP: Dengan perkembangan pesat Internet, sejumlah besar maklumat data disimpan di pelbagai tapak web, dan mendapatkan data ini telah menjadi keperluan dalam banyak senario perniagaan. Sebagai alat untuk mendapatkan maklumat rangkaian secara automatik, perangkak digunakan secara meluas dalam pengumpulan data, enjin carian, analisis pendapat umum dan bidang lain. Artikel ini akan memperkenalkan teknik pemprosesan serentak dan berbilang benang untuk kelas perangkak berasaskan PHP, dan menggambarkan pelaksanaannya melalui contoh kod. 1. Struktur asas kelas reptilia digunakan untuk merealisasikan konkurensi dan pelbagai benang kelas reptilia.

Dengan perkembangan pesat dan popularisasi Internet, semakin banyak data perlu dikumpul dan diproses. Crawler, sebagai alat merangkak web yang biasa digunakan, boleh membantu mengakses, mengumpul dan menyusun data web dengan cepat. Mengikut keperluan yang berbeza, akan terdapat berbilang bahasa untuk melaksanakan perangkak, antaranya PHP juga merupakan bahasa yang popular. Hari ini, kita akan bercakap tentang kaedah pelaksanaan dan langkah berjaga-jaga crawler berdasarkan PHP. 1. Kaedah pelaksanaan perangkak PHP Pemula dinasihatkan untuk menggunakan perpustakaan sedia untuk pemula, anda mungkin perlu mengumpul pengalaman pengekodan dan rangkaian tertentu

Bagaimana untuk menggunakan perangkak PHP untuk mengisi borang dan menyerahkan data secara automatik? Dengan perkembangan Internet, kita semakin perlu mendapatkan data daripada laman web, atau secara automatik mengisi borang dan menyerahkan data. Sebagai bahasa bahagian pelayan yang berkuasa, PHP menyediakan pelbagai alatan dan perpustakaan kelas untuk melaksanakan fungsi ini. Dalam artikel ini, kami akan menerangkan cara menggunakan perangkak dalam PHP untuk mengisi borang dan menyerahkan data secara automatik. Pertama, kita perlu menggunakan perpustakaan curl dalam PHP untuk mendapatkan dan menyerahkan data halaman web. Perpustakaan curl adalah yang berkuasa

Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat industri permainan, ramai pemain telah mula memberi perhatian kepada data permainan. Bagi permainan "StarCraft 2" (selepas ini dirujuk sebagai SC2), data permainannya yang kaya sudah pasti merupakan ciri utama yang menarik ramai pemain. Untuk lebih memahami situasi permainan, ramai pemain ingin menggunakan kemahiran pengaturcaraan untuk mendapatkan data permainan. Artikel ini akan memperkenalkan cara menggunakan bahasa pengaturcaraan PHP untuk melaksanakan proses merangkak data permainan SC2. Rangka halaman web Sebelum kita mula merangkak data permainan SC2, kita perlu terlebih dahulu memahami cara merangkak halaman web. wujud
