V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
macleek
V2EX  ›  Python

求高手指点怎样用pyhon多线程抓取网页?

  •  
  •   macleek · 2013-08-12 19:43:57 +08:00 · 4231 次点击
    这是一个创建于 4124 天前的主题,其中的信息可能已经有所发展或是发生改变。
    单线程发现太慢了!请教一下应该怎样用多线程抓取网页呢?
    我要做的事情是,用python将数字:从1到1000000,依次post到某个页面,然后分析提取有关信息。但是用for 循环似乎不显示,假设我的带宽,cpu比较好的情况下,比如带宽20Mbit,cpu 3ghz,应该怎样写呢?
    求高手指点啊。
    9 条回复    1970-01-01 08:00:00 +08:00
    macleek
        1
    macleek  
    OP
       2013-08-12 19:46:41 +08:00
    还有个一个问题,如何抓取带有时间戳的图片呢,比如这样一个url http://xxxxcom/GraphServlet?graphId=100020&time=1376306512081
    yangg
        2
    yangg  
       2013-08-12 19:49:28 +08:00
    urls = ['http://url/' % i for i in range(1, 1000000)]
    pool = multiprocessing.Pool(50)
    res = pool.map(dosth, urls) # 这里可以取出所有dosth返回的结果数组,不知道这么大的数据,这么写会不会有问题

    def dosth(url):
    # do
    mdjhny
        3
    mdjhny  
       2013-08-13 16:52:08 +08:00
    只需要维护两个队列,做好出错处理就行,这里有一个简陋的
    http://mdjhny.github.io/a-producer-and-consumer-multithread-spider.html
    sivacohan
        4
    sivacohan  
       2013-08-13 17:04:45 +08:00 via Android
    gevent
    yakczh
        5
    yakczh  
       2013-08-13 17:26:42 +08:00
    多线程的话每个线程每抽取一个链接,都是去一个全局的注册器看这个链接是不是已经处理过, 不如按任务开始做好分工, 多进程并发多个抓取队列,这样对资源的争用要少些
    binyuJ
        6
    binyuJ  
       2013-08-13 21:19:01 +08:00
    短时间对同一个网站弄这么多请求会不会把网站弄挂掉(-_-)ゞ゛或者自己电脑挂掉
    为什么不试试直接用 thread、threading
    11
        7
    11  
       2013-08-13 21:23:10 +08:00
    初级的简单的就用 threading 吧。

    要是会玩就用 gevent 吧。
    likuku
        8
    likuku  
       2013-08-13 23:37:51 +08:00
    可以用for遍历数列,每一个元素单独开出个子进程,每开一定数量子进程,暂停1~2秒,然后继续遍历开子进程。

    参考 subprocess 模块。
    likuku
        9
    likuku  
       2013-08-13 23:41:43 +08:00
    开子进程不会受限于GIL(Python的线程用GIL调度,一个程序进程里的所有线程共享这个进程的资源,你有32核CPU,只开一个进程的话,所有线程也只能用到1个核)。

    子进程里带入数组元素作为参数传给子进程启动的独立程序,独立程序读取参数,执行抓取任务。结果输出,可以每个自进程都写入某共享数据库,或者独立开个文件记录。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:29 · PVG 06:29 · LAX 14:29 · JFK 17:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.