原创: Smity 合天智汇
推特爬虫爬取用户id和所有tweets(免登录,不使用api)
所有代码都已经发布在github上:
https://github.com/smityliu/spider
这次做的一个项目中涉及人物画像,做人物画像中兴趣属性很关键的一点就是要收集足够多的人物数据,基础工作就是进行爬虫的书写,收集数据集。对于一个社交网络来说,这里最大最实用的数据集合就是用户发布的帖子,因为里面的东西会关联到个人的兴趣爱好,甚至工作生活,从中做主题提取就可以大致的看出来人物在这个社交网络上所体现出来的一个兴趣属性。
经久不衰的话题----白帽子安全条款:不用爬虫爬取个人隐私!
所以我对于社交网络的选择标准:
1.国外社交网络-----推特;
2.只爬取网站上公开发布的用户信息。
由于模拟登录过于频繁还是会被网站封ip和账号,因此就想能不能实现免登录状态下的爬虫,爬取用户数据。
用户id爬取
推特上用来标识用户身份的标志可不是用户名,因为用户名是可以重复的,比如我搜索tolly这个用户,会发现有好多用户名叫tolly的。
但是他们的用户id却是唯一的:
红色框中的就是用户id。即使用户名相同,id也不会相同,那么我们来看一下用户主页:
这里随便找了一个国外小哥的主页,发现其实域名就是twitter.com + 用户id。
因此我们首先要通过爬虫获取到用户id,才能进行下一步的数据爬取:
查询的api接口为:
https://twitter.com/search?f=users&vertical=default&q=smity&src=unkn
q参数输入的就是在你要查询的昵称大致是什么样子,也就是你在搜索框输入的东西。
如果我们直接requests请求这个连接,那么返回的东西就会是一堆带着html标签的文本,很难看。所以我们必须分析用户名在哪种标签里,id在哪种标签里。
上图就是爬取出来的带有很多html标签的文本,我们可以看到用户名是在
我选择的是data-name和span,个人观念是最好不在同一个标签中做正则提取,会有很多意想不到的问题。
因此这个正则这么写:
用户名:
data-name="(.*?) data-protected="false"Id:@(.*?)
所以加入正则以后的爬虫代码为:
import requestsimport reimport sys#查询用户名idurl='https://twitter.com/search?f=users&vertical=default&q='+sys.argv[1]+'&src=unkn'proxies={'http':