项目源码放在我的github上:ZhihuSpider
喜欢的话帮忙点个star呗:-D
总体思路
1.首先是模拟登陆知乎,利用保存登陆的cookie信息
2.抓取知乎页面的html代码,留待下一步继续进行分析提取信息
3.分析提取页面中用户的个性化url,放入redis
(这里特别说明一下redis的思路用法,将提取到的用户的个性化url放入redis的一个名为already_get_user
的hash table
,表示已抓取的用户,对于已抓取过的用户判断是否存在于already_get_user
以去除重复抓取,同时将个性化url放入user_queue
的队列中,需要抓取新用户时pop队列获取新的用户)
4.获取用户的关注列表和粉丝列表,继续插入到redis
5.从redis的user_queue
队列中获取新用户继续重复步骤3
效果图
服务器带宽有限,并且知乎进行了ip封杀,所以这些数据也花了好几天的时间才爬下来
喜欢的朋友帮忙点个star呗♪(^∀^●)ノ ZhihuSpider
模拟登陆知乎
首先是登陆,登陆功能作为一个包封装了在login里面,方便整合调用
header
部分,这里Connection
最好设为close,不然可能会碰到max retireve exceed的错误
原因在于普通的连接是keep-alive
的但是却又没有关闭
|
|
|
|
进入首页查看http状态码来验证是否登陆,200为已经登陆,一般304就是被重定向所以就是没有登陆
|
|
获取验证码的方法。当登录次数太多有可能会要求输入验证码,这里实现这个功能
|
|
获取xsrf,为什么要获取xsrf
呢,因为xsrf
是一种防止跨站攻击的手段,具体介绍可以看这里csrf
在获取到xsrf
之后把xsrf
存入cookie
当中,并且在调用api的时候带上xsrf
作为头部,不然的话知乎会返回403
|
|
这个就是核心的登陆功能啦,非常关键的就是用到了requests
库,非常方便的保存到session
我们这里全局都是用单例模式,统一使用同一个requests.session
对象进行访问功能,保持登录状态的一致性
最后主要调用登陆的代码为
知乎模拟登陆到此就完成啦
知乎用户抓取
|
|
这个是get_user.py
的构造函数,主要功能就是初始化mysql连接、redis连接、验证登陆、生成全局的session对象、导入系统配置、开启多线程。
|
|
这一部分的代码就是用于抓取各个页面的html代码
|
|
用户加入redis的操作,在数据库插入出错时我们调用del_already_user
删除插入出错的用户
|
|
调用知乎的API,获取所有的关注用户列表和粉丝用户列表,递归获取用户
这里需要注意的是头部要记得带上xsrf
不然会抛出403
|
|
最后,到用户的about页面,分析页面元素,利用正则或者beatifulsoup分析抓取页面的数据
这里我们SQL语句用REPLACE INTO
而不用INSERT INTO
,这样可以很好的防止数据重复问题
|
|
最后,入口
|
|
这里就是多线程的开启,需要开启多少个线程就把4换成多少就可以了
感谢阅读^_^!