新浪微博爬虫设计(Python版)

最近手头上有一个项目,是关于新浪微博的,其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了,不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容,大致有两种方法,一种是用纯爬虫,还有一种是用新浪提供的API。

使用API的话,需要先申请一个新浪的开发帐号,这个过程有一点复杂,最终目的是获得新浪的app_key和app_secret。通过引导用户授权,获得access_token,再调用API。虽然新浪提供的API便于开发者开发,不过其限制也是很大的。首先就是用户必须授权,自从新浪接口升级后,很多接口只有对授权的用户使用才有效,,像friends_timeline,user_timeline这些获取用户微博的,还有很多其他的接口都有这样的限制。除此以外,access_token有所谓的有效期,开发者为5年,而其他人的话,如果授权级别是测试则只有一天,普通则是7天,具体可看官网介绍。也就是说,超过有效期的话就要重新授权,挺麻烦的。除了这些外,其实它对接口访问的频次也是有限制的。就我们这个项目而言,因为要获取的微博信息与地理位置有关,用API的话不太方便。虽然我花了不少时间研究API,不过最终还是放弃了。

最后我决定使用爬虫来做,感谢以下文章给我提供的思路:

这篇文章的作者用的是JAVA语言,不过他给我提供了一个很好的想法。他并未用到模拟登录,用的是代理IP,不过在最新的文章中他也说到,新浪因为进行了升级,所以代理IP不能用了,只能进行模拟登录。于是,我又要感谢以下文章的作者:

他帮我解决了模拟登录的问题,主要是通过模拟登录来保存cookies,这我在之后会介绍。

当然在实际做的过程中还是有不少问题的,像是要通过正则表达式来解析html,坑爹的新浪微博的网页源码中文字是以utf-8的形式出现的,也就是像‘\u4f60\u7684‘的形式出现的,看的时候麻烦的不得了,一度让人情绪失控。具体解析方法我会在之后的文中介绍,同时给出源代码。

顺便说一下,本人的编译环境:Linux,Python 2.7版本。一切的源代码都是在这个环境中测试的,如有不同的系统,或是Python3.X版本的请自行修改。。。

这是v1版本,之后可能会进行修改,也可能会做图形化界面。。。

第一次制作,难免有不足之处,欢迎提出意见。。

文件不多,Main.py:主文件;Matcher.py:解析html;WeiboLogin.py,WeiboEncode.py,WeiboSearch.py:用于模拟登录;还有一个userlists文件存放用户名和密码,这是为了防止新浪的反爬虫功能,之后我会介绍(不过并不完美)

主函数(Main.py):

#!/usr/bin/envpython#-*-coding:utf-8-*-

fromWeiboLoginimportWeiboLoginimportreimporturllib2importMatcher

defmain():urlheader=’’para=raw_input(‘请输入搜索内容:\n’)page=1userlists=open(‘userlists’).readlines()reg1=re.compile(r’\\u4f60\\u7684\\u884c\\u4e3a\\u6709\\u4e9b\\u5f02\\u5e38\\uff0c\\u8bf7\\u8f93\\u5165\\u9a8c\\u8bc1\\u7801\\uff1a’)#你的行为有些异常,请输入验证码reg2=re.compile(r’\\u62b1\\u6b49\\uff0c\\u672a\\u627e\\u5230′)#抱歉,未找到搜索结果foruserlistinuserlists:username=userlist.split()[0]password=userlist.split()[1]weibologin=WeiboLogin(username,password)ifweibologin.Login()==True:print‘登录成功’user=True#帐号可用whilepage<=50anduser:url=urlheader+para+’&page=’+str(page)print‘获取第%d页。。’%pagef=urllib2.urlopen(url)###开始匹配网页内容###forlineinf:ifre.search(r’pid”:”pl_weibo_direct”‘,line):#匹配一定要准确!!ifreg2.search(line):print‘抱歉,未找到结果。。。’returnelse:Matcher.matcher(line)page+=1breakifre.search(r’pid”:”pl_common_sassfilter’,line):ifreg1.search(line):print‘此帐号被锁,使用下一个帐号’user=False#帐号不可用

if__name__==’__main__’:main()

当一个人真正觉悟的一刻,他放弃追寻外在世界的财富,

新浪微博爬虫设计(Python版)

相关文章:

你感兴趣的文章:

标签云: