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
joddeapple
V2EX  ›  Python

求教:初学 python,写了一个搜集豆瓣图书评价信息的爬虫, 但是运行时间过长.

  •  
  •   joddeapple · 2015-03-11 22:10:25 +08:00 · 4500 次点击
    这是一个创建于 3537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    主要是里面的一个正则表达式在处理文本的时候用很长时间,导致程序几乎不可用.
    turple_list = re.findall(r'href="(http://book.douban.com/subject/\d+?/)"\s+?title="(.+?)".+?"rating_nums">(.+?)<.+?class="pl">.+?(\d+?)人评价)',text,re.DOTALL)

    有没有什么办法改进呢?

    求指教.

    源代码:https://github.com/nexusfool/project_code/blob/master/s_book.py

    16 条回复    2015-04-01 13:33:25 +08:00
    ljcarsenal
        1
    ljcarsenal  
       2015-03-11 22:38:07 +08:00   ❤️ 1
    用 标签筛选器 会不会快点。。
    cxshun
        2
    cxshun  
       2015-03-11 22:58:14 +08:00   ❤️ 1
    正则表达式会慢很多,既然是HTML,建议用xpath。
    JoeShu
        3
    JoeShu  
       2015-03-11 23:01:15 +08:00
    1. 用scrapy
    2. 用requests+beautifulsoup+multiprocess
    joddeapple
        4
    joddeapple  
    OP
       2015-03-11 23:01:59 +08:00
    @cxshun
    @ljcarsenal
    这两种东西都是第一次听到,谢谢
    joddeapple
        5
    joddeapple  
    OP
       2015-03-11 23:05:30 +08:00
    @JoeShu 我去看看,谢谢
    egrcc
        6
    egrcc  
       2015-03-11 23:46:02 +08:00
    确定是正则表达式的问题?正则的速度应该不慢才对
    chevalier
        7
    chevalier  
       2015-03-11 23:47:24 +08:00
    用scrapy自带的xpath试试,也很快
    ericls
        8
    ericls  
       2015-03-11 23:49:13 +08:00
    如果想学习
    建议asyncio + 各种选择器
    icedx
        9
    icedx  
       2015-03-11 23:52:49 +08:00
    Python 的正则能用?
    binux
        10
    binux  
       2015-03-12 00:09:42 +08:00   ❤️ 3
    你的问题出在 .+? 和 re.DOTALL 上

    .+? 全字符匹配,导致匹配栈太深
    re.DOTALL 导致文字过长

    一般情况下,正则是比建树要快的,但是你正则写得太烂也没有办法
    icedx
        11
    icedx  
       2015-03-12 00:20:46 +08:00   ❤️ 1
    本来是想写个完整版的
    但是看到虫子菊楼上回了... 唉...
    身为弱渣的我...

    一半将就看吧
    https://gist.github.com/anonymous/9cc4e94afb244f335fee
    hiddenman
        12
    hiddenman  
       2015-03-12 10:38:37 +08:00
    豆瓣是学习爬数据的天堂。。
    StrayBugs
        13
    StrayBugs  
       2015-03-12 19:34:05 +08:00
    大致看了一下,主要应该不是正则的问题,而是你把所有的结果都合并成一条 string 了。页与页都是独立的,你用 list 放每个页面,再分别匹配就好啦。
    zhcheng
        14
    zhcheng  
       2015-03-12 19:45:23 +08:00
    我不会。 最近在学Python 。
    下面是收藏的一个来自 知乎 [关于Python 实现爬虫] 的回答, 有提到性能优化。希望有所帮助

    http://www.zhihu.com/question/20899988/answer/24923424
    joddeapple
        15
    joddeapple  
    OP
       2015-03-15 08:05:32 +08:00
    谢谢大家的帮助.
    ming2281
        16
    ming2281  
       2015-04-01 13:33:25 +08:00
    一般爬虫运行得比较慢的话,我基本转向threading和multiprocessing
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2935 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:31 · PVG 21:31 · LAX 05:31 · JFK 08:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.