一个简单的分布式新浪微博爬虫

Update 2013/6/17:WeiboCrawler之前已经说过不再维护了,现在请大家关注我的新项目——cola。Cola是一个分布式的爬虫框架,支持包括新浪微博(网页版)的抓取。而且目前实验下来,长时间抓取也不会被封锁。项目地址:https://github.com/chineking/cola

由于实验室实验需要,我写了个简单的新浪微博爬虫,来从新浪微博上获取一些实验所需要的数据。现在实验数据抓取部分已经比较稳定,所以我把这些代码放出来,说不定会对一些同学有帮助吧。

至于为什么不用新浪微博API,以及整个分布式爬虫的架构、安装和部署、以及缺陷等等都已经在wiki中进行了解释。

以后,这个程序应该不会再去维护和更新了,但是,我觉得这个程序稍作修改,还是可以适用于其他的特定目标的爬虫的,所以如果有同学需要修改这个项目,可以fork代码,或者联系我成为项目的contributor。

项目地址在BitBucket上——https://bitbucket.org/chineking/weibocrawler

Update(2013/1/21):最新的weibo.cn抓取不了数据了,改动已经提交,请大家pull最新代码。

标签

赞这篇文章

分享到

157个评论

  1. collector

    你好,之前我也写了功能简单的crawler,不过看到你这个,就小巫见大巫了。我有个问题,像你这样取数据的时候,如何设置访问新浪网站的时间,而不至于让新浪封IP呢?再一个,是否可以做个动态代理设置?谢谢。

  2. 秦续业 作者

    访问新浪微博的时间,我是在每两次访问之间插入了一个预设的值,目前默认是40s,还是蛮长的一个时间,在每两次访问之间是小于这个值的一个随机数。因为设置了间隔时间,所以抓取就会很慢,目前还是以爬虫的数量取胜。
    设置代理是个不错的方法。我相信只需要简单修改代码就可以做到。一个crawler获取网页都是通过一个fetcher获取的,因此,只需在一个Fetcher类初始化的时候设置相关的ProxyHandler即可。

  3. collector

    你能给我发份儿WeiboCrawler的一些图(https://bitbucket.org/chineking/weibocrawler/downloads),我这边down不下来。谢谢。

  4. 秦续业 作者

    我也听到有反馈说看不了图。
    我把wiki里的图都上传到我的博客空间里了,现在看wiki应该能看到图了。

  5. collector

    我在单机模式的时候python __init__.py -m sg -t file -l ./ uid的时候,会出现下面这个错误 :
    Traceback (most recent call last):
    File "__init__.py", line 11, in <module>
    from WeiboCrawler.crawler import UserCrawler
    ImportError: No module named WeiboCrawler.crawler

    怎么解决?

    另一个是,-t mongo时,数据存在数据库哪儿的,怎么能取出来呢?

    谢谢。

  6. 秦续业 作者

    主要是由于sys.path中没有添加WeiboCrawler的原因。
    简单的做法是在site-packages中添加(site-packages因系统而异,如果是windows,假设python装在C:\python27,那么就是C:\python27\Lib\site-packages;如果是linux,那么应该是/usr/local/lib/pythonX.X/dist-packages)。

    假设根目录是在/my/path/weibocrawler,下面有intro.py、WeiboCrawler文件夹等等,那么就在site-packages下新建一个WeiboCrawler.pth文件,里面写上路径:/my/path/weibocrawler。

    再次运行命令应该就可以了。

    关于Mongo的问题,当时时间仓促,其实具体存放在哪个数据库应该写在settings里。
    现在在MongoStorage的__init__中可以找到:self.db = self.connection.tfidf,可以看到数据是在“tfidf”这个db里。
    你可以作修改。

  7. collector

    哇,不容易啊,终于让她跑起来了。有几个问题:(环境,一台pc-linux,一个sch, 一个mnt,一个crw)
    1、在crw的输出上有:
    fetch login.
    login success!
    fetch login.
    login success!
    fetch login.
    login success!

    fetch login.
    fetch login.
    login success!
    fetch login.
    login success!
    login success!
    怎么理解?

    2、看你的wiki那个,有个web的console,这个咋配置出来的?

    谢谢。

  8. 秦续业 作者

    1、由于新浪微博最近做了改动,代码也相应做了变化,详见commit:https://bitbucket.org/chineking/weibocrawler/commits/dfe49c470e0a4b7a183f5cb31c8ac9e9

    把代码更新到最新就可以了。

    2、web界面需要在分布式模式下启动Monitor,要安装tornado。(easy_install tornado)

  9. collector

    谢谢你的回复。

    1、已经更新到最新的代码,但还是出现了同样的问题。

    2、已经安装了tornado,没跑出来,是不是还要配置下什么哦?

    3、你wiki里写了kill掉进程或者uers都fetch完才能结束,那个fetch掉所有的用户,是说初始用户及其粉丝?

    谢谢。

  10. 秦续业 作者

    1、settings有设置吗?在WeiboCrawler下的settings.py有配置新浪微博的用户名和密码没?

    2、如果Scheduler、Monitor和WeiboCrawler都是在单机上配置项改动的不多。但是还是看一下在每个下面的settings里有什么没配置的么?

    如果是分布式模式,需要在Scheduler/settings.py里starts_uids里写出是要爬的微博uid。

    Web界面是由Monitor控制的,默认是http://localhost:8888

  11. 秦续业 作者

    还有一个可能是你在登录新浪微博的时候需要输验证码吗?如果要,那肯定是不行的。解决办法是在新浪微博安全设置里添加登录地点。

  12. collector

    还是有之前的那种问题,是这个样子的:
    fetch login.
    fetch login.
    login success!
    login success!
    fetch url: http://weibo.cn/1750628951?vt=4&gsid=3_58a0350433338419b1547e015dc65f3982460df5/info
    fetch url: http://weibo.cn/1750628965?vt=4&gsid=3_58a0350433338419b1547e015dc65f3982460df5/info
    fetch login.
    fetch login.
    login success!
    login success!

    取一会儿数据后,又有一个新问题出来了,我在web console上看到的18个users要fetch,只finished了一个,但是在sch输出:
    timestamp: 1359023739
    Waiting for connection
    Connected from: ('127.0.0.1', 56924)
    sending data: null
    timestamp: 1359023754
    Waiting for connection
    Connected from: ('127.0.0.1', 56934)
    sending data: null
    timestamp: 1359023769
    Waiting for connection
    Connected from: ('127.0.0.1', 56935)
    sending data: null
    timestamp: 1359023784
    Waiting for connection

    crw一直没有输出

  13. collector

    还有个比较郁闷的问题,
    她在跑的时候,在浏览器里输入了,127.0.0.1:1124,然后出来
    Exception in thread Thread-1:
    Traceback (most recent call last):
    File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
    File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
    File "/home/sunxian/workspace/SentiProject/DataCollection/weibocrawler/Scheduler/__init__.py", line 32, in action
    data = json.loads(data)
    File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
    File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

    程序再也不能取数据了,就卡死在那儿了。

  14. dan

    尝试了单机模式,提示错误如下:
    error: argument uids: invalid int value: '273\\Projects\\Web'
    这是什么意思呢?uid参数不对吗?

  15. dan

    uid 参数那里确实输入了用户的UID号(我认为)。UID就是每个用户的单独识别身份的那串数字吧?

  16. 秦续业 作者

    是的,但是从上面的例子看,确实是uid错误。
    把完整输的命令贴出来看看。

  17. dan

    非常多谢。修改了路径,这次的报错是:

    cookielib.LoadError: 'C:\....\WeiboCrawler\cookies.txt' does not look like a Set-Cookie3 (LWP) form at file

    这是为什么呢?

  18. dan

    完整报错代码在这里:
    File "C:\Documents\Program\Python273\lib\_LWPCookieJar.py", line 98, in _reall
    y_load
    raise LoadError(msg)
    cookielib.LoadError: 'C:\\Documents\\Program\\Python273\\Projects\\Crawler\\Weib
    oCrawler\\WeiboCrawler\\cookies.txt' does not look like a Set-Cookie3 (LWP) form
    at file

    多谢!

  19. dan

    File "c:\Documents\Program\Python273\Projects\Crawler\WeiboCrawler\WeiboCrawle
    r\fetcher.py", line 180, in login
    self.fetch_params = urldecode(link['u'])
    KeyError: 'u'

    请问这个错误代码是什么意思呢?

  20. 老刘

    博主你好,我也遇到'/cookies.txt' does not look like a Set-Cookie3 (LWP) format file
    的问题,我的python版本是2.72,tornado2.4.1。删除文件也不行呢

  21. 老刘

    谢谢。之前用单机重新部署了分布式,发现删除了cookies.txt文件可以成功登陆,刚刚开始研究,熟悉后再交流

  22. BinGo

    请教博主一个问题。我需要的功能没有这么复杂。我的任务是每次在“微博搜索”里,不断用不同的关键字搜索,然后抓取搜索结果页面。

    我遇到的问题是,我搜索多次之后经常会遇到要输入验证码。请问博主,有没有办法避免这个验证码?

  23. pingguo

    你好!抓取的时间间隔可以设置吗?在哪儿设?

    才抓了一万多个评论就被封了。郁闷啊

  24. 秦续业 作者

    这个是我的失误,应该在配置文件里面设置的。
    在WeiboCrawler/crawler.py下的Crawler类有个方法_get_random_sec,maximum参数可以修改最大间隔时间,默认是40s。当时我们也会出现被封的情况,但是过段时间会恢复。

  25. 孤独的战神

    您好,我没学过这些东西,但是我也有类似的需求,我想问一下,我安装了setuptools,找不到在哪里,怎么用他来安装pymongo?

  26. 孤独的战神

    恩,easy_install pyquery 会报错,进入到weibocrawler文件夹后,运行命令 python __init__.py -m sg -t file -l e:\WeiboCrawler\data UID
    会提示 python:can't open file '__init__.py': [Errno 2] No such file or directory,请教下怎么解决

  27. 孤独的战神

    好像没有吧,我是跟你的相似的,WeiboCrawler文件夹下面有一个WeiboCrawlerEXE文件夹再下面有一个WeiboCrawler子文件夹,这个文件夹下面存在 __init__.py文件

  28. 孤独的战神

    感谢啦,单机上面我已经跑通了,我想问问,分布式的情况下,是把weiboCrawler项目复制俩份,还是最里面的那个weiboCrawler文件夹复制俩份,你文档里面写的weiboCrawlerIDE是怎么来的? 还有setting.py是重命名为local_setting.py还是setting.py跟local_setting.py都存在,他会默认去找local_setting.py?

  29. 秦续业 作者

    把项目复制两份;我的文档里没提到weiboCrawlerIDE呀;local_settings.py和settings.py都存在,前者中的设置会覆盖后者的。

  30. Winnie

    你好!
    我在尝试跑单机模式 是能够跑通的 这样
    user@CU-CS-VM:~/weibocrawler/WeiboCrawler$ python __init__.py -m sg -t file -l /home/user/weibocrawler/data 1776569733
    fetch url: http://www.weibo.com/u/1776569733
    login success!

    之后是weibo info文件都是空的 是不是因为 __init__.py 的 local 函数没有调用 crawler.run() 呢?
    我刚刚开始看代码 还不是很明白 parser storage crawler 之间的关系 请您大概讲一下
    多谢!

  31. 秦续业 作者

    首先代码这两天做了很小的改动,所以确保更新到最新的代码。

    然后删除WeiboCrawler下的cookies.txt,重新运行,看看是不是还是空的。

    如果为空,那么,看看WeiboCrawler下的crawler.log文件,当中是不是有pyquery的报错。如果是那么就是pyquery的问题。原因是其依赖的一个包过新。
    解决办法:用easy_install卸载cssselect和pyquery。(命令可能是easy_install -m ***,或者easy_install -mxN ***,视其版本而定)
    然后重新安装cssselect为0.7.1版本、pyquery为1.2.1版本:easy_install cssselect==0.7.1,pyquery同。

    至于parser storage crawler的关系,我记得项目wiki中有比较详细的介绍,你先看看那块。

  32. Qi

    博主你好~前几天下载了你写的微博抓取程序,在运行的时候一直抓取不了,crawler端的信息如下:
    fetch url: http://weibo.cn/u/1728468643
    login success!
    start to fetch 1728468643's fans
    fetch url: http://weibo.cn/1728468643/fans
    fetch url: http://weibo.cn/u/1728468643
    fetch url: http://weibo.cn/sinaurl
    start to fetch 1728468643's info
    fetch url: http://weibo.cn/1728468643/info
    start to fetch 1728468643's weibo
    fetch url: http://weibo.cn/u/1728468643
    login success!
    fetch url: http://weibo.cn/u/1728468643?page=2&vt=4&gsid=3_5bc7d744f6d8be1c25ed
    96ed71000503c89e9f0d001d87&st=0771
    fetch url: http://weibo.cn/sinaurl
    login success!
    ------------------------
    Schedule端信息:
    Waiting for connection
    Connected from: ('127.0.0.1', 1052)
    sending data: {"is_uid": true, "user": "1728468643"}
    timestamp: 1366253614
    Waiting for connection
    Connected from: ('127.0.0.1', 1062)
    sending data: {"is_uid": true, "user": "1728468643"}
    timestamp: 1366253615
    Waiting for connection
    Connected from: ('127.0.0.1', 1070)
    sending data: {"is_uid": false, "follow": "1728468643", "user": "sinaurl", "cra
    wled": false}
    timestamp: 1366253616
    Waiting for connection

    -------------------------
    烦请博主帮忙看看这是什么原因呢?太感谢了~~~~

  33. Qi

    楼主太及时了~多谢多谢~试了一下,能抓取,但比较奇怪的是很快就停了,info.txt和users.txt都是空的,weibos.txt只抓取了网页中一页的微博,completes.txt里面只有一个uid。我一共设置了2个uid,每个文件夹下都是上述情况。

  34. Qi

    前两天下载的,对比了一下应该是最新的,看了上面你给别人回复的说明,我的crawler.log里没有pyquery的报错。里面的信息是这样的:
    2013-04-18 13:43:13,967 - crawler.__init__.38 - INFO - fetch user: 1563926367
    2013-04-18 13:43:14,319 - crawler.__init__.38 - INFO - fetch user: 2234552124

    命令行里的信息是这样的:
    >python c:\weibocrawler\WeiboCrawler\__init__.py -m sg -t file -l
    c:\data 2234552124 1563926367
    login success!
    fetch url: http://weibo.cn/u/1563926367
    start to fetch 1563926367's info
    fetch url: fetch url: http://weibo.cn/u/2234552124
    http://weibo.cn/1563926367/info
    start to fetch 1563926367's weibo
    fetch url: http://weibo.cn/u/1563926367
    fetch url: http://weibo.cn/u/1563926367?page=2&vt=4&gsid=3_5bc7d744f6d8be1c25ed
    96ed71000503c89e9f0d001d87&st=0771
    start to fetch 2234552124's info
    fetch url: http://weibo.cn/2234552124/info
    start to fetch 2234552124's weibo
    fetch url: http://weibo.cn/u/2234552124
    fetch url: http://weibo.cn/u/2234552124?page=2&vt=4&gsid=3_5bc7d744f6d8be1c25ed
    96ed71000503c89e9f0d001d87&st=0771

  35. 秦续业 作者

    最新的回复里看起来已经是在爬了啊,你看看文件夹里是不是还是空。
    下次抓取前把数据文件、还有cookies.txt都删除了看看还能不能抓取。

  36. Qi

    恩~是在爬,可是只爬第一页就断开了,info.txt和users.txt也还都是空的,weibos.txt里面有8条数据。。。哎。。。好奇怪。。。

  37. 秦续业 作者

    我知道原因了。还是因为登录的问题。实际上没有登录成功(因为登录成功一次是能取到20条微博的,且查看用户的info等等都需要登录才取得到)。

    确保用户名和密码正确,配置文件里写的是用户名和密码,前者不是UID。其次,检查你的帐号登录是否需要验证码,如果需要,那就去掉验证码登录(通过添加登录地点解决)。
    先看看以上方法是否可行。

  38. Qi

    果然是没有登录上的原因,我换了一个账号,这次可以了!!多谢博主~~~
    又试了一下分布式的,起初不行,后来第三次又可以了~

  39. pdr

    你跑成功了啊,我遇到个问题: Please check the account and password in local settings or ensure your login need no validate code!意思应该是需要验证码,楼主说可以通过添加登陆地点解决,想问下怎么回事

  40. morige1201

    博主你好,前几天下载了你写的微博抓取程序,在运行的时候一直抓取不了,单机模式运行出错
    问题如下:
    2013-05-02 15:36:50,551 - crawler.__init__.38 - INFO - fetch user: 2786260755
    2013-05-02 15:37:14,637 - crawler.run.214 - INFO - error when crawl: 2786260755
    2013-05-02 15:37:14,638 - log.exception.22 - ERROR - 'XPathExpr' object has no attribute 'add_post_condition'
    请问这是什么错误?

  41. 秦续业 作者

    还是pyquery的问题,pyquery使用了cssselect包,但是cssselect包过新会导致pyquery出错。

    解决办法:用easy_install卸载cssselect和pyquery。(命令可能是easy_install -m ***,或者easy_install -mxN ***,视其版本而定)
    然后重新安装cssselect为0.7.1版本、pyquery为1.2.1版本:easy_install cssselect==0.7.1,pyquery同。

    最后删除掉WeiboCrawler文件夹下的cookies.txt,以及抓取的目标文件夹下所有内容。重新运行看看是否可以。

  42. 啊咔

    博主你好,我运行单机file模式调通了爬下来的数据是空的,试了两个UID 结果weibo user info 三个TXT都是空的,只有ERROR或complete文档中有个UID号,能告诉我为什么会这样么

  43. 啊咔

    谢谢已经参照Q&A重新装了pyquery和cssselect,weibo信息已经可以获取,但是user仍然为空正常么

  44. hahazhu

    能否介绍下mongodb的安装配置?我目前在使用分布式爬虫时,运行python intro.py sch 就显示 waiting for connection,卡死在这里了.

  45. 炎龙

    请教,cola 下测试weibo功能,为何显示urlError (Temporary failure in name resolution)?

  46. 炎龙

    是的,我确定uid是正确的,看错误是由依赖包中出来的,也就是对URL的解析判断上认为URL有问题。我进代码跟了一下,就在job启动run()函数执行时,出的问题。这个内部我不清楚有什么问题。

  47. HOPEver

    楼主你好,我在单机下运行,但是一直提示"cola.worker.loader.JobWorkerRunning: There has been a running job worker.",然后我掉用"python stop.py"命令,结果提示"cannot connect to single running worker",不知道为什么,是配置的问题吗?

  48. 秦续业 作者

    之前已经非法退出了,再stop肯定不存在。
    可以尝试删除掉项目目录下data下东西,然后再运行试试。

  49. HOPEver

    楼主你好,这个爬虫爬微博内容时候的url比较奇怪,不是我们平常刷微博时的url,而且通过这个url可以把当前页面的所有微博都可以得到,包括底部动态加载的内容,请问楼主是怎么得到这个url的表示方式的?我们现在试图想爬其他内容,因为有滑动到底部动态加载的内容而无法获得全部的数据,请问如何解决?

  50. HOPEver

    'http://weibo.com/aj/mblog/mbloglist?uid=%s&_k=%s' % (self.uid, start),就是这个url,请问楼主如何获得这种表示方式的。这种url得到的不是具体页面,而是源代码,不知何故。

  51. 秦续业 作者

    这个URL是通过分析AJAX得到的,chrome调试可以看到。

    而如果你看过微博的源代码,就会发现内容不是写在HTML中的,而是写在JS中。所以即便打开原文件,还是要分析JS代码。

  52. HOPEver

    谢谢楼主!另外还想请教一个问题,为什么程序每次都是跑得好好的就进行不下去了或者自己终止退出了呢?

  53. lijun

    我想的是,
    1.如果clawers宕掉了,其上的工作会丢丢失麽
    2.如果scheduler宕掉了,是不是整个集群都会瘫痪,有没有热切换之类的功能
    3.scheduler能保证clawer的负载均衡麽

  54. 好人平安

    楼主你好!
    在单机模式下运行最近的代码,为什么会出现这个错误!
    File "__init__.py", line 30, in <module>
    from parsers import MicroBlogParser, ForwardCommentLikeParser,\
    File "/home/zhengweiwei/cola/contrib/weibo/parsers.py", line 37, in <module>
    from storage import DoesNotExist, Q, WeiboUser, Friend,\
    File "/home/zhengweiwei/cola/contrib/weibo/storage.py", line 25, in <module>
    from conf import mongo_host, mongo_port, db_name, shard_key
    File "/home/zhengweiwei/cola/contrib/weibo/conf.py", line 39, in <module>
    shard_key = user_config.job.mongo.shard_key
    AttributeError: 'PropertyObject' object has no attribute 'shard_key'

  55. beanmoon

    由于我也想做一个个人博客,想问下博主,你的网站是托管在什么上面的,一年托管费多少?

  56. line

    楼主你好!
    是不是近期新浪微博的源码有改动?为什么之前都能够正常抓取的东西,现在运行的时候就会出现一些错误?

  57. fanneee

    楼主你好,运行新浪微博单机版时,出现如下错误,还请楼主不吝赐教。
    Error when fetch url: http://weibo.com/1651972952/follow
    Error when get bundle: 1651972952
    'NoneType' object has no attribute 'find'
    Traceback (most recent call last):
    File "E:\cola-master\cola-master\contrib\weibo\cola\worker\loader.py", line 20
    2, in _execute_bundle
    next_urls, bundles = parser_cls(opener, url, bundle=bundle, logger=self.logg
    er, **options).parse()
    File "E:\cola-master\cola-master\contrib\weibo\parsers.py", line 541, in parse

    return self._error(url, e)
    File "E:\cola-master\cola-master\contrib\weibo\parsers.py", line 87, in _error

    raise e
    AttributeError: 'NoneType' object has no attribute 'find'

  58. fanneee

    楼主你好,我运行了单机版的新浪微博出现如下错误
    Error when fetch url: http://weibo.com/1651972952/follow
    Error when get bundle: 1651972952
    'NoneType' object has no attribute 'find'
    Traceback (most recent call last):
    File "E:\cola-master\cola-master\contrib\weibo\cola\worker\loader.py", line 20
    2, in _execute_bundle
    next_urls, bundles = parser_cls(opener, url, bundle=bundle, logger=self.logg
    er, **options).parse()
    File "E:\cola-master\cola-master\contrib\weibo\parsers.py", line 541, in parse

    return self._error(url, e)
    File "E:\cola-master\cola-master\contrib\weibo\parsers.py", line 87, in _error

    raise e
    AttributeError: 'NoneType' object has no attribute 'find'
    我的配置
    job:
    db: sina
    mode: bundle # also can be `bundle`
    size: 100 # the destination (including bundle or url) size
    limit: 0 # 0 means no restrictions, if greater than 0, means webpages opened per minute.
    master_port: 12104
    port: 12105
    instances: 2
    mongo:
    host: localhost
    port: 27017
    login:
    - username: fanneee@163.com
    password: 2546162
    starts:
    - uid: 3211200050
    - uid: 1898353550
    fetch:
    forward: no
    comment: no
    like: no

  59. lee

    Traceback (most recent call last):
    File "I:\cola-master\contrib\weibo\__init__.py", line 58, in <module>
    load_job(os.path.dirname(os.path.abspath(__file__)))
    File "I:\cola-master\cola\worker\loader.py", line 446, in load_job
    with StandaloneWorkerJobLoader(job, root, force=force) as job_loader:
    File "I:\cola-master\cola\worker\loader.py", line 329, in __init__
    local=local, nodes=nodes, copies=copies, force=force)
    File "I:\cola-master\cola\worker\loader.py", line 83, in __init__
    self.check()
    File "I:\cola-master\cola\worker\loader.py", line 131, in check
    raise JobWorkerRunning('There has been a running job worker.')
    cola.worker.loader.JobWorkerRunning: There has been a running job worker.
    [Finished in 0.4s with exit code 1]

    博主你好 我运行单机模式时出现上述 问题。
    代码成功运行过一次 但STOP后 再运行就出现如上错误。能帮忙分析下问题么?
    新人提问 还请楼主赐教。

  60. ypengh

    你好,还想问为什么在单机模式下运行只有保存的用户的id,而其它信息没有。
    另外,在运行的时候有抛出以下异常
    Error when fetch url: http://weibo.com/2314239521/follow
    Error when get bundle: 2314239521
    No JSON object could be decoded
    Traceback (most recent call last):
    File "/home/chenshunhua/Program Files/crawler/cola-master/cola/worker/loader.py", line 206, in _execute_bundle
    **options).parse()
    File "/home/chenshunhua/Program Files/crawler/cola-master/contrib/weibo/parsers.py", line 520, in parse
    return self._error(url, e)
    File "/home/chenshunhua/Program Files/crawler/cola-master/contrib/weibo/parsers.py", line 87, in _error
    raise e
    ValueError: No JSON object could be decoded

  61. line

    楼主你好,代码更新到最新还是会出现更新之前的问题.只能解析公共主页的微博信息,不能解析个人的! 麻烦楼主再看看什么问题?

  62. fiance

    执行 python intro.py crw 后,出现

    File "intro.py", line 28, in <module>
    import WeiboCrawler
    File "/home/me/WeiboCrawler/WeiboCrawler/__init__.py", line 11, in <module>
    from WeiboCrawler.crawler import UserCrawler
    File "/home/me/WeiboCrawler/WeiboCrawler/crawler.py", line 16, in <module>
    from WeiboCrawler.parser import CnWeiboParser, CnInfoParser, CnRelationshipParser,\
    File "/home/me/WeiboCrawler/WeiboCrawler/parser.py", line 15, in <module>
    from pyquery import PyQuery as pq
    File "/usr/lib/python2.7/site-packages/pyquery/__init__.py", line 10, in <module>
    from pyquery import PyQuery
    File "/usr/lib/python2.7/site-packages/pyquery/pyquery.py", line 6, in <module>
    from cssselectpatch import selector_to_xpath
    File "/usr/lib/python2.7/site-packages/pyquery/cssselectpatch.py", line 6, in <module>
    from lxml.cssselect import Pseudo, XPathExpr, XPathExprOr, Function, css_to_xpath, Element
    ImportError: cannot import name Pseudo

    在网上没有搜出最后一样的问题,请问这是一类什么问题,如何解决呢?谢谢。

  63. yjf


    F:\pythonLearning\cola-master\cola\core\opener.py:74: UserWarning: gzip transfer
    encoding is experimental!
    self.browser.set_handle_gzip(True)
    start to get None
    start to get None

    这是怎么回事啊? 为什么全是None?

  64. pdr

    Please check the account and password in local settings or ensure your login need no validate code! 想问一下如何解决验证码问题

  65. JiaoyanChen

    博主,好,非常感谢你的工作。
    但是我在fedora/centos下面运行colar的时,出现下面错误:
    [root@localhost weibo]# python __init__.py
    Traceback (most recent call last):
    File "__init__.py", line 58, in <module>
    load_job(os.path.dirname(os.path.abspath(__file__)))
    File "/home/jychen/weibo/cola-master/cola/worker/loader.py", line 446, in load_job
    with StandaloneWorkerJobLoader(job, root, force=force) as job_loader:
    File "/home/jychen/weibo/cola-master/cola/worker/loader.py", line 329, in __init__
    local=local, nodes=nodes, copies=copies, force=force)
    File "/home/jychen/weibo/cola-master/cola/worker/loader.py", line 83, in __init__
    self.check()
    File "/home/jychen/weibo/cola-master/cola/worker/loader.py", line 131, in check
    raise JobWorkerRunning('There has been a running job worker.')
    cola.worker.loader.JobWorkerRunning: There has been a running job worker.

    上面也有评论提到了这个问题,为什么程序会一直提示有一个jor worker?
    谢谢。

  66. winner24

    您好,我最近在做一个研究,需要微博中用户的转发关系图,找出找出某个消息的传播有向图G(V, E),请问运用这个能实现吗?

  67. winner24

    不好意思,我是刚解除爬虫这东西,请问实现功能的话,需要哪些配置啊?一台win7的电脑可以实现吗?

  68. 连理枝

    在win7下可以正常运行,但在winxp下抓取微博数据跑不起来,出现如下错误,cola.pth已经设置。

    Traceback (most recent call last):
    File "C:\to\path\cola\contrib\weibo\__init__.py", line 25, in <module>
    from cola.core.opener import MechanizeOpener
    ImportError: No module named cola.core.opener

  69. 秦续业 作者

    还是Python path的问题,首先还是检查pth里路径是不是对的,确保无误,你也可以尝试添加PYTHONPAH的环境变量,在里面添加路径。

  70. 连理枝

    C:\Documents and Settings\Administrator>mongoexport -d sina -c weibo_user --csv
    -f uid,nickname -o user_csv.dat
    connected to: 127.0.0.1
    exported 46 records

    打开user_csv.dat
    uid,nickname
    "1898353550",
    "3211200050",
    "1644870363",
    "1701018393",
    "2696532643",
    "1906330975",
    "3301384190",
    "1614282004",
    "2887339314",
    "1834459124",
    "1746173800",
    "1981622273",
    "1400220917",
    "1804559491",
    "1751927860",
    "1908349515",
    "2615392497",
    "2524468112",
    "3283884397",
    "1406320502",
    "1056882083",
    "2068093955",
    "1930559805",
    "1894238970",
    "1784501333",
    "1405342165",
    "3176533207",
    "3201338905",
    "2472928247",
    "2314239521",
    "1612466092",
    "1180498610",
    "1648485800",
    "2812877242",
    "1907736941",
    "1898592875",
    "1064846025",
    "3147625027",
    "2388714105",
    "1652087901",
    "1915508822",
    "1808008002",
    "1117967813",
    "1687508662",
    "1701886454",
    "1889019865",

    (1)使用db.weibo_user.find()可以看到有很多数据,但导出来的user_csv.dat中怎么会只有46条数据
    (2)怎么只有uid的数据,nickname的数据就是出不来
    兄台帮我看下,哪里错了,谢谢。

  71. 秦续业 作者

    之前我一直用mongodump,查了一下,原来dump工具只能导出json格式,而mongoexport可以导出csv格式。

    这里的field选项指定错了,nickname是嵌套在info里的,所以-f应该是:uid,info.nickname。但是我测试了一下,还是导不出数据,而我换成uid,info.avatar却是对的。

    查了一下,据说mongoexport兼容性不是很好,对某些数据类型可能不兼容。

    我还是推荐用dump工具导出成json格式,否则需要自己写个程序来导出成csv。

  72. 连理枝

    兄台,我分析了一下抓取下来的数据,现在只能看到_id,mid,uid,content,created,n_likes,likes,n_forwards,forwards,n_comments,comments,我如何才能得到哪些用户点赞了、哪些用户转发了,哪些用户评论了呢?

    ......\weibo\_init_.py需要怎样修改才能实现上述要求。还是已经实现了,只是我没发现。

  73. 秦续业 作者

    likes,forwards和comments里面应该是谁点赞、转发和评论的数据。但是实际上,默认是不抓取这些数据的(所以默认是空的),需要在配置里打开,fetch里的三个选项分别是开关。

    不过我需要提醒,打开这些开关后抓取的速度会明显变慢,原因是需要额外访问很多页面。

  74. 连理枝

    兄台,我把fetch中的三个选项yes后,速度依然很快,但在采集到的23488项记录中,只采集到少数几个likes和forwards和comments,99%的都是[](是不是因为140字的限制?),如下所示:

    _id:ObjectID(52bd3bf21e489118fcdd3b53)
    mid:3619507392363600
    uid:1406320502
    content:好人长命,祝开复老师早日恢复健康!
    created:2013-09-06T12:21:00Z
    n_likes:114920
    likes:[]
    n_forwards:10
    forwards:[]
    n_comments:3
    comments:[]

    还有,如何在likes,forwads,comments中只抓取相关的uid数据。谢谢您

  75. 秦续业 作者

    大部分没有是不是因为大部分数据是先前没有开启这三个选项时抓取到的?打开这三个选项后有没有什么报错情况?

    要只抓取uid,需要改代码,contrib/weibo/parsers.py下类ForwardCommentLikeParser中parse函数里,调用set_instance的地方注释掉,还有like.avatar=**这行也注释掉应该就可以了。

  76. 连理枝

    兄台,在你的帮助下,我已经能抓到一个微博有哪些人转发,但怎么能获知该条微博的转发路径。即:话题A由用户0发起,用户1都对用户0的话题A进行了转发,用户2也关注话题A,但其没有直接转发用户0而是转发了用户1,用户3没有直接转发用户0而是转发了用户2, 那这样获得的转发路径为用户0->用户1->用户2->用户3.....。
    从目前抓到的数据(_id,mid,uid,content,created,n_likes,likes,n_forwards,forwards, n_comments,comments)中可以看出来吗?

    本人表述啰嗦了。

  77. cmf

    好像python下有个工具是scrapy,请教下为什么不基于scrapy做开发的考量是什么呢?

  78. 秦续业 作者

    做的时候压根没看scrapy,scrapy主要还是针对单机的。
    后面的改进会吸收scrapy中比较不错的设计。

  79. Linus

    单机模式下,运行一段时间后,mongodb中的数据总数一直是这样。
    > db.weibo_user.count()
    108
    > db.micro_blog.count()
    136162

    控制台最后出现以下信息:
    get 2688036242 url: http://weibo.com/2688036242/follow
    Error when fetch url: http://weibo.com/2688036242/follow
    Error when get bundle: 2688036242
    HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
    The last 30x error message was:
    Moved Temporarily
    Traceback (most recent call last):
    File "/Users/linus/Documents/cola-master/cola/worker/loader.py", line 229, in _execute_bundle
    **options).parse()
    File "/Users/linus/Documents/cola-master/contrib/weibo/parsers.py", line 512, in parse
    return self._error(url, e)
    File "/Users/linus/Documents/cola-master/contrib/weibo/parsers.py", line 91, in _error
    raise e
    httperror_seek_wrapper: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
    The last 30x error message was:
    Moved Temporarily
    Finish 2688036242
    start to get 1889511787
    Finish visiting pages count: 96
    Finish visiting pages count: 96
    然后程序就终结了,这个是怎么回事?望指导

  80. 南京南京

    您好 我在使用您的cola程序 我这里有500个人的id 我只想抓取这500人的数据 请问该怎样使用或者改动cola呢 是在weibo.yaml的starts 变量里把500个id全写上么

  81. 秦续业 作者

    可能是你之前已经抓过了,因此会接着上次的抓取继续进行。可以删除cola下的data文件夹,然后再运行试试。

  82. 南京南京

    谢谢 删掉data文件夹后正常

    limit限制为500 instance为2 的时候不到五分钟程序就停了 登陆新浪正常 看网页需要加验证码 请问单机的话一般把limit和instance设为多少合适

  83. 秦续业 作者

    现在都有验证码了?以前我limit一直设的0,感觉不会被卡住的。

    我回头再看看是什么情况。

    另外,要抓取回复,把配置文件里有个fetch/comment设为yes即可。

  84. 南京南京

    您好 还有一个问题打扰您

    如果要抓取回复的数据的话应该怎样改动呢
    需要记录被回复人uid 回复人uid

  85. linjinjin7

    你好!我是菜鸟一枚~~在用你的代码单机模拟时,反复出现以下问题:
    D:\SinaWbCrawler\WeiboCrawler>python __init__.py -m sg -t file -l D:\SinaWbCrawler\data 2669291357
    Traceback (most recent call last):
    File "__init__.py", line 239, in <module>
    main(is_dc=is_dc, db=db, folder=folder, uids=uids)
    File "__init__.py", line 213, in main
    local(*args, **kwargs)
    File "__init__.py", line 169, in local
    fetcher.login(cookie_filename=cookie_file)
    File "D:\SinaWbCrawler\WeiboCrawler\fetcher.py", line 184, in login
    self.fetch_params = urldecode(link['u'])
    KeyError: 'u'
    请问是什么原因哦?谢谢不吝赐教!

  86. linjinjin7

    File "D:\SinaWbCrawler\WeiboCrawler\fetcher.py", line 184, in login
    self.fetch_params = urldecode(link['u'])
    KeyError: 'u'
    我看这个问题上面也有人出现过,不知道后来是如何解决的?谢谢赐教啦~~

  87. 秦续业 作者

    抱歉之前太忙了,今天才回复。这个WeiboCrawler我已经停止维护了,这个问题可能是新浪修改登录方式导致的。

  88. 秦续业 作者

    这个项目停止维护,但是现在有更通用的框架,可以完成这个项目的工作。
    https://github.com/chineking/cola

  89. 毛毛

    您好,我遇到了cookielib.LoadError: 'cookies.txt' does not look like a Netscape format cookies file
    请教一下您。

  90. Emos

    我的重点在获得新浪微博的数据,没有用过Python,不知道github上软件包下下来怎么用啊,作者能不能来个详细的步骤嘛

  91. gary

    楼主,你好,新版cola的配置文件是否有个说明文档,很多项不知道怎么配置。
    另外,我在跑col-develop的没有抓到微薄数据,但是应是抓到两条关注的数据,然后程序就会一直报no budget left to process,最后退出,是什么原因?

  92. 秦续业 作者

    基本上按默认配置来。

    把除了用户密码的配置贴出来,并贴出来打印出来的信息,看看当中有没有报错信息。

  93. gary

    谢谢楼主回复,

    配置信息如下:
    job:
    db: sina
    mode: bundle # also can be `bundle`
    size: 100 # the destination (including bundle or url) size
    speed:
    max: -1 # to the cluster, -1 means no restrictions, if greater than 0, means webpages opened per minute
    single: -1 # max restrictions to a single instance
    adaptive: no
    instances: 5
    priorities: 3 # priorities queue count in mq
    copies: 1 # redundant size of objects in mq
    inc: yes
    shuffle: no # only work in bundle mode, means the urls in a bundle will shuffle before fetching
    error:
    network:
    retries: -1 # 0 means no retry, -1 means keeping on trying
    span: 20 # seconds span to retry
    ignore: no # only work under bundle mode, if True will ignore this url and move to the next after several tries, or move to the next bundle
    server: # like 404 or 500 error returned by server
    retries: 5
    span: 10
    ignore: no
    components:
    deduper:
    cls: cola.core.dedup.FileBloomFilterDeduper
    mongo:
    host: localhost
    port: 27017
    login:
    - username:
    password:
    starts:
    - uid: 3211200050
    - uid: 1898353550
    fetch:
    forward: yes
    comment: no
    like: no
    clear: no


    控制台日志信息如下:


    D:\workspace\cola-develop\cola\core\opener.py:108: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    start to process priority: 0
    D:\workspace\cola-develop\cola\core\opener.py:108: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    start to process priority: 0
    start to process priority: 0
    no budget left to process
    no budget left to process
    no budget left to process
    D:\workspace\cola-develop\cola\core\opener.py:108: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    start to process priority: 0
    no budget left to process
    D:\workspace\cola-develop\cola\core\opener.py:108: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    start to process priority: 0
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    start to process priority: 1
    no budget left to process
    no budget left to process
    start to process priority: 1
    no budget left to process
    no budget left to process
    start to process priority: 1
    no budget left to process
    no budget left to process
    start to process priority: 1
    no budget left to process
    no budget left to process
    start to process priority: 1
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    start to process priority: 2
    no budget left to process
    no budget left to process
    start to process priority: 2
    no budget left to process
    no budget left to process
    start to process priority: 2
    no budget left to process
    no budget left to process
    start to process priority: 2
    no budget left to process
    no budget left to process
    start to process priority: 2
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    no budget left to process
    start to process priority: inc
    no budget left to process
    start to process priority: inc
    no budget left to process
    no budget left to process
    no budget left to process
    start to process priority: inc
    no budget left to process
    no budget left to process
    start to process priority: inc
    no budget left to process
    no budget left to process
    start to process priority: inc
    no budget left to process
    no budget left to process
    。。。。。。
    。。。。。。
    。。。。。。 (省略掉)
    no budget left to process
    no budget left to process
    No bundle or url to perform, try to finish job
    Counters during running:
    {}
    Processing shutting down
    Shutdown finished
    Job id:8ZcGfAqHmzc finished, spend 269.84 seconds for running

  94. gary

    楼主,设置成clear之后,应该可以了,但是貌似一直都在抓follow,没有抓微薄的数据?是先抓用户然后再抓所有用户的微薄吗?还是我的配置有问题?
    另外,如果方便,请楼主加下我的qq:43400575

    十分感谢你的帮助。

  95. gary

    1.我下了develop最新的代码,就一直会抓follow的数据,不抓取微薄的数据。抓取的url:http://weibo.com/3211200050/follow?page=31。

    2.http://weibo.com/$uid/follow?page这个url变更page的值是无效的,查询的都是一样的用户。而且page值应该会超过关注的用户的总数,比如微薄上一共是10页,但是page值会到30

    3. 我能否直接跑master的代码?master也应该是支持单机的吧?

    感谢你的回复!

  96. 秦续业 作者

    1、第一个问题,既然已经抓取到了好友页面第31页,说明没有什么问题。你说不会接着抓取微博,是停留再哪个页面。

    2、显然有效,如果某个页面用户数为0,就停止。

    3、最好不要用master,不久后替换。

    ps. 页面最下面有我的QQ等联系方式。

给作者留言

关于作者

残阳似血(@秦续业),程序猿一枚,把梦想揣进口袋的挨踢工作者。现加入阿里云,研究僧毕业于上海交通大学软件学院ADC实验室。熟悉分布式数据分析(DataFrame并行化框架)、基于图模型的分布式数据库和并行计算、Dpark/Spark以及Python web开发(Django、tornado)等。

博客分类

点击排行

标签云

扫描访问

主题

残阳似血的微博