最近看了很多爬虫入门的文章,发现大部分都是以知乎作为爬取的对象,所以这次也用知乎爬虫的演示,使用的爬虫框架是用PHP写的Beanbun。项目地址:https://github.com/kiddyuchina/Beanbun这次写的内容是爬取知乎用户。下面详细说明编写爬虫的过程。爬知乎用户的思路比较简单,就是从某个用户开始,先抓取这个用户关注的人和他关注的人,抓到这些人之后,再抓取他们的相关用户。现在知乎可以游客浏览了,注册登录的部分也省略了。先找个大V就行了,因为他们粉丝比较多。我选择了大名鼎鼎的张先生。张先生有13万粉丝。也就是说,如果我们只爬他的粉丝,我们可以有13万。用户数据~在用户页面打开chrome浏览器的开发者选项,点击follower可以看到请求地址和数据。就以此为入口开始爬取吧~这里跳过框架的安装和队列的开启,直接看爬虫的代码:(需要跳过的部分可以看文档)name='zhihu_user';$beanbun->count=5;$beanbun->interval=4;$beanbun->seed='https://www.zhihu.com/api/v4/members/zhang-jia-wei/followers?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=0&limit=20';$beanbun->logFile=__DIR__。'/zhihu_user_access.log';以上是爬虫的配置,同时启动5个进程进行爬取,设置爬取间隔为4秒。在抓取之前,我们还需要设置请求的headers,让网站认为是人,然后浏览他--。标头的内容是从开发人员选项中粘贴的。$beanbun->beforeDownloadPage=function($beanbun){//抓取前设置请求头$beanbun->options['headers']=['Host'=>'www.zhihu.com','Connection'=>'keep-alive','Cache-Control'=>'max-age=0','Upgrade-Insecure-Requests'=>'1','User-Agent'=>'Mozilla/5.0(Macintosh;IntelMacOSX10_12_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/57.0.2987.133Safari/537.36','Accept'=>'application/json,text/plain,*/*','Accept-Encoding'=>'gzip,deflate,sdch,br','授权'=>'oauthc3cef7c66a1843f8b3a9e6a1e3160e20',];};请求数据后,需要保存到数据库中,因为主要是演示,所以只保存User的id,name,follower,following四个数据。//数据库配置Db::$config['zhihu']=['server'=>'127.0.0.1','port'=>'3306','username'=>'xxxx','password'=>'xxxx','database_name'=>'zhihu','charset'=>'utf8',];$beanbun->afterDownloadPage=function($beanbun){//获取的数据为json,先解析$data=json_decode($beanbun->page,true);//如果没有数据或者报错,可能会被阻塞。如果(isset($data['error'])||!isset($data['data'])){$beanbun->queue()->add($beanbun->网址);$beanbun->error();}//如果抓取的不是最后一页,将下一页加入队列if($data['paging']['is_end']==false){$beanbun->queue()->add($数据['分页']['下一个']);}$插入=[];$date=date('Y-m-dH:i:s');foreach($data['data']as$user){//如果follower或follower小于5,则不保存if($user['follower_count']<5||$user['following_count']<5){继续;}$insert[]=['id'=>$user['id'],'name'=>$user['name'],'follower'=>$user['follower_count'],'following'=>$user['following_count'],'created_at'=>$date,];//将用户的关注者和关注者加入队列$beanbun->queue()->add('https://www.zhihu.com/api/v4/members/'.$user['url_token'].'/followers?include=data%5B*%5D.following_count%2Cfollower_count&limit=20&offset=0');$beanbun->queue()->add('https://www.zhihu.com/api/v4/members/'.$user['url_token'].'/followers?include=data%5B*%5D.following_count%2Cfollower_count&limit=20&offset=0');}}if(count($insert)){Db::instance('zhihu')->insert('zhihu_user',$insert);}//将刚刚爬取的地址标记为已爬取$beanbun->queue()->queued($beanbun->queue);};//发现新URL不需要框架,$beanbun->discoverUrl=function(){};$beanbun->开始();接下来在命令行运行爬虫$phpzhihu_user.phpstart然后看一下数据库,源源不断的用户数据已经保存在了~一切顺利的情况下,我稍微努力了一下,减少了爬取间隔为2秒,所以10分钟后,我就被知乎拉黑了。。。这种情况比较常见的解决方法是使用代理,在原有爬虫的基础上,增加一个简单的代理池,可以定期更新。先停止爬虫$phpzhihu_user.phpstop网上有很多免费代理网站。我只是选择了一个提供免费代理的网站,爬取到代理数据后,先请求163,如果成功,就加入代理池。函数getProxies($beanbun){$client=new\GuzzleHttp\Client();$beanbun->proxies=[];$pattern='/
- 12017年智能手表行业回顾!又是一个寒冷的季节,前方的路在哪
- 2苹果和Fitbit既是敌人又是朋友, iPhone 用户喜欢
- 3知乎首场晚会开播,用“答题之夜”解答十年疑问
- 4谢邀!太空人,刚下飞船:中国航天员走进知乎与网友互动
- 5知乎会员与京东PLUS会员达成深度合作,跨境会员成为新趋势吗
- 62011年-2020年是一个什么样的十年?知乎“十年大事”视
- 72020中国独角兽企业品牌CGI榜单发布,快手、知乎、自如等
- 8知乎App 6.0上线,界面更简洁,功能更优化
- 9知乎推出了一款视频创作工具,可以将图片和文字自动生成视频
- 10知乎发布“战疫”数据报告:“新冠肺炎”相关答案阅读量17.3
- 11知乎的“变”与“不变”
- 12知乎2021新知青年大会将于1月13日开幕
- 13融创文化梦城独家代理知乎IP,完全版权,深度挖掘长链价值
- 145亿现金、100亿流量,知乎推出优秀视频答题者扶持计划
- 15知乎推出“职业故事大赛”,获奖作品可出版拍摄电视剧
- 16知乎发布“小蓝星推荐”榜单,为用户提供消费决策参考
- 17知乎发布十年用户数据报告:2.4亿条答案汇聚好奇与新知
- 18知乎“严选会员”一周年付费用户增长4倍
- 19从“谢邀”到“知乎宇宙”,知乎公布近十年十大盘点
- 20知乎李大海与阿里云贾扬清联合直播,AI巨头眼中的行业前景