Cola:一个分布式爬虫框架

Star

由于早先写的WeiboCrawler问题很多,而且当时我有提到,其实可以实现一个通用的爬虫框架。最近由于要抓取新的数据,于是我就写了这个cola。下面的文字来自wiki

Cola是一个分布式的爬虫框架,用户只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。

依赖

由于Cola配置文件使用的yaml,所以Cola只依赖于pyyaml,安装easy_install或者pip工具后,则可以:

pip install pyyaml

安装

下载或者用git clone源码,假设在目录/to/pth/cola,将该路径添加到Python path中。

一种简单的方法是在site-packages中添加pth文件。site-packages因系统而异,如果是windows,假设python装在C:\python27,那么就是C:\python27\Lib\site-packages;如果是linux,那么应该是/usr/local/lib/pythonX.X/dist-packages。

在site-packages下新建一个cola.pth文件,里面写上路径:/to/path/cola。

运行

Cola集群需要一个master和若干个worker,对于每台机器,只能启动一个worker。但是,集群不是必须的,在单机模式下亦可以运行。

Cola目前自带了两个爬虫,分别是维基百科和新浪微博。在项目根目录下的contrib中。

下面就wiki为例,分别说明如何在单机和分布式环境下运行。

依赖

无论是维基百科还是新浪微博的实现,数据都存放在MongoDB中,所以要确保MongoDB的安装。

在wiki下的wiki.yaml和sina下的sina.yaml中可以配置MongoDB的主机和端口。

维基百科和新浪微博实现依赖于下面的几个包:

  • mechanize
  • python-dateutil
  • BeautifulSoup4
  • mongoengine
  • rsa(仅新浪微博需要)

可以使用pip或者easy_install来安装。

单机模式

单机模式非常简单,只需运行contrib/wiki/__init__.py即可。

cd /to/path/cola/contrib/wiki
python __init__.py

要运行新浪微博的爬虫,需要在sina.yaml中配置登录的用户名和密码。这里要注意,要保证这个用户名和密码在登录时不需要验证码。

分布式模式

首先需要启动cola master和cola workers。分别运行根目录下bin中的start_master.py和start_worker.py

启动cola master:

cd /to/path/cola 
python bin/start_master.py --data /my/path/data

如果不指定--data,那么数据文件会防止在项目根目录下的data文件夹中。

启动cola worker:

python bin/start_worker.py --master  --data /my/path/data

--data选项同master。如果不指定master,会询问是否连接到本机master,输入yes连接。

最后使用bin下的coca.py来运行指定的Cola job:

python bin/coca.py -m  -runLocalJob /to/path/cola/contrib/wiki

-runLocalJob选项是要运行的job所在文件夹的绝对路径。输入命令后,该job会被提交到Cola集群来运行。

停止Cola Job或集群

停止整个集群,则可以运行:

python bin/coca.py -stopAll

而停止一个Job,则需要查询得到Job的名称:

python bin/coca.py -showRunningJobsNames

得到名称后,再运行:

python bin/coca.py -stopRunningJobByName [job name]

编写自定义Cola Job

见wiki编写自定义Cola Job

问题

Cola还不够稳定,目前会处于持续改进的状态。且Cola还没有在较大规模的集群上测试,但是接下来我会把Cola应用到新项目中,并逐步完善。也希望大家也能给我反馈,并帮助改进。

Todo

  • 实现一个web接口,可以查看运行的cola job以及运行情况
  • 实现一个opener能够运行JS代码和执行AJAX请求。
  • 支持增量抓取机制。
  • 简化安装,支持easy_install或者pip安装。增加解决依赖库安装的机制。

标签

赞这篇文章

分享到

252个评论

  1. 秦续业 作者

    靠,以前只是听过scrapy,从来没去看过,刚看了一下,发现除了分布式的部分,竟然真挺像的。
    从scrapy倒是有启发可以保存json文件的形式,减少对数据库的依赖。

    想了一下,分布式还是我的初衷,真没想到其他部分这么相近。

  2. 小邪兽_deepin

    你的例子也过于复杂了, 像scrapy可以用很少的代码实现你例子中的效果, 另外它可以与django进行集成, 使用django model, 抓下来的数据可以直接在django管理界面看到, scrapy不管是能保存成json, xml, txt, 它有一个ItemPipeline的扩展, 随便对抓到的数据做处理

  3. 秦续业 作者

    这么说吧,我当时想直接继承django model的,但是这个挺花时间,而且我觉得可以完全不用继承model的部分,因为对于分布式系统来说,分散在各个机器上的文件意义就不是很大。

    而我的代码中,比较多的部分实际上是parser的部分,因为你要想提取出比较精确的内容,是要写不少的代码的。而主干上的代码实际上是很少的呀。

    另外,从cola的定位就可以看到,是分布式爬虫框架,而且,我相信在接下来cola的发展中,是完全可以继承对数据处理的部分的。但我的定位是,面对越来越海量的数据,自动扩展的分布式效率总好过单机。

  4. 小邪兽_deepin

    嗯, 总体来说爬虫的框架都差不多,看来cola以后会 「实现一个opener能够运行JS代码和执行AJAX请求」对于有些网站的页面是javascript动态生成的, 有什么好的解决方法么, 我现在使用webkit模拟浏览器打开然后获取html内容

    你的框架会不会有中间件的概念, 以后可以做各种扩展
    这两天就研究下你的源码

  5. 秦续业 作者

    说道django model,用scrapy抓取的数据应该很容易进入SQL的数据库。那么ok,就如同当年TurboGears的概念,如果要保存数据进数据库,用SQLAlchemy一样能轻松做到。

    如同我例子里的,我用MongoEngine做了差不多的Model to Mongo的映射,使用第三方的扩展一样很轻松。

    cola的重点不是轻松的数据处理。而是不需要让用户涉及爬虫逻辑,以及考虑分布式的扩展。这是重点。而且,对于一个用户来说,他完全不需要任何的django或者等等的背景。

  6. 夏彬

    master在多网卡的机器上运行时,好像不能选择在哪块网卡上监听。是不是可以通过修改cola/core/utils.py中的get_ip()来解决?不知道这个问题有没有必要修正?谢谢。

  7. 秦续业 作者

    这是个问题,之前没考虑过这种状况。
    可以通过启动master的时候添加启动选项来解决,我会fix这个问题。

  8. 老刘

    我也需要多网卡支持,我这边电信的lan帐号不少,如果可以支持指定的网卡,那就不用在主机上面整太多的虚拟机了

  9. Jackson嘉

    您好,花了两天时间,基本上对Cola的框架有了一些感觉。但是在分布式模式中,当启动了Cola Worker后,终端界面会一直提示在进行RPC调用,根据我的理解,Worker的工作应该是全部后台进行的呀,而我这里启动Worker后,当前终端就无法正常输入其它命令了,请问这是什么原因?

  10. 秦续业 作者

    是会显示RPC调用的,因为worker一直在对master注册心跳。进程是会在background的(实际上是fork的终端进程,所以,关掉终端是会导致进程退出的),但是一些信息会被输出到终端,因此会干扰终端的正常输入,其实要输入也不是完全不可以,CTRL+C就可以。

    我有计划让那进程完全在后台输入(作为服务或者守护进程之类),未来会实现,这里主要是考虑windows的一些兼容问题。我现在的建议是,启动master和worker的终端就放在那里,不要输入其他命令。

  11. Jackson嘉

    恩,CTRL+C是可以短暂正常输入,但是由于一段时间后马上就会再对master注册心跳(10秒左右),所以目前来看,就是需要再开一个终端,用来提交任务。

    另外再给个建议,就是Github中的文档可以对所有涉及到的端口再详细说明一下,最好能有一个分布式的配置拓扑图,其实我现在还是感觉有点混乱。

  12. 老刘

    我觉得还是做成后台的好一些,好些人像我一样用的是vps来跑master和worker。网速不稳定ssh客户端一断就麻烦了。

  13. Jackson嘉

    请问Todo中所说的想让Cola支持增量抓取机制具体是指什么?能稍微举例描述一下吗?

  14. 秦续业 作者

    支持增量抓取是指一个网页被抓取了以后,对于cola来说下次就不会重复抓取了,但是实际上,有的网页是存在更新的,增量抓取就是不止一次进行抓取。

    目前,对于cola来说可以手动选择是否进行重复抓取。
    对于非bundle模式,parse方法返回url列表,这些url可以是字符串,同时也可以是cola.core.unit.Url的实例,如果其属性force为True的话,那么下次还是会重复抓取。
    对于bundle模式,cola.core.unit.Bundle也是有force的属性,设置为True,下次也会重复抓取。

    但是这种机制还不是特别完善,我也在思考如何更好得进行调度。

  15. qingfeng

    “运行js代码和执行ajax请求"

    这个应该很难,你想好怎么做了吗?js如何解析,DOM与JS如何交互,考虑过用v8吗,如果用v8,你可能还需要自己实现一个js模块加载的功能。
    另外,你打算做到什么程度?
    比如,有些js是页面加载完毕执行的,有些是需要触发某些事件才去执行。

  16. 秦续业 作者

    这个目前实现了一个,用的是Spynner,这个是基于PyQt4的。但是如何判断一个网页的ajax加载完毕比较困难,可以执行SpynnerOpener.wait_for_selector来等待某个选择器元素加载完毕。

  17. qingfeng

    哦,我原以为mechanize是支持js解析的呢。好像不支持,那它跟urllib有啥区别呢
    我原来以为mechanize是模拟浏览器的功能,而你在todo里写的解析js是指解析指定的js代码。
    能模拟浏览器解析初始执行的js能够满足大部分需求了,解析指定的就有点麻烦了

  18. 秦续业 作者

    mechanize除了不能执行JS代码,就是模拟浏览器的。它的好处至少在抓新浪微博的时候不会被封IP,而urllib2会。

    不会啊,可以执行初始的JS代码,不过就是没办法判断JS是不是执行完成,所以wait_for_selector可以等待直到某个DOM元素加载完毕。

  19. yangjie

    大神你好:
    试用了一下,感觉框架蛮小巧的,现在出现了以下的问题

    1 就是get_ip这块 可以考虑下将这部分放在配置文件里面,之前在centos老是启动不起来,才发现是这个导致。
    2 按照wiki上面的说明启动,启动不了
    需要加参数--force True
    python bin/start_master.py --force True

    python bin/start_worker.py --master 127.0.0.1 --force True

    到了启动
    python bin/coca.py -m 127.0.0.1 -runLocalJob /data/python/tornado/pacong/cola_dd/contrib/wiki
    这个的时候老是报错
    信息如下
    master 127.0.0.1:11103
    Pushing job to cola cluster...
    ZipFile instance has no attribute '__exit__'
    Traceback (most recent call last):
    File "bin/coca.py", line 256, in <module>
    func(master, *params)
    File "bin/coca.py", line 154, in runLocalJob
    ZipHandler.compress(zip_file, job_path, type_filters=("pyc", ))
    File "/usr/lib/python2.6/site-packages/cola/core/zip.py", line 33, in compress
    with zipfile.ZipFile(zip_file, 'w') as zf:
    AttributeError: ZipFile instance has no attribute '__exit__'

    把zip.py文件中的
    with zipfile.ZipFile(zip_file, 'w') as zf:
    变成
    zf = zipfile.ZipFile(zip_file, 'w')
    这个错误没了,后面又有别的错误,
    Pushing job to cola cluster...
    Push finished.
    Start to run job.
    <Fault 1: "<type 'exceptions.AttributeError'>:ZipFile instance has no attribute '__exit__'">
    Traceback (most recent call last):
    File "bin/coca.py", line 257, in <module>
    func(master, *params)
    File "bin/coca.py", line 163, in runLocalJob
    _client_call(master, 'start_job', zip_filename, True, client)
    File "bin/coca.py", line 43, in _client_call
    return client_call(*args)
    File "/usr/lib/python2.6/site-packages/cola/core/rpc.py", line 41, in client_call
    return getattr(serv, func_name)(*args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1253, in request
    return self._parse_response(h.getfile(), sock)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1392, in _parse_response
    return u.close()
    File "/usr/lib64/python2.6/xmlrpclib.py", line 838, in close
    raise Fault(**self._stack[0])
    Fault: <Fault 1: "<type 'exceptions.AttributeError'>:ZipFile instance has no attribute '__exit__'">
    有点点郁闷,大神能看看是什么问题吗?
    环境是centos6.3 系统自带的python 版本python 2.6

  20. 秦续业 作者

    看起来是在分布式环境下启动的,是不是?

    保证所有机器上都是至少python2.6么?

  21. yangjie

    是在一台机器上启动是master worker和某个job
    命令是这样的
    python bin/start_master.py --force True

    python bin/start_worker.py --master 127.0.0.1 --force True


    python bin/coca.py -m 127.0.0.1 -runLocalJob /data/python/tornado/pacong/cola_dd/contrib/wiki
    执行wiki这个job的时候报了上面的错误

  22. 秦续业 作者

    这个错还是with导致的,照理说,应该在Python2.6或者更高版本都支持。
    但是实际上你把zip.py当中修改了还是没用的,因为其他地方也多次使用了with关键字。

    确保Python版本是对的么?

  23. yangjie

    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 6.0 (Final)
    [root@localhost ~]# uname -a
    Linux localhost.localdomain 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
    [root@localhost ~]# python
    Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18)
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    我感觉是import zipfile这个模块的文件里面不行 查了一下
    http://openhome.cc/Gossip/Python/WithAs.html
    说必須實作__enter__()與__exit__()兩個方法

  24. 秦续业 作者

    刚查了一下,这个算是Python的bug,Python的zipfile.ZipFile在2.7才加入对with的支持。所以,这里在2.6的时候还是报错。

    要么升级Python到2.7,要么等我最近fix这个问题。

  25. yangjie

    谢谢大神的回复,应该不会升级python 升级了 python的有些开发库有安装不上,之前升过 就降回来了,期待你的fix

  26. yangjie

    可以了,下载了一个 2.7的那个文件 导入到那个文件里面,现在没有报错了。

  27. 秦续业 作者

    这也是个解决方法。

    除了这个问题,之前还说到一个IP的问题,就是start_master.py不能在localhost是启动是吧?
    本来是支持--ip来设置IP的,但是还是不能是127.0.0.1,是不是这个问题?

    回头我会解决这个问题。

  28. yangjie

    启动master的时候我指定了ip 会报错,是因为你在watcher.py这个文件里面指定了get_ip()方法来回去 但get_ip()这个方法获取的ip本身就有点问题,可能是我的系统的问题吧,我获取的ip获取不到eth0 的ip 改了那个函数,感觉还是在配置文件里面如果可以指定ip或者 在watcher.py这个文件里面优化一下获取ip 应该也是可行的

  29. yangjie

    master worker 和job现在都可以启动了,但在启动job的时候。worker会报错
    Traceback (most recent call last):
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 256, in <module>
    client=client, force=force)
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 224, in load_job
    context=context, force=force) as job_loader:
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 50, in __init__
    raise ValueError('IP address must be one of (%s)' % ','.join(choices_ips))
    ValueError: IP address must be one of ()
    Traceback (most recent call last):
    File "/usr/lib/python2.6/site-packages/cola/worker/loader.py", line 461, in <module>
    load_job(path, data_path=data_path, master=master, force=force)
    File "/usr/lib/python2.6/site-packages/cola/worker/loader.py", line 433, in load_job
    nodes = client_call(master, 'get_nodes')
    File "/usr/lib/python2.6/site-packages/cola/core/rpc.py", line 40, in client_call
    return getattr(serv, func_name)(*args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1235, in request
    self.send_content(h, request_body)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1349, in send_content
    connection.endheaders()
    File "/usr/lib64/python2.6/httplib.py", line 908, in endheaders
    self._send_output()
    File "/usr/lib64/python2.6/httplib.py", line 780, in _send_output
    self.send(msg)
    File "/usr/lib64/python2.6/httplib.py", line 739, in send
    self.connect()
    File "/usr/lib64/python2.6/httplib.py", line 720, in connect
    self.timeout)
    File "/usr/lib64/python2.6/socket.py", line 567, in create_connection
    raise error, msg
    socket.error: [Errno 111] Connection refused

    应该也是那个ip的问题

  30. yangjie

    大神,现在启动某个job的时候报了这个错误
    /usr/lib/python2.6/site-packages/data/worker/jobs/wikipedia_crawler/store/lock
    192.168.3.167 - - [05/Jul/2013 03:26:21] "POST /RPC2 HTTP/1.0" 200 -
    Traceback (most recent call last):
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 256, in <module>
    client=client, force=force)
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 225, in load_job
    job_loader.run()
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 208, in __exit__
    self.finish()
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 147, in finish
    client_call(rpc_client, 'stop', ignore=True)
    File "/usr/lib/python2.6/site-packages/cola/core/rpc.py", line 44, in client_call
    return getattr(serv, func_name)(*args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1243, in request
    headers
    xmlrpclib.ProtocolError: <ProtocolError for 192.168.3.167:11303/RPC2: -1 >

    11303这个端口没有启动起来,rpc之前没有研究过。是哪里问题导致的呢

  31. 秦续业 作者

    这是在stop的时候报的错么?

    结束的时候有时候会报错的,我也在fix这个问题。

  32. yangjie

    才启动wiki这个job的时候,刚刚是提示之前的已经存在,我正在重启机器重现这个问题, 方便qq吗?或者gtalk

  33. 秦续业 作者

    你可以暂时删除掉项目目录下的data文件夹,可能还是非法关闭导致的,结束任务的时候有运行coca.py -stopAll么?

    我现在正在参加一个活动,要两天的时间,可能不能及时来解决你的问题,QQ或者GTalk等礼拜天过后再联系,QQ的话博客最下方有。

  34. yangjie

    确定了 是在执行比如这样的命令的时候
    python bin/coca.py --m 192.168.3.167 -runLocalJob /data/python/tornado/pacong/cola_dd/contrib/wiki

    会创建一个11303的服务,但这个服务创建不成功,报错如下
    Traceback (most recent call last):
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 256, in <module>
    client=client, force=force)
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 225, in load_job
    job_loader.run()
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 208, in __exit__
    self.finish()
    File "/usr/lib/python2.6/site-packages/cola/master/loader.py", line 147, in finish
    client_call(rpc_client, 'stop', ignore=True)
    File "/usr/lib/python2.6/site-packages/cola/core/rpc.py", line 44, in client_call
    return getattr(serv, func_name)(*args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
    File "/usr/lib64/python2.6/xmlrpclib.py", line 1243, in request
    headers
    xmlrpclib.ProtocolError: <ProtocolError for 192.168.3.167:11303/RPC2: -1 >
    192.168.3.167 - - [05/Jul/2013 03:37:30] "POST /RPC2 HTTP/1.0" 200 -

  35. superbboy

    参考你原来webcrawler的修改了一个爬虫,weibo.cn大规模抓取貌似很容易被封堵,单个账号登陆在100多台机器上抓取,很快就没戏了。不知道怎么解决?weibo.com貌似就好很多。

  36. Sunday

    Hi,我最近也在做Weibo的爬虫,用scrapy做的,相比而言比较简单,分布式也容易实现。
    parser部分是参考你的方式,不过是用XPath做的,感觉libxml2的XPath性能也许要好过BeautifulSoup4。

    另外,兄台是如何克服目前新浪微博对好友200限制,对微博600限制的呢?

    还有查看微博评论的api http://weibo.com/aj/like/big?%s 你是怎么发现的,我很苦逼的解析网页。。。

  37. 秦续业 作者

    因为单纯针对新浪微博做爬虫,要做分布式的话,逻辑上确实不难。一切交给数据库就ok了。
    另外,关于BS4的问题,因为其是纯Python写的,性能必然不如lxml,但是实际上,bs4是可以用lxml做parser的,所以性能不是问题。

    还有新浪微博对好友200限制没办法,因为在网页上连续点的话都被提示是恶意操作。
    关于微博600的限制,我不明白是啥?

    查看评论、赞等等就是在浏览器里调试,看AJAX请求得到的。

  38. Sunday

    好吧,我是根据 http://weibo.com/uid?page=xx "pid":"pl_content_hisFeed"
    这样来解析微博的,发现似乎只能取到 前40页 page,41页就取不到了,每页15个,就600个。。。

    兄台能否整理下weibo.com的ajax请求的一些东东分享下。

  39. Sunday

    好吧,很简单的,你能获取到某个人所有的微博么?我发现只能最多看到最近的600条微博。

  40. superbboy

    不知道是否可以分享一下,我遇到的情况和sunday一样呢,都是只能看到40页,目前只能采用不断刷新的方式来确保数据不遗漏。

  41. 秦续业 作者

    我的方式可以参考一篇文章:http://www.cnblogs.com/sickboy/archive/2012/01/08/2316248.html
    然后具体参数的一些调整,可以结合cola下contrib/weibo中的代码来看。

  42. Sunday

    这个告一段落。。。不过偶尔Json.loads失败。。。这个真心不知道为何了,我看你貌似也没解决。。。只是捕获异常跳过了。

  43. 秦续业 作者

    这个应该是新浪微博的问题,我新增的逻辑里只是增加了重试,10次,如果还不行就抛错。
    事实说明,效果很不错,到目前没有再出现这种问题了。

  44. Sunday

    最后打扰。。。 。。。
    1、屏蔽的问题,你没遇到过? 我今天中午抓了半个钟左右,现在没4次才能成功一次了。。。
    2、抓粉丝和关注的时候,渣浪自动屏蔽了部分广告用户,这个何解?

  45. 秦续业 作者

    首先被屏蔽的事情,没有遇到过,我这边抓取一直还比较正常。
    被新浪屏蔽的没办法,因为网页能看到的,爬虫也就能看到这么多。

  46. Sunday

    好吧。。。 。。。 刚刚发现 渣浪 。。。 改版了!
    STK 换成 FM.view了。。。

  47. zqqnancy

    大神,这个项目让我和我的小伙伴们都惊呆了!
    我想问:
    1.cola能抓取到起始用户关注和粉丝的关注和粉丝吗?怎么限定搜索深度?
    2.单机模式运行weibo,最新版本错误提示:
    C:\Python27\cola\cola\core\opener.py:74: UserWarning: gzip transfer encoding is
    experimental!
    self.browser.set_handle_gzip(True)
    login fail
    login fail
    3.单机模式运行weibo,之前一个版本错误提示:
    Exception in thread Thread-3:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 808, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 761, in run
    self.__target(*self.__args, **self.__kwargs)
    File "C:\Python27\cola\contrib\weibo\cola\worker\loader.py", line 287, in _cal
    l
    if not self._login(opener):
    File "C:\Python27\cola\contrib\weibo\cola\worker\loader.py", line 166, in _log
    in
    not isinstance(self.ctx.job.login, list):
    File "C:\Python27\cola\contrib\weibo\cola\core\config.py", line 40, in __getat
    tr__
    return [PropertyObject(itm) for itm in attr]
    ValueError: dictionary update sequence element #0 has length 1; 2 is required

  48. 秦续业 作者

    先说2、3个问题吧,3是登录失败以后修改配置文件造成的吧?
    登录失败的原因主要是:1、确保你的帐号和密码正确,2、要确保登录不需要验证码。这个你可以在电脑上尝试一下,如果需要,把当前所在地添加到安全登录地点去。

    第一个问题,我觉得实现起来非常简单(但是说起来有点费劲),具体的话我会在将来增加限制深度的功能。
    但是由于运行一段时间分布式版本后有不少问题,当前我的第一要务还是重构分布式cola,所以除非是bug,我不会在最近一段时间增加新功能。但是不远的将来,我会添加这个功能。

    感谢!

  49. 祝天刚27g

    您好,我运行您的代码,想爬一下weibo,结果出现如下错误,请问是怎么回事儿呢?谢谢
    Empty module name
    Traceback (most recent call last):
    File "coca.py", line 254, in <module>
    func(master, *params)
    File "coca.py", line 138, in runLocalJob
    import_job(job_path)
    File "/home/zhutiangang/to/pth/cola/cola/core/utils.py", line 71, in import_job
    job_module = __import__(name)
    ValueError: Empty module name

  50. dakucha

    楼主:按您说的,单机模式直接运行cola/contrib/weibo下的__init__.py文件, 结果报的这个错,是啥意思啊?刚接触python,不懂

    Traceback (most recent call last):
    File "D:\cola-master\contrib\weibo\__init__.py", line 30, in <module>
    from parsers import MicroBlogParser, ForwardCommentLikeParser,\
    File "D:\cola-master\contrib\weibo\parsers.py", line 37, in <module>
    from storage import DoesNotExist, Q, WeiboUser, Friend,\
    File "D:\cola-master\contrib\weibo\storage.py", line 25, in <module>
    from conf import mongo_host, mongo_port, db_name, shard_key
    File "D:\cola-master\contrib\weibo\conf.py", line 39, in <module>
    shard_key = user_config.job.mongo.shard_key
    AttributeError: 'PropertyObject' object has no attribute 'shard_key'

  51. 秦续业 作者

    这个问题是由于前几天修改底层代码导致的。我已经修复了,更新到最新的代码再试试。

  52. 祝天刚27g

    我运行了一下微博下面的_init_.py,出现下面的错误
    Traceback (most recent call last):
    File "__init__.py", line 30, in <module>
    from parsers import MicroBlogParser, ForwardCommentLikeParser,\
    File "/home/zhutiangang/to/pth/cola/contrib/weibo/parsers.py", line 37, in <module>
    from storage import DoesNotExist, Q, WeiboUser, Friend,\
    File "/home/zhutiangang/to/pth/cola/contrib/weibo/storage.py", line 25, in <module>
    from conf import mongo_host, mongo_port, db_name, shard_key
    File "/home/zhutiangang/to/pth/cola/contrib/weibo/conf.py", line 31, in <module>
    user_config = Config(user_conf)
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 64, in __init__
    self.conf = PropertyObject(yaml.load(f))
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 35, in __init__
    self._update(d)
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 43, in _update
    setattr(self, k, PropertyObject(v))
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 35, in __init__
    self._update(d)
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 45, in _update
    setattr(self, k, [PropertyObject(itm) for itm in v])
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 35, in __init__
    self._update(d)
    File "/home/zhutiangang/to/pth/cola/cola/core/config.py", line 38, in _update
    for k, v in d.iteritems():
    AttributeError: 'str' object has no attribute 'iteritems'

    如下是我的weibo.yaml的配置(微博登录名密码去掉了),
    1 job:
    2 db: sina
    3 mode: bundle # also can be `bundle`
    4 size: 100 # the destination (including bundle or url) size
    5 limit: 0 # 0 means no restrictions, if greater than 0, means webpages opened per minute.
    6 master_port: 12104
    7 port: 12105
    8 instances: 2
    9 mongo:
    10 host: localhost
    11 port: 27017
    12 login:
    13 - username:$$$$$$@yahoo.cn # username
    14 password: @@@@@ # password
    15 starts:
    16 - uid:1692082534
    17 # - uid: 3211200050
    18 # - uid: 1898353550
    19 fetch:
    20 forward: no
    21 comment: no
    22 like: no
    ~
    还需要其他地方的修改么?新手,问题比较浅,请谅解

  53. srrc

    你好,请问你获取用户微博的这些请求的url是怎么得来的?我用firefox23自带的网络开发工具(类似firebug)发现还是比较麻烦的,以获取某用户的微博为例:
    初始页面只有5条微博;需要点击“查看更多微博”才能获得15条;之后滑动页面,会有2次加载过程,每次15条,这时的请求url和你这里用的很像,却多了一个“p/” http://weibo.com/p/aj/mblog/mbloglist

    还有获取评论的请求,http://weibo.com/aj/comment/small,在哪里有“big”的请求
    http://weibo.com/aj/comment/big
    还请告知方法,谢谢。

  54. ruky

    这两天在读cola的代码,还没尝试运行过,不过有个地方我不太明白,请教一下
    class MasterJobLoader下的self.stopped是不是尚未初始化就在run函数中使用了?/master/loader.py中整个就两个地方使用了self.stopped.第二处就是finish函数。

    此外,对于你设计的class messagequeue,我没太看明白是做什么用的?从名称上看是消息队列,我没看明白,请教。

    谢谢

  55. 秦续业 作者

    现在代码还在重构中,之前写的有不少问题,其实在我重构之后再看更好些。

  56. ruky

    再次请教:1.class messagequeue 用途?
    2.core/mq/__init__.py中代码return client_call(node, 'get')似乎没找到对应的get 函数实现?

  57. ypengh

    单机模式下运行,数据有存到mongodb中的吗?怎么我运行的只是写到文件上,数据库中的表是空的。

  58. Sunday

    Hi,如何解决被封~~~我用5个机器(同一内网下的),300KB/s 一晚上就被封了。。。。。。

  59. Sunday

    被封的特别厉害了,大概通过IP和帐号,双重机制校验的。。。难道你没遇到过?

  60. frog1902

    请问一下运行/weibo/__init__.py出现:

    File "__init__.py", line 25, in <module>
    from cola.core.opener import MechanizeOpener
    ImportError: No module named cola.core.opener

    是什么情况呢?
    我看了一下cola.core.opener这个文件是有的,cola.pth我也加了。
    我是在win下运行的。
    不好意思,我是开发菜鸟,实在是不太懂。。

  61. frog1902

    上面的问题解决了
    不过还想问一下抓取了一段时间之后出现“ValueError: No JSON object could be decoded”是什么情况呢?
    还有就是抓取出的数据怎么查看呢?

  62. 毛福林

    我下载了你的cola 分布式爬虫框架,抓取央视新闻的所有微博,数据库中的微博数目快到200条的时候,程序就会停止,我抓取其他的微博没有发现这个问题,我想咨询一下,这是什么原因造成的,是不是因为我一些设置问题导致的?

  63. 毛福林

    我看了一下到停止的时候,发现urls里的链接为空了,最后程序结束,我没有找到为什么那个urls的链接为空。

  64. Ars

    看了下代码,确实是写到MongoDB里了,但实际爬出来的情况是,大部分的数据都没有info这个字段,请问这是什么原因啊?

  65. 秦续业 作者

    有没有报错的情况?
    如果没有,我会检查下是什么原因。
    你可以发几个UID,这些UID是真实存在info,而没有抓取到的,好方便我查看是什么原因导致的。

  66. Ars

    没有报错。
    1713926427,2075536225,2010535700
    上面三个UID,第一个直接没有抓到info这个字段,后面两个有字段,但是信息不全,
    只爬到avatar这一个属性。
    还有就是,想请教下,工具跑一段时间后会卡在那里,得人工干预重新启动,不知道
    是什么原因?

  67. 秦续业 作者

    有可能是新浪改版造成的,我会看下是什么问题。
    卡住的问题我偶尔也会碰到,还不清楚是什么导致的,不知道怎么样来重现这个问题。

  68. Ars

    weibosearch运行出来这么个错误:
    WARNING: QApplication was not created in the main() thread.
    (process:13866): GLib-CRITICAL **: g_main_context_push_thread_default: assertion `acquired_context' failed
    [xcb] Unknown request in queue while dequeuing
    [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
    [xcb] Aborting, sorry about that.
    python: ../../src/xcb_io.c:179: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
    Aborted (core dumped)
    PyQT和spynner都已经安装。想请教这是什么原因?

  69. michaelM

    版主,我也出现了一样的错误,wiki,weibo能正常运行,而weibosearch下运行的时候报相同的错。请问版主,你那里可以正常运行单机模式下weibosearch吗。我qt4,qt5都试过,同样的错误,所以不知道是不是环境问题

  70. 老刘


    [root@lns ~]# setsid python /usr/cola/bin/start_master.py
    [root@lns ~]# Start master at **.**.**.**:11103
    Master will run in background. Please do not shut down the terminal.
    Traceback (most recent call last):
    File "/usr/cola/cola/master/watcher.py", line 334, in <module>
    data_path=data_path, force=force) \
    File "/usr/cola/cola/master/watcher.py", line 102, in __init__
    self.check(force=force)
    File "/usr/cola/cola/master/watcher.py", line 127, in check
    raise MasterWatcherRunning('There has been a running master watcher.')
    __main__.MasterWatcherRunning: There has been a running master watcher.
    ^C

    第一次运行了没报错,但是断网后,我重新连了再启动就报错了版本是2.7.6

  71. 老刘

    我尝试了叉掉了所有python的进程,不行。
    最后,我把data目录删掉就又好了。求原理
    再有就是怎么样在关掉终端后还能让它继续跑?

  72. 连理枝

    在winxp下出现如下情况:
    Traceback (most recent call last):
    File "C:\to\path\cola\contrib\weibo\__init__.py", line 30, in <module>
    from parsers import MicroBlogParser, ForwardCommentLikeParser,\
    File "C:\to\path\cola\contrib\weibo\parsers.py", line 37, in <module>
    from storage import DoesNotExist, Q, WeiboUser, Friend,\
    File "C:\to\path\cola\contrib\weibo\storage.py", line 35, in <module>
    raise DependencyNotInstalledError('mongoengine')
    DependencyNotInstalledError: Error because lacking of dependency: mongoengine

    我mongoengine依赖已经安装了呀

  73. 连理枝

    >>> import mongoengine

    Traceback (most recent call last):
    File "<pyshell#0>", line 1, in <module>
    import mongoengine
    File "C:\Python27\lib\site-packages\mongoengine\__init__.py", line 3, in <module>
    import fields
    File "C:\Python27\lib\site-packages\mongoengine\fields.py", line 16, in <module>
    import dateutil.parser
    File "C:\Python27\lib\site-packages\dateutil\parser.py", line 24, in <module>
    from six import text_type, binary_type, integer_types
    ImportError: No module named six

    秦版主,这个是什么原因

  74. 连理枝

    C:\Documents and Settings\Administrator>pip install mongoengine
    Downloading/unpacking mongoengine
    Downloading mongoengine-0.8.6.tar.gz (207kB): 207kB downloaded
    Running setup.py egg_info for package mongoengine
    0.8.6

    no previously-included directories found matching 'docs\_build'
    Requirement already satisfied (use --upgrade to upgrade): pymongo>=2.5 in c:\pyt
    hon27\lib\site-packages (from mongoengine)
    Installing collected packages: mongoengine
    Running setup.py install for mongoengine
    0.8.6

    no previously-included directories found matching 'docs\_build'
    Successfully installed mongoengine
    Cleaning up...

    在xp下安装的时候出来以上信息。
    但使用import mongoengine时出现如下信息:

    Traceback (most recent call last):
    File "<pyshell#3>", line 1, in <module>
    import mongoengine
    File "C:\Python27\lib\site-packages\mongoengine\__init__.py", line 3, in <module>
    import fields
    File "C:\Python27\lib\site-packages\mongoengine\fields.py", line 16, in <module>
    import dateutil.parser
    File "C:\Python27\lib\site-packages\dateutil\parser.py", line 24, in <module>
    from six import text_type, binary_type, integer_types
    ImportError: No module named six

  75. 秦续业 作者

    那就安装six,试试用pip装呀。下面python-dateutil同样试试from dateutil.parser import parse,看看缺什么。

    DependencyError是catch ImportError的,所以,你即使安装了某个包,但是没有这个包的某个依赖,还是会抛ImportError异常的。

  76. 连理枝

    Traceback (most recent call last):
    File "C:\to\path\cola\contrib\wiki\__init__.py", line 43, in <module>
    raise DependencyNotInstalledError('python-dateutil')
    DependencyNotInstalledError: Error because lacking of dependency: python-dateutil

    这个依赖我也安装了呀

  77. Demo

    秦版主,您好,最近正在运行您的cola,有以下几个问题请教:
    问题1:消息队列会不会有溢出的情况?每次抓取的粉丝和好友列表都会put到mq中去,如果抓取的size足够大,会不会导致错误?我的python很烂,cola中的消息机制看不懂
    问题2:timeout错误可能是那些原因导致的?
    Traceback (most recent call last):
    File "C:\Users\Administrator\Desktop\cola\cola\worker\loader.py", line 384, in _execute_bundle
    **options).parse(temp_user,XMLDoc=XMLDoc)
    File "C:\Users\Administrator\Desktop\cola\contrib\weibo\parsers.py", line 108, in parse
    br = self.opener.browse_open(url)
    File "C:\Users\Administrator\Desktop\cola\cola\core\opener.py", line 100, in browse_open
    self.browser.open(url, data=data, timeout=timeout)
    File "build\bdist.win32\egg\mechanize\_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
    File "build\bdist.win32\egg\mechanize\_mechanize.py", line 230, in _mech_open
    response = UserAgentBase.open(self, request, data)
    File "build\bdist.win32\egg\mechanize\_opener.py", line 204, in open
    response = meth(req, response)
    File "build\bdist.win32\egg\mechanize\_gzip.py", line 102, in http_response
    return stupid_gzip_wrapper(response)
    File "build\bdist.win32\egg\mechanize\_gzip.py", line 76, in __init__
    gzc.feed(response.read())
    File "D:\Python27\lib\socket.py", line 351, in read
    data = self._sock.recv(rbufsize)
    File "D:\Python27\lib\httplib.py", line 543, in read
    return self._read_chunked(amt)
    File "D:\Python27\lib\httplib.py", line 612, in _read_chunked
    value.append(self._safe_read(chunk_left))
    File "D:\Python27\lib\httplib.py", line 658, in _safe_read
    chunk = self.fp.read(min(amt, MAXAMOUNT))
    File "D:\Python27\lib\socket.py", line 380, in read
    data = self._sock.recv(left)
    timeout: timed out
    问题3:大量AttributeError:
    raceback (most recent call last):
    File "F:\cola\cola\worker\loader.py", line 385, in _execute_bundle
    **options).parse(temp_user,XMLDoc=XMLDoc)
    File "F:\cola\contrib\weibo\parsers.py", line 431, in parse
    raise e
    AttributeError: 'NoneType' object has no attribute 'get'

  78. 秦续业 作者

    第一个问题,mq应该不会溢出,除非内存不够了。size足够大可能出现这种情况。
    第二个问题,这个timeout就是http连接的时候超时了,默认好像是30s,应该是网络问题等导致的
    第三个问题,parser有时候是可能出问题的,少数的帐号读取的网页和一般不一样,还有可能是新浪改版导致的,这个可以加入断电来调试。

  79. Demo

    还有一个问题,我发现不是所有人的微博都能完全拿到,我盯了一下,对于某些人,爬去一部分后就打印finish转向另外目标了,可完成页数没有规则,也没有任何报错,这种情况在爬取一些大V(微博数数千甚至数万)的时候比较频繁,但是对于微博数较少的用户也不是不会发生,这是什么原因呢

  80. 杯具到处都有

    秦版主,您好,运行您的程序时出现如下问题,请指教:
    2014-01-09 21:09:01,348 - loader.complete.182 - INFO - Finish 1743791127
    2014-01-10 04:36:45,456 - loader._execute_bundle.419 - ERROR - Error when fetch url: http://weibo.com/aj/mblog/mbloglist?uid=1565440297&_k=1389299804380000
    2014-01-10 04:36:45,471 - loader._log_error.253 - ERROR - Error when get bundle: 1565440297
    2014-01-10 04:36:45,471 - loader._log_error.254 - ERROR - No JSON object could be decoded
    Traceback (most recent call last):
    File "C:\Users\Administrator\Desktop\cola\cola\worker\loader.py", line 397, in _execute_bundle
    **options).parse(temp_user,XMLDoc=XMLDoc)
    File "C:\Users\Administrator\Desktop\cola\contrib\weibo\parsers.py", line 151, in parse
    data = json.loads(br.response().read())['data']
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Python27\lib\json\decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded
    可以看到,程序中途停了七个多小时,这是什么原因呢,然后抓取每个人的微博时都会出现此错误,是因为cookie过期导致的么?

  81. 秦续业 作者

    中途停下来,看看你是不是帐号异常了,你可以登录你的帐号看一下,必要时可能需要激活帐号。

  82. 杯具到处都有

    现在账号没有问题,从日志上看,程序是昨天晚上21:09之后停止的,今天凌晨04:36左右自动开始重新采集,在这之爬取得每个目标都会导致ValueError: No JSON object could be decoded异常,这个异常是爬取第一页的首个15条微博时抛出的,爬取粉丝和好友列表时没有该异常,但是也没有拿到数据,早上九点左右我发现该情况后终止了程序。所以我不肯定当时账号是不是有问题。我正在重新运行,如果再出现任何问题再与您交流。

  83. Demo

    还有一个问题,我发现不是所有人的微博都能完全拿到,我盯了一下,对于某些人,爬去一部分后就打印finish转向另外目标了,可完成页数没有规则,也没有任何报错,这种情况在爬取一些大V(微博数数千甚至数万)的时候比较频繁,但是对于微博数较少的用户也不是不会发生,这是什么原因呢?,我重现这个问题时,发现导致抓取该用户停止的最后一次请求返回了没有微博数据导致解析到的divs为空(divs = soup.find_all('div', attrs={'class': 'WB_feed_type'}, mid=True))从而使if len(divs) == 0 or finished:条件为真,返回了空地址使程序认为该人已经爬取完成,打印出来的返回数据为:
    <!-- 高级搜索 -->
    <!-- /高级搜索 -->

    <!-- 微博列表 -->

    <!-- /微博列表 -->
    <!-- 分页 -->
    <div node-type="feed_list_page" class="W_pages">
    <a action-type="feed_list_page_pre" action-data="page=4" href="http://weibo.com/charlesxue?page=4"
    class="W_btn_c"><span>上一页</span></a>
    <span class="list">
    <div action-type="feed_list_page_morelist" class="W_pages_layer" style="display: none">
    <a action-type="feed_list_page_n" action-data="page=5" href="http://weibo.com/charlesxue?page=5"
    class="page current" >第&nbsp;5&nbsp;页</a>
    <a action-type="feed_list_page_n" action-data="page=4" href="http://weibo.com/charlesxue?page=4"
    >第&nbsp;4&nbsp;页</a>
    <a action-type="feed_list_page_n" action-data="page=3" href="http://weibo.com/charlesxue?page=3"
    >第&nbsp;3&nbsp;页</a>
    <a action-type="feed_list_page_n" action-data="page=2" href="http://weibo.com/charlesxue?page=2"
    >第&nbsp;2&nbsp;页</a>
    <a action-type="feed_list_page_n" action-data="page=1" href="http://weibo.com/charlesxue?page=1"
    >第&nbsp;1&nbsp;页</a>
    </div>
    <a action-type="feed_list_page_more" action-data="currentPage=5&countPage=5" href="javascript:void(0)" class="W_moredown"><span class="txt">第&nbsp;5&nbsp;页</span><em class="W_arrow"><em class="down">◆</em></em></a>
    </span>
    </div>
    <!-- /分页 -->

  84. 秦续业 作者

    ok,判断一个人是不是结束的时候实际上是判断当前页的微博div是不是为0的,那么有可能出现反例的?也就是说这个数量为0但是还有下一页的情况?

  85. Demo

    对,是这个样子的,我修改了一下代码,当发现divs为0时,直接去请求下一页的首个15条微博,从现在运行效果来看,的确拿到了之后的内容,缺陷是该页丢失。不过我不肯定这个情况是不是比较特殊,而我修改代码后运行没有却没有遇到这个问题,使得出现现在的效果。

  86. zync

    只用Python写过一个简单的采集器,我认为采集器只需负责极简单的网页打开功能即可,需要二次解析的任务可以重新发布任务到采集端。
    所以这个集群是不是要有几个独立模块:
    1、采集器
    2、代理IP库
    3、结果库
    4、解析规则库
    5、任务发布器

    欢迎探讨。

  87. 为叁

    cola这个分布式爬虫我很喜欢,我仔细看了看源码。但是有一些疑惑,希望您能基于解答。
    你在github上这样说:
    在一个Cola Job启动时,会启动一个消息队列(Message Queue,主要操作是put和get,worker抓取到的对象会被put到队列中,而要抓取新的对象时,只要从队列中取即可),每个JobWorker上都存在消息队列节点,同时会有一个去重模块(bloom filter实现)。

    我在源码中也发现 Message Queue 是每个 jobWorker上都初始化一个, 并且都会有一个file bloom filter。

    我的疑惑:
    这样会不会造成 去重不完全呢? 即在每个jobWorker上都是去重的,但是整个job会出现重复下载的情况。


    说明:我对FileBoomFilter 不是太懂,但是每个jobWorker 维护自己的boolm文件,我感觉会出现我上面说的问题

  88. 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
    然后程序就终结了,这个是怎么回事?望指导
    之前发到另外一个帖子里去了。。。

  89. monger

    今天突然出现的错误,换了账号还是不行,求大神解决
    C:\Python27\Lib\site-packages\cola\contrib\weibo>python __init__.py
    C:\Python27\Lib\site-packages\cola\cola\core\opener.py:74: UserWarning: gzip tra
    nsfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "C:\Python27\Lib\site-packages\cola\cola\worker\loader.py", line 314, in
    _call
    if not self._login(opener):
    File "C:\Python27\Lib\site-packages\cola\cola\worker\loader.py", line 188, in
    _login
    login_result = self.job.login_hook(opener, **kw)
    File "C:\Python27\Lib\site-packages\cola\contrib\weibo\__init__.py", line 40,
    in login_hook
    return loginer.login()
    File "C:\Python27\Lib\site-packages\cola\contrib\weibo\login.py", line 100, in
    login
    json_data = json.loads(regex.search(text).group(1))
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 368, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
    ValueError: Extra data: line 1 column 105 - line 1 column 420 (char 104 - 419)

    Finish visiting pages count: 0
    Finish visiting pages count: 0

  90. monger

    json_data = json.loads(regex.search(text).group(1))
    regex.search(text).group(1)的内容是try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":[
    sdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1398585806"]
    }try{sinaSSOController.crossDomainAction('login',function(){locatio
    tp://weibo.com/ajaxlogin.php?framelogin=1&amp%3Bcallback=parent.sin
    r.feedBackUrlCallBack&ssosavestate=1398585806&ticket=ST-MzgyNjU5MDk
    806-xd-45C77054C70297F3D614C76E1ECAF627&retcode=0');});}catch(e){}

    不是json文件

  91. monger

    如果你那儿的cola能正常运行的话,应该就是我一个人的问题
    修改了login.py代码后好了
    postdata = urllib.urlencode(postdata)
    text = self.opener.open(login_url, postdata)
    p = re.compile('location\.replace\(\'(.*?)\'\)')
    new_url = p.search(text).group(1)
    real_text=self.opener.open(new_url)
    regex = re.compile('\((.*)\)')
    json_data = json.loads(regex.search(real_text).group(1))
    result = json_data['result'] == True
    if result is False and 'reason' in json_data:
    return result, json_data['reason']
    中间加了几句

  92. 秦续业 作者

    确实是新浪微博做出了变化。

    改动是不错的,我也依此修改了cola的代码并push了上去。不过呢,下次有这种情况欢迎提交PR,这样cola也能更好得改进,谢谢。

  93. 秦续业 作者

    我不大愿意这么做,我还是希望更开源一点。但是最后如果没办法也只能这样。

  94. monger

    抓数据过程中会出现微博扒不全的情况
    1W1千条,4000多条只扒了2000就finish了
    非网络问题
    但有扒完6000条的情况
    求解释

    还有就是建议改一改扒info的爬虫
    有些明星的sina微博已经没了info页面,改成百度人物资料,再扒info会出现error

  95. monger

    比如方舟子250页微博
    最早到2009年9月
    我只扒到2012年5月

    网页可以访问到250页
    log没有出现error情况
    2014-04-07 13:16:03,242 - loader.complete.160 - INFO - Finish 1223178222
    2014-04-07 13:17:25,368 - loader.complete.160 - INFO - Finish 1739928273
    2014-04-07 13:19:29,355 - loader.complete.160 - INFO - Finish 1087770692
    2014-04-07 13:21:40,369 - loader.complete.160 - INFO - Finish 1722594714
    2014-04-07 13:26:16,052 - loader.complete.160 - INFO - Finish 1192329374
    2014-04-07 13:28:14,197 - loader.complete.160 - INFO - Finish 1218869573
    2014-04-07 13:29:03,493 - loader.complete.160 - INFO - Finish 1191258123
    2014-04-07 13:31:09,352 - loader.complete.160 - INFO - Finish 1220924217
    2014-04-07 13:35:27,311 - loader.complete.160 - INFO - Finish 1195230310
    2014-04-07 13:37:06,411 - loader.complete.160 - INFO - Finish 1195403385
    2014-04-07 13:37:06,414 - loader.finish.149 - INFO - Finish visiting pages count: 2025
    2014-04-07 13:37:14,645 - loader.finish.149 - INFO - Finish visiting pages count: 2025

  96. C3P0

    博主你好,cola这个框架有几点不太明白。麻烦请教您一下。
    第一:
    在节点上启用start_worker的时候输入master的IP和端口。这个端口到底是配置文件的哪个端口?我试着输入master_port和port结果都连接失败
    终端显示:
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
    File "/usr/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "/usr/lib/python2.7/dist-packages/cola/worker/watcher.py", line 141, in _start
    self.register_heartbeat()
    File "/usr/lib/python2.7/dist-packages/cola/worker/watcher.py", line 106, in register_heartbeat
    client_call(self.master, 'register_heartbeat', self.node)
    File "/usr/lib/python2.7/dist-packages/cola/core/rpc.py", line 50, in client_call
    raise err
    error: [Errno 111] Connection refused

    第二个问题。运行wiki这个用例的时候。有些页面经常访问后经常抛出这个异常:
    'NoneType' object has no attribute 'text'
    Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/cola/worker/loader.py", line 258, in _execute_url
    next_urls = parser_cls(opener, obj, logger=self.logger, **options).parse()
    File "/usr/local/lib/python2.7/dist-packages/data/jobs/wiki/__init__.py", line 132, in parse
    title, content, last_update = self._extract(soup)
    File "/usr/local/lib/python2.7/dist-packages/data/jobs/wiki/__init__.py", line 105, in _extract
    last_update_str = soup.find('li', attrs={'id': 'footer-info-lastmod'}).text
    AttributeError: 'NoneType' object has no attribute 'text'
    然后程序经常访问10-20个页面后就停止运行。


    我是初学者,希望用cola抓取一些数据做其他处理。问题可能比较低级。希望您能指点一下

  97. twister_vole

    你的新浪微博爬虫很有意思。
    你知道2个P2P的微博平台吗?一个是http://twister.net.co/ , 另一个是vole.cc
    我认为只有P2P的微博才能解决现在新浪微博的一些问题。
    但这2个P2P的微博平台上面的用户人数很少。因为大家观注的大V,明星,知识分子还都在新浪微博上面,所以“网络效应”导致用P2P微博的人很少。
    如果结合你的新浪微博爬虫,使P2P微博平台上面的各种贴子多起来,使仅用P2P微博平台也可以让大家看到他们所关注的人与消息,那就可以改变这一“网络效应”,使P2P微博平台的用户慢慢增加起来。不知你对此有何看法?有无兴趣?

  98. twister_vole

    这2个P2P微博是去中心化的,无中心服务器的。抗审查、抗删贴、消息加密、用户身份无需实名登记,且可都是用假名。没人能够把它关掉。因无中心服务器,所以也不存在服务器上的用户名密码被黑客盗取的可能。http://twister.net.co/ 中的FAQ上面有更详细的介绍

  99. 秦续业 作者

    这个点子目标挺好,但是实施起来比较有难度,而且对于我国的国情,更加难开展。我不晓得做出这样一个P2P的微博,会有什么实质上的改变么?

  100. twister_vole

    有的人捐款给红十字会,捐款给壹基金,认为这是在做慈善。有的人休息天去做义工,去帮助孤老。认为这是在做慈善。我认为,从自己最了解的行业开始做。因为这样的慈善是别人所做不了的,只有你才能做。我认为,支持投入投身于P2P技术也是一种对世界的慈善。它可以让世界更加扁平化,运作的效率更加高。p图p技术,可以削弱金字塔高层,极权的力量,就是对底层劳苦大众的一种慈善。

  101. Da

    你好,在测试的时候出现这个问题。。。 是怎么回事?
    spark@spark01:~/cola/tests/contrib$ python test_weibo.py
    /home/spark/cola/cola/core/opener.py:74: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    EEEEEEE
    ======================================================================
    ERROR: testFriendParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testMicroBlogForwardTimeParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testMicroBlogForwardsParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testMicroBlogLikesParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testMicroBlogParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testUserInfoParser (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ======================================================================
    ERROR: testUserInfoParserForSite (__main__.Test)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "test_weibo.py", line 27, in setUp
    self.conn = Connection()
    File "/usr/local/lib/python2.7/dist-packages/pymongo/connection.py", line 236, in __init__
    max_pool_size, document_class, tz_aware, _connect, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 366, in __init__
    raise ConnectionFailure(str(e))
    ConnectionFailure: [Errno 111] Connection refused

    ----------------------------------------------------------------------
    Ran 7 tests in 0.112s

    FAILED (errors=7)

  102. Da

    mongoDB已经起来了,test_wiki.py可以跑

    spark@spark01:~/cola/tests/contrib$ python test_wiki.py
    /home/spark/cola/cola/core/opener.py:74: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    .
    ----------------------------------------------------------------------
    Ran 1 test in 3.530s

    OK

  103. wood8

    您好,我最这几天断断续续用cola爬了大概2400多个微博用户,单机模式,只爬了用户关系没有爬微博,结果被封的厉害,最多爬三四百个用户后账户就被封了,需要手机验证,昨天晚上连手机验证都不行了,直接被封了,恢复账号需要写申诉……
    想问一下您爬的时候被封的情况怎么样,有什么避免被封的办法吗,十分感谢!

  104. 秦续业 作者

    从新浪之前对好友查看的限制可以看出,新浪对抓取好友列表的情况封锁是很严的,只抓好友肯定会很容易被封的。

    目前的方法你只能是多申请几个账号,短暂被封后可以换账号。从你的情况来看,一直用一个账号就会被封账号。

    另外就是设置抓取速度,不过目前版本这个功能不完善,不过我正在重构整个cola的代码,相信这块在重构完成后应该会相对完善。

  105. wood8

    感谢回复~我原本是想先获取一定量的用户关系做一下分析,微博内容后期也是需要的,这样看来还是同时抓取好了……
    期待cola的完善!

  106. vanglis

    Traceback (most recent call last):
    File "./__init__.py", line 56, in <module>
    load_job(os.path.dirname(os.path.abspath(__file__)))
    File "/to/pth/cola/cola/worker/loader.py", line 417, in load_job
    job_loader.run()
    File "/to/pth/cola/cola/worker/loader.py", line 345, in run
    self.mq.put(self.job.starts)
    File "/to/pth/cola/cola/core/mq/__init__.py", line 121, in put
    self._put(k, v, force=force)
    File "/to/pth/cola/cola/core/mq/__init__.py", line 71, in _put
    self.local_store.put(objs, force=force)
    File "/to/pth/cola/cola/core/mq/node.py", line 157, in put
    m = mmap.mmap(fp.fileno(), self.NODE_FILE_SIZE)
    ValueError: mmap length is greater than file size

    大神求指导报以上错误是什么原因? 我的单机模式下运行的

  107. vanglis

    我用的是ubuntu, 删除了data目录执行还是报错:
    root@xiaohanfei-VirtualBox:/to/pth/cola/contrib/wiki# ./__init__.py
    Traceback (most recent call last):
    File "./__init__.py", line 160, in <module>
    load_job(os.path.dirname(os.path.abspath(__file__)))
    File "/to/pth/cola/cola/worker/loader.py", line 417, in load_job
    job_loader.run()
    File "/to/pth/cola/cola/worker/loader.py", line 345, in run
    self.mq.put(self.job.starts)
    File "/to/pth/cola/cola/core/mq/__init__.py", line 121, in put
    self._put(k, v, force=force)
    File "/to/pth/cola/cola/core/mq/__init__.py", line 71, in _put
    self.local_store.put(objs, force=force)
    File "/to/pth/cola/cola/core/mq/node.py", line 157, in put
    m = mmap.mmap(fp.fileno(), self.NODE_FILE_SIZE)
    ValueError: mmap length is greater than file size

  108. 秦续业 作者

    代码是最新的吗?我记得这个问题在很久以前就在linux系统上修复过。

    如果还是有问题,我晚上会尝试修复。

  109. 在水里

    你好,首先特别非常非常感谢你的分享,让我这个初学者对爬虫有了一个整体的认识~
    然后…想问你几个问题,我仔细看了几天也没出结果,后续毕设时间又太紧,所以不得不麻烦你了,也十分希望你能抽空回答,拜托拜托~~
    因为我做的东西需要抓取同一个地区,同一个时间段,尽可能多的微博,所以我在想办法改代码。
    目前抓取同一个时间段的代码我写了,就是在contrib\weibo的parsers.py中,对mblog.created存储前先做一个判断,符合时间要求的才存入,否则退出解析(……这个思路是对的吧?)
    然后抓取同一个地区,在我看来,这个系统工作的原理是:先抓取指定初始用户的关注列表、粉丝列表,其中的每一个用户都视作一个bundle,然后在抓取完初始用户的所有微博正文、个人信息等后,从队列中选取下一个bundle重复如上步骤。
    所以我如果需要只抓取指定地区的微博,只要在存入初始用户朋友的bundle时加以判断,那么就可以确保我的bundle队列是符合要求的。
    我的代码如下(同样在parsers.py,在UserFriendParser中):
    for li in ul.find_all(attrs={'class': 'S_line1', 'action-type': 'itemClick'}):
    data = dict([l.split('=') for l in li['action-data'].split('&')])
    friend = Friend()
    friend.uid = data['uid']
    friend.nickname = data['fnick']
    friend.sex = True if data['sex'] == u'm' else False
    #
    #我增加的代码,用于解析好友信息后紧接着的地址信息
      #
    locationok = False #locationok标记该好友所在地是否符合要求
    span = ul.find(attrs={'class': 'addr'}) #找到地址标记
    for j in span.stripped_strings:
    friend.location = repr(j) #解析所在地
    if friend.location == "u'\u6c5f\u82cf \u5357\u4eac'":
      #这里为了方便,把我需要的“江苏 南京”也转换成了Unicode进行比较
    locationok = True
    break
    if locationok: #新增这个判断,只有所在地是江苏南京,才存入队列
    bundles.append(WeiboUserBundle(str(friend.uid)))
    if is_follow:
    weibo_user.follows.append(friend)
    else:
    weibo_user.fans.append(friend)
    weibo_user.save()
    但现在出现的问题是,我对初始的一个南京用户进行抓取,系统先抓取了他的粉丝列表中第一次出现的南京用户,放入了队列,然后接下来的用户就是顺序抓取,不分地区了。一开始我以为是我的解析写的有问题(当然现在可能也不排除这可能),但后面发现,导出来的关注、粉丝列表也并不完全是这样,越往后似乎越混乱……
    所以我特别想知道,是不是我对你的系统思路理解还存在比较大偏差,还是就是我的解析代码没写好?
    感谢你能耐心看完,期待你的回复~~~!

  110. ProgramMan

    Hello, im new to python and data mining but while trying to attempt to use this, Im currently using a Mac oxs. And when I run the Cola wiki I keep getting
    Traceback (most recent call last):
    File "__init__.py", line 28, in <module>
    from cola.core.urls import UrlPatterns, Url
    ImportError: No module named cola.core.urls

    I stored my cola-master folder in the site-packages path.

    my current path is

    PATH="${PATH}:/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/cola-master/cola/core/"
    export PATH

    PYTHONPATH="${PYTHONPATH}:/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/cola-master/cola/core/"
    export PYTHONPATH

    What am I doing wrong that it wont crawl Wikipedia? Thanks

  111. 清穆

    你好!费劲千辛万苦终于装好MongoDB后,运行contrib -> weibo -> _init_.py,然而程序却报错,整个屏幕都是红色的...不知道是我哪里没弄好,第一次使用MongoDB...希望能得到您的指点!以下是Python shell返回的红色的错误:
    Warning (from warnings module):
    File "F:\python\crawler\cola-master\cola\core\opener.py", line 74
    self.browser.set_handle_gzip(True)
    UserWarning: gzip transfer encoding is experimental!
    start to get 3211200050
    get 3211200050 url: http://weibo.com/3211200050/follow
    get 3211200050 url: http://weibo.com/3211200050/follow
    get 3211200050 url: http://weibo.com/3211200050/follow
    start to get 1898353550
    get 1898353550 url: http://weibo.com/1898353550/follow
    get 3211200050 url: http://weibo.com/3211200050/follow
    get 1898353550 url: http://weibo.com/1898353550/follow
    get 3211200050 url: http://weibo.com/3211200050/follow
    start to get None
    start to get None
    start to get None
    start to get None
    start to get None
    .
    .
    .

  112. 小码农

    您的程序爬取出来的数据有两个表,weibo_user和micro_blog,weibo_user这个只有用户ID和用户昵称这两个属性,我需要获取用户粉丝数、关注数、微博数、性别等更详细的属性,看到您的storage.py中都有定义相关类,不知道是否能爬取这些属性数据?在哪里修改代码?(我是初学爬虫技术,想做数据分析学习,还望秦大哥见谅,谢谢!)

  113. 秦续业 作者

    cola里应该是会抓取这些信息的,你再试试抓取别的用户,看看有没有这些信息。

  114. 小码农

    我启动的是 \cola-master\contrib\weibo\__init__.py文件,该文件夹下并没有starts文件啊?.\cola-master\contrib\weibosearch\starts.py里面有一个,但没有设置uid的地方呢。倒是在.\cola-master\tests\contrib\test_weibo.py中发现开始就有语句self.test_uid='1784725941'。但运行test_weibo.py这个有错误出现。请问这是怎么回事?
    谢谢!

  115. 小码农

    不好意思,秦哥。。刚刚发现你说的配置starts好像找到了,是在\contrib\weibo\weibo.yaml中
    starts:
    - uid: 3211200050
    - uid: 1898353550 这里设置吧。。
    还是要再次感谢秦哥 答疑!

  116. 小码农

    我在starts中换了两个账号,一个大V一个普通用户,但是爬到的 weibo_user表中仍然还是 uid,nickname这两个属性;micro_bolg中也还是以前的属性。麻烦您再指点下,谢谢!!

  117. dash

    您好,请问你抓到在。yaml中指定uid的用户了么?我抓不到指定uid用户的内容啊,感觉他每次都是随机从某个用户开始是我的错觉么?

  118. 小码农

    我也发现这个问题了,即使在yaml中指定uid,抓取的数据中也没有这个Uid 的。。只能问问博主了@秦续业

  119. 漢典

    好像只有第一次啟動時會抓到在 weibo.yaml 中指定的 start uid,之後就都抓不到嚕
    master 或 develop 分支都一樣 QQ

  120. dash

    你好,请问如果不想使用mongodb而想使用mysql的话需要改那些地方啊,代码大部分没注释看的有点乱。。。。

  121. 小码农

    你好,朋友。请问你有没有爬取到 用户 关注数、粉丝数、性别、位置、简介等属性数据啊?

  122. 小码农

    可能是要进行微博账号设置-常用登陆的地点无需验证的设置,不过我没找到呢,网友有说这么解决的

  123. john

    前几天看新浪的doc时候发现他有一个anti-crwaler department.
    博主怎么看。

  124. 时光机

    Error when fetch url: http://weibo.com/3216506120/follow
    Error when get bundle: 3216506120
    'NoneType' object has no attribute 'find'
    Traceback (most recent call last):
    File "D:\cola-master\cola\worker\loader.py", line 229, in _execute_bundle
    **options).parse()
    File "D:\cola-master\contrib\weibo\parsers.py", line 559, in parse
    return self._error(url, e)
    File "D:\cola-master\contrib\weibo\parsers.py", line 91, in _error
    raise e
    AttributeError: 'NoneType' object has no attribute 'find'

    楼主,帮忙看看这个是被封了么?才跑了没几分钟呢。 自己手动点击了下这个链接,还得让输入验证码。
    http://weibo.com/3216506120/follow

  125. 秦续业 作者

    你是不是只抓取的好友关系,这块新浪限制很严,如果连续过快了以后就会要求输入验证码。

  126. 时光机

    默认的设置,也有micro_blog那个表的,难道新浪现在封得这么厉害了,换了个账号也是一样的报错,就只能跑几分钟内。

  127. 心愿慕竹

    您好,麻烦问一下
    我调用你在opener.py写的SpynnerOpener类时,提示 WARNING: QApplication was not created in the main() thread. 我了解到因为Qt目前是不支持在其他线程中进行界面类操作,需要判断界面应用程序是否在主线程中创建。
    那么请问这个类应该怎样调用,需要修改那些参数,谢谢了~

  128. 心愿慕竹

    因为我现在想抓取的网页内容,是浏览器执行JS脚本之后才有的。
    看到您在之前的回复中提到用cola中的SpynnerOpener类作为opener_cls可以实现。
    但我现在直接在get_job方法中把opener_cls改成SpynnerOpener出现上述错误。
    还麻烦您抽时间解答一下,我暂时不知道怎么解决这个问题,老师给的期限快到了。T_T

  129. 了了

    大神,您好。我用你的程序爬虫,发现不到两个小时就被封号了,不知道您有没有解决的方法没有。

  130. 默默

    你好,因为数据要求,不需要用户信息,只要微博相关信息,怎么修改代码能让爬虫略过用户信息,只保存微博信息(这样好像也可以减少被封的概率)。
    parsers.py storage.py这两个改改就可以了吗?(挺想做成配置式的)

  131. codermo

    这几天用了博主的cola爬了下微博数据,感觉还是很棒的,修改了几处就比较稳定了,比如添加了发送请求之间的时间间隔,配置文件里的哪个limit好像用途不大。只是发现一个问题,有时候在用户粉丝或者关注列表中获取用户ID的时候有可能会获取到"uid" : "1022:100808fb097329ad32dfa1f7a32a935d27071d"这样无意义的ID,从而导致爬到这个用户的时候会404,我大规模爬过几次,基本都以账号异常为终,我估计是爬到这样的用户时就会产生一些错误。
    最后,那个user_info相关的解析已经没用了,好在我只要微博内容数据,还是感谢楼主的辛勤工作和开源的精神!

  132. codermo

    又来留个言把,由于还不太会github,就在这把我做的一些改动提给博主吧,希望能对以后的修改有帮助。
    1.新浪微博官方反爬好像是根据请求时间间隔(或者叫单位时间内的请求次数),直接拿github上下的程序跑的话不到10分钟就会被异常,所以我改了_execute_bundle函数中每次urls遍历后的时间间隔,我测试了几个时间,发现1s-2s比较稳定,连续爬了24小时,没有被异常(当然效率就低了)
    2.上次留言提的,有的userid很奇怪是个无意义的很长的字符串,有时候运气不好,队列中连着好几个都是这样的,看了代码的错误机制,是连续错误5次就退出程序,所以如果偶尔遇到一次这样的ID不会出问题,但连续出错就影响工作了,我目前是指标不治本,单纯的在拿job的时候,判断了job的长度,如果超过12(我看到大部分新浪微博ID为10位数)就直接continue掉本次循环
    3.经过多次爬虫发现最后都会以封号为终,后来总算发现是因为有一些目标用户是异常用户,而parsers.py中check函数仅仅判断了目标用户不存在,对于异常用户,parser无法解析,于是就连续不断的发请求,再配合没有设置异常之后的时间间隔,就会造成连续发送请求的情况,最后就封号了,所以我直接把check函数中的那句判断用户不存在的改成了if dest_url.startswith('http://weibo.com/sorry'): 这样就包含了多种情况。
    4.当前的爬虫是爬取用户的所有微博,也爬取所有关注和粉丝,那如果遇到大V或者明星,就会造成疯狂的读取一个用户的信息,我发现过分读取用户粉丝和关注就会造成系统怀疑封号,因为只想获取用户微博内容,所以我设置了关注页数和粉丝页数都只获取2页,从概率角度讲应该影响不大,同时为了限制获取微博的数量,我加了日期范围判断,比如我只要最近一周的,一旦遇到一条一周前的,就直接停止这个用户的分析,继续队列。

    以上就是我用了几天的一些改动和想法,其中一些可以作为配置加进去,可惜我为了拿到实验数据本打算用java实现,当看到博主的爬虫已经很完善了,才开始学习的python,简直就是菜鸟,无法去科学的完善代码,希望对大家有帮助,也相信cola以后肯定会完善,感谢博主。

  133. 秦续业 作者

    这篇文章回复评论时,不知道nginx为什么老返回超时错误,不晓得是不是评论太多了。

    非常感谢你的回答,还是蛮用心的。

    相信你用的应该是master分支下的代码吧,在develop分支下有最新版本,相比于master分支,有很大进步。

    1、master分支下的limit限制其实作用不大,因为这个时候请求还是一样发出,如果达到了limit限制的次数,休息直到一分钟过去;develop分支下不同,随着运行,cola会计算出一个最佳的时间间隔(根据总的限制,每个worker的限制,以及被封的情况),不过这个功能还没有大规模测试。

    2、这个uid异常还不清楚是什么原因导致,如果下次希望能重现页面

    3、这个我会修改代码。

    4、这个情况在develop分支也有所改善,首先,此时已经支持多优先级队列(设置中priority个数表明多少个优先级),每个优先级队列调度的时间随着优先级降低而递减,因此可以把微博特别多的用户优先级设置低;其次,每个bundle抓取的时间也有了限制,当超出限制还没完成,则保存现场,并会换个bundle继续抓取。

    希望以后还能继续支持cola,我也会把cola做得更好。

  134. Simon

    系统非常稳定.抓取了几十个用户的微博.非常感谢。

    但是,不知道怎么才能让cola继续抓取这些用户后来添加的新微博内容。现在,好像cola抓取完成后,就会反复提示“no budget left to process”,不会抓取新增加的微博内容.即使关掉cola,重新再运行,也还是这样。

  135. y5m2l0wenjian

    你好,还想问一下这个系统能抓取到新浪微博用户的基本信息及其粉丝列表和关注列表以及微博内容吗??最近做一项目,需要获取新浪微博用户的基本信息以及其的关注列表和粉丝列表和微博内容,搞了好久都没搞出来,看到这个cola,感觉看到了希望,望作者尽快回复一下。。。谢谢!!!

  136. y5m2l0wenjian

    没能搞清楚到底应该怎么用!!!!刚接触Python,github也不懂,希望各位大神帮忙指导指导!!!

  137. fengjackling

    博主,能稳定爬取新浪微博的时间间隔限制是多少?(我用develop版本的)之前没有限制被永久封了账号。谢谢!

  138. aite

    你好:想用你写的这个cola抓写实验数据,但是发现运行是出现如下错误:
    E:\Software\Experiment\cola\contrib\weibo>python __init__.py
    E:\Software\Experiment\cola\cola\core\opener.py:74: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "E:\Software\Experiment\cola\cola\worker\loader.py", line 314, in _call
    if not self._login(opener):
    File "E:\Software\Experiment\cola\cola\worker\loader.py", line 188, in _login
    login_result = self.job.login_hook(opener, **kw)
    File "E:\Software\Experiment\cola\contrib\weibo\__init__.py", line 40, in login_hook
    return loginer.login()
    File "E:\Software\Experiment\cola\contrib\weibo\login.py", line 107, in login
    json_data = json.loads(regex.search(text).group(1))
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Python27\lib\json\decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

    Exception in thread Thread-3:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "E:\Software\Experiment\cola\cola\worker\loader.py", line 314, in _call
    if not self._login(opener):
    File "E:\Software\Experiment\cola\cola\worker\loader.py", line 188, in _login
    login_result = self.job.login_hook(opener, **kw)
    File "E:\Software\Experiment\cola\contrib\weibo\__init__.py", line 40, in login_hook
    return loginer.login()
    File "E:\Software\Experiment\cola\contrib\weibo\login.py", line 107, in login
    json_data = json.loads(regex.search(text).group(1))
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Python27\lib\json\decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

    Finish visiting pages count: 0
    Finish visiting pages count: 0
    没办法解决,请你帮忙看一下,谢谢

  139. 了了

    博主,您好。很希望您回复。
    在集群中,使用stopRunningJobByName时出现了如下的错误:
    File "xxxx/core/rpc.py", line 48, in client_call
    return getattr(serv, func_name)(*args)
    File "/usr/lib/python2.7/xmlrpclib.py", line 1224, in __call__
    return self.__send(self.__name, args)
    File "/usr/lib/python2.7/xmlrpclib.py", line 1578, in __request
    verbose=self.__verbose
    File "/usr/lib/python2.7/xmlrpclib.py", line 1264, in request
    return self.single_request(host, handler, request_body, verbose)
    File "/usr/lib/python2.7/xmlrpclib.py", line 1297, in single_request
    return self.parse_response(response)
    File "/usr/lib/python2.7/xmlrpclib.py", line 1473, in parse_response
    return u.close()
    File "/usr/lib/python2.7/xmlrpclib.py", line 793, in close
    raise Fault(**self._stack[0])
    Fault: <Fault 1: "<type 'exceptions.IndexError'>:mmap slice assignment must be a string">

    后来多试几次,发现在不同地方client_call也许都会出现这种错误。望您帮忙看看,谢谢。

  140. 了了

    1. 自己调试,发现是在mq/node.py中将集群其他节点正在运行obj进行备份时有误。mmap必须写入utf-8格式的字符串,通过XML-RPC机制传输的不知道为什么变成了ascii字符(unicode字符)。所以在写入mmap时加入对obj的判断即可。
    2. 另外一个问题是发现job的master_port关闭和集群间节点正在执行obj备份是异步的,所以有的时候出现connection refused的情况。

  141. 叶关

    博主,您好,能否回复下。
    单机模式,爬新浪微博,但是遇见下面问题,望能给予帮助。
    C:\Python27\lib\site-packages\cola\core\opener.py:74: UserWarning: gzip transfer encoding is experimental!
    self.browser.set_handle_gzip(True)
    Exception in thread Thread-3:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "C:\Python27\lib\site-packages\cola\worker\loader.py", line 314, in _call
    if not self._login(opener):
    File "C:\Python27\lib\site-packages\cola\worker\loader.py", line 188, in _login
    login_result = self.job.login_hook(opener, **kw)
    File "C:\Python27\Lib\site-packages\cola-master\contrib\weibo\__init__.py", line 41, in login_hook
    return loginer.login()
    File "C:\Python27\Lib\site-packages\cola-master\contrib\weibo\login.py", line 107, in login
    json_data = json.loads(regex.search(text).group(1))
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Python27\lib\json\decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
    File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
    File "C:\Python27\lib\site-packages\cola\worker\loader.py", line 314, in _call
    if not self._login(opener):
    File "C:\Python27\lib\site-packages\cola\worker\loader.py", line 188, in _login
    login_result = self.job.login_hook(opener, **kw)
    File "C:\Python27\Lib\site-packages\cola-master\contrib\weibo\__init__.py", line 41, in login_hook
    return loginer.login()
    File "C:\Python27\Lib\site-packages\cola-master\contrib\weibo\login.py", line 107, in login
    json_data = json.loads(regex.search(text).group(1))
    File "C:\Python27\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    File "C:\Python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "C:\Python27\lib\json\decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

    Finish visiting pages count: 0
    Finish visiting pages count: 0

  142. 刀刀宁

    Mac下跑单机版weibo爬取程序,CPU占用率非常高,一般在130%,造成散热孔极热。
    应该是有速度限制时调用sleep函数造成的?

  143. 刀刀宁

    这个比微博上直接询问你要早。Dev没有这个问题了,但是好像这个版本跟容易遇到一些其他问题。暂时还没归纳。

  144. totti

    博主,请问下,wiki上如何获取url的,我现在仿照wiki自己写了一个抓取的demo,进不了parser,打印发现获取不到url,是为什么,急切想知道原因,先谢谢了

  145. Qing

    您好!谢谢您让我知道Cola这个好东西,但是最近在使用时遇到一个问题:
    使用cola-master单机版时,我在weibo.yaml里改动了两个参数starts:-uid 315558336,size由默认的100改为了1000,但是最后程序显示只爬了73个页面,而且MongoDB里没有315558336发布的微博,不知道是不是我哪儿配置错了。
    希望能收到您的回答,谢谢了!

  146. 秦续业 作者

    可能你之前先启动过,然后导致后面改了初始的uid,而没有抓到。

    建议使用develop分支,而不是master分支试试。

  147. Qing

    的确是您说的那样,之前我启动过...也就是说,单机模式cola-master即使程序运行结束,没有爬完的队列也不会清空,这样理解没错吧?
    另外,联机的话cola-master应该没有这个问题吧?

    弱弱地问一句:看爬虫weibo的源码,怎么感觉都是类和函数,我找不到程序运行的顺序,或者说我把weibo文件夹里的文件看了一遍,但是我还是不知道数据都是怎么流动,看到的只是一个个分立的函数和类。之前用python写程序都是小打小闹,用面向过程的方法写的,一下子没看懂weibo...希望能得到您的指点...

    谢谢!

  148. 秦续业 作者

    分布式也可能有这个问题的,如果用develop分支(最近几天会merge到master),可以配置文件中clear设置为yes,则每次会清除上次的队列,重新运行。

    第二个问题,像weibo或者wiki这种,都只是应用,核心的调度或者数据的流动对用户都是透明的,核心代码可以看cola目录下的代码。

  149. Qing

    我会在github上持续关注Cola的!
    另外,能不能手动把master里待挖掘的id的缓存清除?

  150. 英国病人

    你好

    我是对门华师的研究生,最近在使用你开发的Cola。首先感谢你同我们分享花费了你很多精力开发的cola,而且耐心的解答大家的问题。

    使用下来,我有一些疑问:
    1.cola的weibo抓取功能在抓取了99条微博左右就自动停止了,请问是不是被新浪反爬了?
    2.cola的weibosearch功能运行之后,没有报错但是也没有成功,mongoDB里也没有新增weibosearch这个数据库。请问这是为什么呢?是不是我配置出错了。
    3.cola可以新增抓取微博内容里的地理位置吗?实现这个功能是否很难?

    谢谢

  151. Qing

    您好!
    按照您的建议,我在develop上运行了单机模式,发现第一次运行develop,clear为no才能正常工作,为yes会抓不到数据;第二次之后是yes,则能达到清除队列的效果。
    然后是粉丝的抓取好像不是很准确:我爬了两个号,第一个号前面6个粉丝没抓到,但是那6个人之后都能抓到,甚至还抓到了用浏览器看不到的几个人(因为浏览器限制看5页,无法断定他们是不是粉丝);
    另一个号的粉丝则很奇怪,好像抓到的都不是粉丝,不知道是不是存入数据库的时候乱了。
    关注的抓取则很准确。

  152. Qing


    1993292930和1645101450,前一个用户粉丝抓的有点儿乱了;后一个用户前面6个粉丝没抓到,后边多了几个用浏览器查看不到的用户...

    麻烦您了...

  153. Qing

    您好!
    今天跑了您更新的cola-develop,但是程序没法运行,估计是login的问题,因为之前忘了输用户名和密码得到的是一样的错误。完整的错误信息如下:

    C:\Users\yc>F:\python\crawler\cola-develop\contrib\weibo\__init__.py
    F:\python\crawler\cola-develop\cola\core\opener.py:108: UserWarning: gzip transf
    er encoding is experimental!
    self.browser.set_handle_gzip(True)
    F:\python\crawler\cola-develop\cola\core\opener.py:108: UserWarning: gzip transf
    er encoding is experimental!
    self.browser.set_handle_gzip(True)
    Process Process-3:
    TPraceback (most recent call last):
    rocess Process-2:
    T File "F:\python\python\lib\multiprocessing\process.py", line 258, in _bootstr
    ap
    raceback (most recent call last):
    File "F:\python\python\lib\multiprocessing\process.py", line 258, in _bootstra
    p
    self.run()
    self.run()
    File "F:\python\python\lib\multiprocessing\process.py", line 114, in run
    File "F:\python\python\lib\multiprocessing\process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
    self._target(*self._args, **self._kwargs)
    File "F:\python\crawler\cola-develop\cola\job\container.py", line 135, in run

    File "F:\python\crawler\cola-develop\cola\job\container.py", line 135, in run
    self.init()
    self.init()
    File "F:\python\crawler\cola-develop\cola\job\container.py", line 90, in init

    File "F:\python\crawler\cola-develop\cola\job\container.py", line 90, in init
    self.init_tasks()
    self.init_tasks()
    File "F:\python\crawler\cola-develop\cola\job\container.py", line 107, in init_
    tasks
    File "F:\python\crawler\cola-develop\cola\job\container.py", line 107, in ini
    t_tasks
    is_local=self.is_local, job_name=self.job_name)
    is_local=self.is_local, job_name=self.job_name)
    File "F:\python\crawler\cola-develop\cola\job\task.py", line 85, in __init__
    File "F:\python\crawler\cola-develop\cola\job\task.py", line 85, in __init__
    self.prepare()
    File "F:\python\crawler\cola-develop\cola\job\task.py", line 106, in prepare
    self.prepare()
    self.executor.login()
    File "F:\python\crawler\cola-develop\cola\job\task.py", line 106, in prepare
    File "F:\python\crawler\cola-develop\cola\job\executor.py", line 160, in logi
    n
    self.executor.login()
    if not self._login(shuffle=random):
    File "F:\python\crawler\cola-develop\cola\job\executor.py", line 160, in login
    File "F:\python\crawler\cola-develop\cola\job\executor.py", line 183, in _logi
    n
    if not self._login(shuffle=random):
    login_result = self.job_desc.login_hook(self.opener, **kw)
    File "F:\python\crawler\cola-develop\cola\job\executor.py", line 183, in _log
    in
    File "F:\python\crawler\cola-develop\contrib\weibo\__init__.py", line 40, in lo
    gin_hook
    return loginer.login()
    login_result = self.job_desc.login_hook(self.opener, **kw)
    File "F:\python\crawler\cola-develop\contrib\weibo\login.py", line 107, in lo
    gin
    File "F:\python\crawler\cola-develop\contrib\weibo\__init__.py", line 40, in lo
    gin_hook
    json_data = json.loads(regex.search(text).group(1))
    return loginer.login()
    File "F:\python\python\lib\json\__init__.py", line 338, in loads
    File "F:\python\crawler\cola-develop\contrib\weibo\login.py", line 107, in log
    in
    json_data = json.loads(regex.search(text).group(1))
    File "F:\python\python\lib\json\__init__.py", line 338, in loads
    return _default_decoder.decode(s)
    return _default_decoder.decode(s)
    File "F:\python\python\lib\json\decoder.py", line 365, in decode
    File "F:\python\python\lib\json\decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "F:\python\python\lib\json\decoder.py", line 383, in raw_decode
    File "F:\python\python\lib\json\decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded
    ValueError: No JSON object could be decoded
    Counters during running:
    {}
    Processing shutting down
    Shutdown finished
    Job id:8ZcGfAqHmzc finished, spend 10.99 seconds for running


    之后我用以前的版本覆盖您今天更新后的,但程序依然报错,换了几个账号,试着挖几个不同的uid,结果都是上面的错误。好像第一次运行develop,clear填no的时候报的错误也是这样。

    您能否指点一二??

  154. 秦续业 作者

    应该是账号的问题,你在浏览器里登录看看是不是账号需要手机验证之类的。

    抓的速度可能过快被封,记住用小号,速度不要过快。

  155. Qing


    刚刚用浏览器登录了,没让我输验证码...

    抱歉,这会儿才看到,刚才用别人的电脑试了下,换了三个账号都不行,使用master也一样。
    有种神经被绷紧的感觉...

    您那儿能登进去吗?

  156. Qing

    一把辛酸泪啊,没改配置...以下是yaml里的配置信息。其他地方就真没改动了...

    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: 2
    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: ############ username
    password: ############ password
    starts:
    - uid: 5545466650
    - uid: 1601563722
    fetch:
    forward: no
    comment: no
    like: no
    clear: no

  157. Qing

    前天晚上都能运行的,今天早上看到您更新了,就下了最新版的develop,直接覆盖了之前的版本,而且,最开始我忘了在yaml里输用户名和密码,之后就发现程序报错了。然后,我输入了用户名和密码,结构还是报一样的错,晚上试了试也是这样...
    真是纠结...

  158. 秦续业 作者

    注释删掉能正常运行么?

    最好是不要用下载覆盖的方式,用git来更新代码。我最近的更新不会涉及到以前的代码改动。

  159. Qing

    趁着您这会儿在,能否多问您个问题?

    mblog.created = parse(div.select('a.S_link2.WB_time')[0]['title'])
    if self.bundle.last_update is None or mblog.created > self.bundle.last_update:
    self.bundle.last_update = mblog.created
    if weibo_user.last_update is not None and \
    mblog.created <= weibo_user.last_update:
    finished = True
    break

    这几行代码没看懂,主要是在weibo.com上没找到a.S_link2.WB_time这个节点...

  160. 秦续业 作者

    这个可能是因为现在cola获取的网页不是最新的方式了,这些标签可能不存在。这个需要确认一下。

  161. Qing


    感觉应该是这样的,用firebug看过一次,没找到这个节点。程序运行时也总是在这个语句上报错...

  162. Qing

    秦大哥:

    真的是注释的问题。。注释之后怎么会有影响。。(强烈建议您在博客回复区内置些表情来表达我现在的心情)

  163. 秦续业 作者

    应该是读取配置的库的问题,有可能把注释读进来……

    我的错,以后文档这些问题都写上……遇到问题,直接问我就行。前提是,一段时间尝试解决不能的问题哈……

  164. Qing

    太感谢您了!
    能解决的问题我自己能搞定的,搞不定的再问您~

    我在试着看懂您的代码...都是类、函数,我可能火候还没到...

  165. Qing

    wiki上有您的大体上的思路,要是能具体一点儿就好了。比如说,您是怎么解决AjAx动态更新网页的问题,mid的作用,评论、赞、转发的抓取是在哪个网页上(因为我看到了关于评论、赞和转发另一个网页,而不是在weibo.com上)...

    我的问题可能有点儿多,因为在这方面的资料比较少。之前在博客园看到侯凯关于模拟登录的分析,但是我自己用httpfox去看,东西就明显不一样了。

    在weibo.cn上爬东西很简单,但是网页版的就不一样了...

  166. lomiz

    你好,
    在运行DEMO, weibo的时候存在一个问题呃
    处理用户信息时,每一条都在这里出错
    block_title = block_div.find('h4', attrs={'class': 'obj_name'}).text.strip()
    返回值NoneType


    配置文件如下, 打开了forward选项,修改了size
    job:
    db: sina_forward
    mode: bundle # also can be `bundle`
    size: 1000 # 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: 2
    priorities: 3 # priorities queue count in mq
    copies: 1 # redundant size of objects in mq
    inc: yes
    shuffle: yes # 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: ***.***.***.***
    port: 27017
    login:
    - username: *****
    password: *****
    starts:
    - uid: 3211200050
    - uid: 1898353550
    fetch:
    forward: yes
    comment: no
    like: no
    clear: no

    另外还有几个问题

    cola-develop的weibo DEMO
    stop.py似乎因为你已经加入程序中的中断机制而没有什么作用,反而会因为缺少库报错。。。


    cola-master部分(我使用的6月1日下载的版本

    在cola-master 的weibosearch这个DEMO里,
    stop.py 有一个小BUG,好像一直没改, 是第44行,recover(),应该在括号里加入job_path吧。

    15.6.14 ,广东电信网络测试下,weibosearch的WeiboLogin类无法用于登录
    SpynnerOpener 已经无法用于获取登录框架了。
    执行时会一直卡在weibosearch/login.py的第32行
    self.opener.wait_for_selector('div.info_list')
    是新浪官方封锁了吗? 网页原代码晨这一项还有呃


    最后是我想修改cola-master里(cola-develop一直不正常工作)
    weibo DEMO部分,
    想使用 转发微博中的uid 来扩充队列
    不太理解cola的消息队列工作方式,请问如何修改呢?

    这个爬虫运行效果非常好,膜拜ing~

  167. 秦续业 作者

    每个问题回答一下:

    1、出现这个错误,可能是新浪微博改版,导致某处解析出错,cola的解析需要不断更新,来适应网页变化

    2、develop分支的停止直接CTRL+C,不需要stop了,等merge过去master分支就没有stop.py了,因此recover.py也不需要了

    3、weibosearch在写完以后没更新过,以后应该会整个重写

    4、用转发微博的uid来扩充队列的话,按以前的方式,你可以返回一个队列元组,([], []),第0个应该是接下来的url列表,第1个就是bundle列表,所以你可以把这些uid接入到第1个变量中;besides,在develop分支,接下来会支持另外一种方式,可以直接在parser里用yield关键字,比如说解析到一个url,直接yield url;解析到一个bundle,那么就yield WeiboBundle(uid),即可

    感谢这么多反馈。

  168. 德维恩

    你好,最近学习了您的cola代码,想请问一下关于MQ的问题,MQ在被get()一个元素后,不应该把该元素的备份数据也删除的吗?如果不删除备份数据,那么在某些情况下这个元素是不是还会被恢复啊,比如在删除某一个MQ节点的情况下,被删除的元素的备份数据是不是还会被重新put到某一个Node节点上。谢谢!

  169. 秦续业 作者

    这个问题很好。

    在cola的机制里,mq里get一个元素的时候,是不会删除备份元素的,原因呢有以下几个。
    1)get到一个元素接下来是未知的,如果出错的话,处理流程会相当复杂
    2)get一个元素,在备份里删除实现比较困难
    3)其实一个元素被重新唤起执行并不是灾难性的,我们优先保证的是数据的不丢失,重复的数据抓取可以在另一层面,比如说存储来做一次过滤。因为cola本身的去重机制,实际上这个层面的操作的开销是极小的。

  170. cauthy

    您好,能不能请教下你在cola编写的过程中是怎么进行调试的,尤其涉及到subprocess.Popen这种的您是如何进行调试的?谢谢。

  171. 秦续业 作者

    cola编写过程的调试呢,主要还是做到模块的隔离,单独对每个模块单元测试。

    而整个cola执行的过程中是可以包含多线程和多进程模式(依赖于任务数和核的数量)的,多线程相对简单,一般的IDE都能断点进去调试。多进程比较麻烦,目前也没什么好办法,通常通过log日志吧。

  172. dywane

    您好,看了下您的代码,想请问下这个框架是基于什么样的抓取需求编写的,该框架适合于什么样的业务场景?谢谢。

  173. 秦续业 作者

    当时是写新浪微博的数据抓取时,觉得可以归纳出一个通用的数据抓取框架,让用户把主要的精力放在处理取到的网页,从中抽取需要的信息。而包括分布式架构、去重、使用代理、控制抓取速度等等功能都应该交由框架来处理。

  174. 德维恩

    楼主好,再请教几个问题。
    我的问题还是基于我在7月份下的您的代码的问题,并不是基于您的最新代码。
    1.MessageQueue类中的remove_node方法中,在将被删除节点在其他节点上的数据恢复出来的时候,“self.local_store.put(obj)” 为什么不是将obj对象put到重新调整后的hashring上去,而是将obj对象直接put到本地的Node存储中。
    2.Node类中的merge方法中:
    for idx, f in enumerate(self.map_files):
    if not f.endswith(str(idx+1)):
    dir_ = os.path.dirname(f)
    self._remove_handles(f)
    self.map_files.remove(f)

    new_f = os.path.join(dir_, str(idx+1))
    os.rename(f, new_f)
    self.map_files.append(new_f)
    self._add_handles(new_f)
    这几行代码的意思我没太理解,能否讲解一下,谢谢!

  175. hwj727

    秦大哥,您好!现在微博账号登录好像强制需要验证码了,我注册了两个账号都是。所以我在运行您的weibo爬虫时,提示以下错误:
    Traceback (most recent call last):
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
    File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/container.py", line 135, in run
    self.init()
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/container.py", line 90, in init
    self.init_tasks()
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/container.py", line 107, in init_tasks
    is_local=self.is_local, job_name=self.job_name)
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/task.py", line 86, in __init__
    self.prepare()
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/task.py", line 107, in prepare
    self.executor.login()
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/executor.py", line 161, in login
    if not self._login(shuffle=random):
    File "/usr/local/lib/python2.7/dist-packages/Cola-0.1.0beta-py2.7.egg/cola/job/executor.py", line 184, in _login
    login_result = self.job_desc.login_hook(self.opener, **kw)
    File "/cola/cola/app/weibo/__init__.py", line 42, in login_hook
    return loginer.login()
    File "/cola/cola/app/weibo/login.py", line 107, in login
    json_data = json.loads(regex.search(text).group(1))
    File "/usr/lib/python2.7/json/__init__.py", line 338, 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
    Counters during running:
    {}
    Processing shutting down
    Shutdown finished
    Job id:8ZcGfAqHmzc finished, spend 10.05 seconds for running

    请问这是不是由于没有验证码导致不能完成登录,所以才会报错啊?多谢~

  176. 秦续业 作者

    看错误是这样。

    看了下,好像现在微博又搞了个什么登录保护,现在我登录也需要验证码。
    不清楚有没有什么办法关闭。

  177. 秦续业 作者

    测试了一下,我这里还是能登录的。

    我猜想,对于以前的帐号,如果设置了登录地址无需验证码,这个机制可能还有效。

    新申请的帐号,可能已经没有设置的入口了。

    所以这个问题需要再验证一下。

  178. hwj727

    感谢秦大哥在百忙之中为我解答疑惑。我刚才又重新运行weibo爬虫,发现可以爬取了。我觉得可能是前两天我多次尝试登陆导致登陆保护,因此需要输入验证码。但有一点可以肯定,现在注册的微博账户,都没有了你们提到的允许异地登陆选项,现在只有登陆保护这一项。我会好好研究你的cola爬虫框架,开源力量,辛苦你了~

给作者留言

关于作者

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

博客分类

点击排行

标签云

扫描访问

主题

残阳似血的微博