python- 知乎大规模(34k)用户爬虫

作者:武汉味美食家餐饮管理有限公司 来源:www.cj17917.com 发布时间:2017-09-09 10:19:25
python: 知乎大规模(34k)用户爬虫

前些天学习python,完成了python练习册的大部分习题:https://github.com/Show-Me-the-Code/python(我的github上有习题代码,欢迎自取)。之后看到@salamer的一个python爬虫项目,觉得很不错。于是自己花了4天的时间完成了一个大规模爬取知乎用户信息的爬虫,由于个人网络原因,爬取12小时,获得了34k用户的信息(理论上可以爬全站的信息,可能时间要长一些,最好放在服务器上跑)并整理成直观的图表。

好了,说一下主要的技术点:

(1)使用python的request模块获取html页面,注意要修改自己的cookie,使得我们更像是使用浏览器访问

(2)使用xpath模块从html中提取需要的关键信息(姓名,职业,居住地,关注人等)

(3)使用redis作为队列,很好的解决并发和大规模数据的问题(可以分布式)

(4)使用bfs宽度优先搜索,使得程序得以不断扩展持续搜索用户

(5)数据存储至no-sql数据库:mongodb(高效轻量级并且支持并发)

(6)使用python的进程池模块提高抓取速度

(7)使用csv,pandas,matplotlib模块进行数据处理(需要完善)

接下来我们进行仔细的分析:

(一)数据的获取

主要使用了python的request进行html的获取,另外,header中的cookie携带了我们的登陆信息,所以,按下你的F12将自己的cookie添加至程序中。

知乎上有很多水军,我们为了更加高质量的抓取用户信息,使用了这样一个策略:只抓取每个人的关注者,这样可以相对有效的减少水军和小号。

\

#cookie要自己从浏览器获取 self.header["User-Agent"]="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0" self.cookies="q_c1":"8074ec0c513747b090575cec4a547cbd

使用xpath提取html中我们需要关注的信息,这里给个小例子,关于xpath的用法请自行百度:)

def get_xpath_source(self,source): if source: return source[0] else: return ''
tree=html.fromstring(html_text) self.user_name=self.get_xpath_source(tree.xpath("//a[@class='name']/text()")) self.user_location=self.get_xpath_source(tree.xpath("//span[@class='location item']/@title")) self.user_gender=self.get_xpath_source(tree.xpath("//span[@class='item gender']/i/@class"))

(二)搜索和存储

准备搜索的url队列可能会很大,我们使用redis作为队列来存储,不仅程序退出后不会丢失数据(程序重新运行可以继续上次的搜索),而且支持分布式水平扩展和并发。

核心采用BFS宽度优先搜索来进行扩展,这里不清楚的,恐怕要自己去学习下算法了。存储提供两种方式,一种直接输出至控制台,另一种就是存储至mongodb费关系数据库。

# 核心模块,bfs宽度优先搜索 def BFS_Search(option): global red while True: temp=red.rpop('red_to_spider') if temp==0: print 'empty' break result=Spider(temp,option) result.get_user_data() return "ok"
def store_data_to_mongo(self): new_profile = Zhihu_User_Profile( user_name=self.user_name, user_be_agreed=self.user_be_agreed, user_be_thanked=self.user_be_thanked, user_followees=self.user_followees, user_followers=self.user_followers, user_education_school=self.user_education_school, user_education_subject=self.user_education_subject, user_employment=self.user_employment, user_employment_extra=self.user_employment_extra, user_location=self.user_location, user_gender=self.user_gender, user_info=self.user_info, user_intro=self.user_intro, user_url=self.url ) new_profile.save()
(三)多进程提高效率

python由于GIL锁的原因,多线程并不能达到真正的并行。这里使用python提供的进程池进行多进程操作,这里有一个问题需要大家注意:

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉建网站 https://www.feimao666.com

  • 上一篇:Python核心模块urllib的学习(一)--翻译官方Python文
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 武汉味美食家餐饮管理有限公司 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100