如果我们从一个大V开始,首先可以获取他的个人信息,然后我们获取他的粉丝列表和关注列表,然后遍历列表中的每一个用户,进一步抓取每一个用户的信息还有他们各自的粉丝列表和关注列表,然后再进一步遍历获取到的列表中的每一个用户,进一步抓取他们的信息和关注粉丝列表,循环往复,不断递归,这样就可以做到一爬百,百爬万,万爬百万,通过社交关系自然形成了一个爬取网,这样就可以爬到所有的用户信息了。当然零粉丝零关注的用户就忽略他们吧~如果你缺志同道合的朋友!缺学习Python的氛围!缺入门资料和视频!缺书籍的PDF!缺遇到问题没人解答?那就加这个群:103456743 你想要一起学习的朋友?资料免费提供的学习环境?好比图书馆!不收你一分钱,只为提供一个良好的交流平台!编程贵在多交流!
爬取的信息怎样来获得呢?不用担心,通过分析知乎的请求就可以得到相关接口,通过请求接口就可以拿到用户详细信息和粉丝、关注列表了。
接下来我们开始实战爬取
环境需求
Python3
本项目使用的Python版本是Python3,项目开始之前请确保你已经安装了Python3。
Scrapy
Scrapy是一个强大的爬虫框架,安装方式如下:
pip3 install scrapy
1 | pip3 install scrapy |
尝试最初的爬取
接下来我们什么代码也不修改,执行爬取,运行如下命令:
scrapy crawl zhihu
1 | scrapy crawl zhihu |
爬取流程
接下来我们需要先探寻获取用户详细信息和获取关注列表的接口。
回到网页,打开浏览器的控制台,切换到Network监听模式。
我们首先要做的是寻找一个大V,以轮子哥为例吧,它的个人信息页面网址是:https://www.zhihu.com/people/excited-vczh
首先打开轮子哥的首页
我们观察一下这个请求结构
可以看到有data和paging两个字段,data就是数据,包含20个内容,这些就是用户的基本信息,也就是关注列表的用户信息。
paging里面又有几个字段,is_end表示当前翻页是否结束,next是下一页的链接,所以在判读分页的时候,我们可以先利用is_end判断翻页是否结束,然后再获取next链接,请求下一页。
这样我们的关注列表就可以通过接口获取到了。
接下来我们再看下用户详情接口在哪里,我们将鼠标放到关注列表任意一个头像上面,观察下网络请求,可以发现又会出现一个Ajax请求。
可以看到这次的请求链接为https://www.zhihu.com/api/v4/members/lu-jun-ya-1
后面又一个参数include,include是一些查询参数,与刚才的接口类似,不过这次参数非常全,几乎可以把所有详情获取下来,另外接口的最后是加了用户的用户名,这个其实是url_token,上面的那个接口其实也是,在返回数据中是可以获我们需要先探寻获取用户详细信息和获取关注列表的接口。
回到网页,打开浏览器的控制台,切换到Network监听模式。
我们观察一下这个请求结构
可以看到有data和paging两个字段,data就是数据,包含20个内容,这些就是用户的基本信息,也就是关注列表的用户信息。
paging里面又有几个字段,is_end表示当前翻页是否结束,next是下一页的链接,所以在判读分页的时候,我们可以先利用is_end判断翻页是否结束,然后再获取next链接,请求下一页。
这样我们的关注列表就可以通过接口获取到了。
接下来我们再看下用户详情接口在哪里,我们将鼠标放到关注列表任意一个头像上面,观察下网络请求,可以发现又会出现一个Ajax请求。
可以看到这次的请求链接为https://www.zhihu.com/api/v4/members/lu-jun-ya-1
后面又一个参数include,include是一些查询参数,与刚才的接口类似,不过这次参数非常全,几乎可以把所有详情获取下来,另外接口的最后是加了用户的用户名,这个其实是url_token,上面的那个接口其实也是,在返回数据中是可以获得的。
访问被禁止了,这时我们观察下浏览器请求,发现它相比之前的请求多了一个OAuth请求头。
parse_user
接下来我们处理一下用户基本信息,首先我们查看一下接口信息会返回一些什么数据。
可以看到返回的结果非常全,在这里我们直接声明一个Item全保存下就好了。
在items里新声明一个UserItem
更多的分布式爬虫的实现可以查看自己动手,丰衣足食!Python3网络爬虫实战案例
转载请注明:静觅 » 利用Scrapy爬取知乎用户详细信息并存至MongoDB