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

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

使用API的话,需要先申请一个新浪的开发帐号,这个过程有一点复杂,最终目的是获得新浪的app_key和app_secret。通过引导用户授权,获得access_token,再调用API。虽然新浪提供的API便于开发者开发,不过其限制也是很大的。首先就是用户必须授权,自从新浪接口升级后,很多接口只有对授权的用户使用才有效,像friends_timeline,user_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‘的形式出现的,看的时候麻烦的不得了,一度让人情绪失控。具体解析方法我会在之后的文中介绍,同时给出源代码。


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


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

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


文件不多,Main.py:主文件;Matcher.py:解析html;WeiboLogin.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/’
    para=raw_input(‘请输入搜索内容:\n’)
    page=1
    userlists=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′)#抱歉,未找到搜索结果
    for userlist in userlists:
        username=userlist.split()[0]
        password=userlist.split()[1]
        weibologin=WeiboLogin(username,password)
        if weibologin.Login()==True:
            print ‘登录成功’
            user=True    #帐号可用
        while page<=50 and user:
            url=urlheader+para+’&page=’+str(page)
            print ‘获取第%d页。。’ % page
            f=urllib2.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)
                        page+=1
                        break
                if re.search(r’pid”:”pl_common_sassfilter’,line):
                    if reg1.search(line):
                        print ‘此帐号被锁,使用下一个帐号’
                        user=False    #帐号不可用

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):    reg=r'<em>(.*?)<\\/em>.*?allowForward=1&url=(.*?)&’#先将微博内容全部匹配下来,含url    sub=r’color:red’#子串    reg=re.compile(reg)    reg2=re.compile(‘<.*?>’)#去除其中的<…>    mats=reg.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:#含有子串                    t=reg2.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版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 返回空格_Python面试之 is 和 == 的区别

Python爬虫人工智能学习教程​www.python88.cn面试实习生的时候&#xff0c;当问到 is 和 的区别时&#xff0c;很多同学都答不上来&#xff0c;搞不清两者什么时候返回一致&#xff0c;什么时候返回不一致。本文我们来看一下这两者的区别。我们先来看几个例子&#xff1a;a …

【数据库设计和SQL基础语法】--索引和优化--SQL语句性能调优

一、SQL语句性能调优的基本原则 1.1 确定性能指标 响应时间 SQL语句性能调优的基本原则之一是确定性能指标&#xff0c;而其中最为关键的指标之一就是响应时间。响应时间是衡量数据库系统性能的重要指标&#xff0c;它表示从用户发送一个查询请求到接收到查询结果所经过的时间…

boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域

spring boot: security post数据时&#xff0c;要么关闭crst,要么添加隐藏域 http.csrf().disable();或者&#xff1a; <input name"${_csrf.parameterName}" type"hidden" value"${_csrf.token}">转载于:https://www.cnblogs.com/achengm…

法线有接缝_发送带有接缝的活动邀请

法线有接缝这些天来&#xff0c;我的一位同事在使用带有接缝&#xff08;版本2.x&#xff09;的邮件模板发送事件邀请时遇到了问题。 从根本上讲&#xff0c;这应该不是一项艰巨的任务&#xff0c;因此我将简要说明使用接缝邮件模板发送事件邀请需要做些什么。 发送邮件邀请时&…

LINUX任务(jobs)详解

转自 &#xff1a; http://hi.baidu.com/daweilang/item/58db8d308e54f6d56d15e999LINUX任务(jobs)详解 在用管理员执行一个命令后&#xff0c;用CtrlZ把命令转移到了后台。导致无法退出root的。 输入命令&#xff1a;exit 终端显示&#xff1a;There are stopped jobs. 解决方…

网页爬虫的设计与实现(Java版)

最近为了练手而且对网页爬虫也挺感兴趣&#xff0c;决定自己写一个网页爬虫程序。首先看看爬虫都应该有哪些功能。内容来自&#xff08;http://www.ibm.com/developerworks/cn/java/j-lo-dyse1/index.html?cadrs-&#xff09;网页收集的过程如同图的遍历&#xff0c;其中网页就…

springboot entity date_SpringBoot+JWT实战(附源码)

SpringBoot集成JWT首先我们搭建好SpringBoot框架&#xff0c;SpringBoot环境准备就绪。接下来执行以下操作&#xff1a;1.引入依赖引入JWT依赖,由于是基于Java&#xff0c;所以需要的是java-jwt。<dependency><groupId>com.auth0</groupId><artifactId>…

六、springboot(三)配置双数据源

1、目录结构 2.jdbc.properties配置 #db hougespring.datasource.houge.jdbc-urljdbc:oracle:thin:192.168.0.120:1521:ORCLspring.datasource.houge.usernamehougespring.datasource.houge.passwordmonkeyspring.datasource.houge.driver-class-nameoracle.jdbc.driver.Oracle…

在您的构建过程中添加微基准测试

介绍 作为一个行业&#xff0c;我们正在采用更高的透明度和更可预测的构建过程&#xff0c;以减少构建软件的风险。 持续交付的核心原则之一是通过反馈循环收集反馈。 在Dev9中 &#xff0c;我们采用了与CD原则相一致的“ 先知道 ”原则&#xff0c;这意味着我们&#xff08;开…

【C/C++】Linux下使用system()函数一定要谨慎

曾经的曾经&#xff0c;被system()函数折磨过&#xff0c;之所以这样&#xff0c;是因为对system()函数了解不够深入。只是简单的知道用这个函数执行一个系统命令&#xff0c;这远远不够&#xff0c;它的返回值、它所执行命令的返回值以及命令执行失败原因如何定位&#xff0c;…

定时器和多线程的不同

最近在做项目的时候&#xff0c;遇到了视频采集图像时。使用定时器与或使用多线程有些纠结。原先用了定时器测试了&#xff0c;因为项目需要占用较多的cpu&#xff0c;所以很明显图像显示比较卡。 所以网上查了下。贴出来大家学习学习。 软件定时器和多线程在控制工程中有着非…

华为s8600手机驱动_只有手机才能快充?华为MateBook X的灵巧快充解放你的续航焦虑-华为 ——快科技(驱动之家旗下媒体)-...

充电&#xff0c;永远是数码科技圈必不可少的话题。然而&#xff0c;想要好好给设备充电太并不容易。每次外出&#xff0c;为了防止手机没电&#xff0c;大家的兜里必然要揣着一个大容量的充电宝才安心&#xff0c;这也是手机快充最初诞生的原因。快充技术指的是通过技术手段&a…

linux系统编程之进程(七):system()函数使用

一&#xff0c;system()理解 功能&#xff1a;system()函数调用“/bin/sh -c command”执行特定的命令&#xff0c;阻塞当前进程直到command命令执行完毕 原型&#xff1a; int system(const char *command); 返回值&#xff1a; 如果无法启动shell运行命令&#xff0c;system将…

Scrapy安装介绍

Scrapy安装介绍 一、 Scrapy简介 Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and aut…

数据库常用语句整理

数据库常用语句整理 --查询 select * from emp;--oracle 分页 SELECT * FROM (SELECT rownum AS rnum, e.*FROM emp eWHERE rownum < 10 ) WHERE rnum > 5;--复制表 CREATE TABLE new_table AS SELECT * FROM old_table; 参考资料 https://www.techonthenet.com/sql/tabl…

c语言n次方怎么输入_C语言实现斐波拉契数列

C语言实现斐波拉契数列教程怎么使用 C 语言实现计算斐波拉契数列的第 N 项的值&#xff1f;C语言实现斐波拉契数列详解背景知识斐波那契数列是一组第一位和第二位为 1&#xff0c;从第三位开始&#xff0c;后一位是前两位和的一组递增数列&#xff0c;像这样的&#xff1a;1、1…

junit 测试mvc_Spring MVC控制器JUnit测试

junit 测试mvcJUnit测试Spring MVC控制器并非易事 。 但是最近&#xff0c;一个新项目 &#xff08;即将在Spring推出&#xff09;提供了新的工具来简化此工作。 这篇文章说明了如何通过JUnit测试来测试一个简单的控制器。 该代码是JUnit Testing Spring Service和DAO&#xff…

python中if __name__ == '__main__': 的解析

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ __main__:,现在就来介 绍一下它的作用. 模块是对象&#xff0c;并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块&#xff0c;那么模块__name__ 的…

LuoguP1268树的重量【构造/思维】By cellur925

题目传送门 Description 给你一个矩阵$M$&#xff0c;$M(i,j)$表示$i$到$j$的最短距离。定义树的重量为树上各边权之和&#xff0c;对于任意给出的合法矩阵$M$&#xff0c;已知它所能表示树的重量是唯一确定的。给出一个矩阵&#xff0c;求它所表示的树的重量。 Sol 这道题我想…

pydev插件安装方法

eclipse 版本&#xff1a; PYDEV:附件在本博客资源下载 下载附件后解压缩,将features和plugins个目录复制粘贴到eclipse相对应的目录下面&#xff0c;然后在启动Eclipse&#xff0c;在Help&#xff0d;》check for UPdates&#xff0c;然后弹出的界面即可看到pydev的插件。 …