WordPress一键开启全站SSL,江西威乐建设集团有限公司企业网站,计算机网络培训速成班,新闻资讯建站服务商最近手头上有一个项目#xff0c;是关于新浪微博的#xff0c;其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了#xff0c;不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容…最近手头上有一个项目是关于新浪微博的其中有一环要做新浪微博的爬虫。虽然之前把《Python学习手册》和《Python核心编程》都囫囵吞栆地通读完了不过真正到做项目的时候还是什么都不会。于是在网上找了大量的资料。关于获取新浪微博的内容大致有两种方法一种是用纯爬虫还有一种是用新浪提供的API。
使用API的话需要先申请一个新浪的开发帐号这个过程有一点复杂最终目的是获得新浪的app_key和app_secret。通过引导用户授权获得access_token再调用API。虽然新浪提供的API便于开发者开发不过其限制也是很大的。首先就是用户必须授权自从新浪接口升级后很多接口只有对授权的用户使用才有效像friends_timelineuser_timeline这些获取用户微博的还有很多其他的接口都有这样的限制。除此以外access_token有所谓的有效期开发者为5年而其他人的话如果授权级别是测试则只有一天普通则是7天具体可看官网介绍。也就是说超过有效期的话就要重新授权挺麻烦的。除了这些外其实它对接口访问的频次也是有限制的。就我们这个项目而言因为要获取的微博信息与地理位置有关用API的话不太方便。虽然我花了不少时间研究API不过最终还是放弃了。
最后我决定使用爬虫来做感谢以下文章给我提供的思路
http://blog.csdn.net/codingmirai/article/details/17754645
这篇文章的作者用的是JAVA语言不过他给我提供了一个很好的想法。他并未用到模拟登录用的是代理IP不过在最新的文章中他也说到新浪因为进行了升级所以代理IP不能用了只能进行模拟登录。于是我又要感谢以下文章的作者
http://www.jb51.net/article/44779.htm
他帮我解决了模拟登录的问题主要是通过模拟登录来保存cookies这我在之后会介绍。
当然在实际做的过程中还是有不少问题的像是要通过正则表达式来解析html坑爹的新浪微博的网页源码中文字是以utf-8的形式出现的也就是像‘\u4f60\u7684‘的形式出现的看的时候麻烦的不得了一度让人情绪失控。具体解析方法我会在之后的文中介绍同时给出源代码。 顺便说一下本人的编译环境LinuxPython 2.7版本。一切的源代码都是在这个环境中测试的如有不同的系统或是Python3.X版本的请自行修改。。。 这是v1版本之后可能会进行修改也可能会做图形化界面。。。
第一次制作难免有不足之处欢迎提出意见。。 文件不多Main.py主文件Matcher.py解析htmlWeiboLogin.py,WeiboEncode.py,WeiboSearch.py用于模拟登录还有一个userlists文件存放用户名和密码这是为了防止新浪的反爬虫功能之后我会介绍不过并不完美 主函数Main.py
#!/usr/bin/env python #-*-coding:utf-8-*-
from WeiboLogin import WeiboLogin import re import urllib2 import Matcher
def main(): urlheader’http://s.weibo.com/weibo/’ pararaw_input(‘请输入搜索内容\n’) page1 userlistsopen(‘userlists’).readlines() reg1re.compile(r’\\u4f60\\u7684\\u884c\\u4e3a\\u6709\\u4e9b\\u5f02\\u5e38\\uff0c\\u8bf7\\u8f93\\u5165\\u9a8c\\u8bc1\\u7801\\uff1a’) #你的行为有些异常请输入验证码 reg2re.compile(r’\\u62b1\\u6b49\\uff0c\\u672a\\u627e\\u5230′)#抱歉未找到搜索结果 for userlist in userlists: usernameuserlist.split()[0] passworduserlist.split()[1] weibologinWeiboLogin(username,password) if weibologin.Login()True: print ‘登录成功’ userTrue #帐号可用 while page50 and user: urlurlheaderpara’page’str(page) print ‘获取第%d页。。’ % page furllib2.urlopen(url) ###开始匹配网页内容### for line in f: if re.search(r’pid”:”pl_weibo_direct”‘,line): #匹配一定要准确 if reg2.search(line): print ‘抱歉未找到结果。。。’ return else: Matcher.matcher(line) page1 break if re.search(r’pid”:”pl_common_sassfilter’,line): if reg1.search(line): print ‘此帐号被锁使用下一个帐号’ userFalse #帐号不可用
if __name__’__main__: main() 首先爬取的微博是通过输入关键词搜索到的含指定关键字的微博也就是在http://s.weibo.com这个网站上搜索到的微博。上文的reg1匹配的是“你的行为有些异常请输入验证码”。在这里我要解释一下新浪微博反爬虫功能当一次性搜索过多页面时便会跳出这条信息极限大概是30多页然后便会被这样锁住。我也尝试过使用代理IP来做不过会显示登录次数过多致使无法登录的情况。因此我的办法便是使用多个帐号当某个帐号被锁住时便使用下一个之后再人工去解锁。这并不是一个好方法我也还在尝试其他方法如果有谁有好的方法可以提供给我。
reg2匹配的是没有找到含指定关键词的微博信息。
在网页源代码中含“pid”:”pl_weibo_direct”的一行就是搜索结果所有搜索到的微博都在这一行上之后只要针对这一行进行解析就可以了。如果某一行含有”pid”:”pl_common_sassfilter”则表示出现帐号被锁的情况。 模拟登录
关于这部分可以查看上文的链接或是本人的转载博文
http://liandesinian.blog.51cto.com/7737219/1549692对应此项目 解析网页内容Matcher.py
#!/usr/bin/env python#-*-coding:utf-8-*-
import reimport codecs
def matcher(line): regrem(.*?)\\/em.*?allowForward1url(.*?)’#先将微博内容全部匹配下来,含url subr’color:red’#子串 regre.compile(reg) reg2re.compile(‘.*?’)#去除其中的… matsreg.findall(line) if mats![]: for mat in mats: with codecs.open(‘result.txt’,’a’,encoding’utf-8′) as f:#写入utf-8文件 if mat[0].find(sub)!-1:#含有子串 treg2.sub(”,mat[0])#剔除其中的… f.write(t.decode(‘unicode_escape’).replace(‘\\’,”)’\n’)#去除”\” f.write(u’单条微博信息’) f.write(mat[1].replace(‘\\’,”)’\n\n’) 微博内容在em和\/em之间。首先先将所有的微博内容匹配下来这里面可能包含转载微博而有些转载微博都是不含指定关键词的所以需要剔除。 基本上现在就是这样的当然还有很多不足之处尤其是如何应对新浪的反爬虫功能还需完善。。。 本文出自 “莲的思念” 博客请务必保留此出处http://liandesinian.blog.51cto.com/7737219/1549701
转载请注明「电脑玩物」中文网 » 新浪微博爬虫设计Python版