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

写了一个python脚本抓取数据,运行没多久就会卡住不动,麻烦帮忙看一下

  •  
  •   gracece ·
    gracece · 2013-07-20 21:40:29 +08:00 · 8771 次点击
    这是一个创建于 4144 天前的主题,其中的信息可能已经有所发展或是发生改变。
    贴gist好像乱了,view raw: http://t.cn/zQtcsQv (短网址防止v2ex自动识别gist)



    主要功能是根据已知的考生号和姓名(生日未知)去抓取高考录取结果。程序跑没多久就会卡住不动,刚学python不是太懂哪里出了问题,麻烦大家帮忙看看,谢谢!
    第 1 条附言  ·  2013-07-20 22:25:34 +08:00
    应该是网络问题,放到vps上能跑
    7 条回复    1970-01-01 08:00:00 +08:00
    SR1
        1
    SR1  
       2013-07-20 21:48:58 +08:00   ❤️ 1
    会不会是你发起连接过多,
    被服务器限制了或者服务器本身性能不佳所以卡住了

    你设置一下超时时间,如果超时的话重新发起一次请求试试
    yuelang85
        2
    yuelang85  
       2013-07-20 23:05:19 +08:00   ❤️ 1
    同意1楼,设定下超时看看?

    别的问题没看出来,看出两个地方有性能问题:

    第一个:
    22行:你这里字符串拼接用的是 加法,这样会导致产生八十多个字符串对象,而且第N+1号字符串是第N号字符串超集。如果文本够大,你这个将会严重侵占内存。建议改成这种形式(行首句点表示缩进):

    result = []
    for line in response:
    ....result.append(line)

    result_str = ''.join(result)


    第二个,37行,三处问题。

    1,range这个函数会生成list对象,浪费,建议使用xrange,他生成 迭代器,可以提高速度。

    2,i这个变量,实际上是做为坐标取birthdayRange的值,那么这里就没有必要len(birthdayRange),而且还range一下。直接for i in birthdayRange,迭代birthdayRange的各个元素。

    3,range(len(birthdayRange))在这种上下文中,用起来不好(xrange也是),比较高效的用法:

    i = 0
    max = len(birthdayRange)
    while i < max: #这里用max是因为如果直接用len(),len函数会被调用len(birthdayRange) 遍。
    ....pass #该干啥干啥
    ....i+=1

    如果你又需要序号i,有需要使用birthdayRange的元素,那么用enumerate。
    pubby
        3
    pubby  
       2013-07-20 23:13:35 +08:00 via Android
    抓取这种活,不要太爆力,自觉保持一个正常点的频率。
    gracece
        4
    gracece  
    OP
       2013-07-20 23:36:32 +08:00
    @yuelang85 感谢建议!
    Zuckonit
        5
    Zuckonit  
       2013-07-22 08:44:40 +08:00
    strace 看一下
    z50hz1988
        6
    z50hz1988  
       2013-07-22 17:54:02 +08:00
    用代理哇... 少年! 偷东西你还大义凛然的... 这样不好吧.
    gracece
        7
    gracece  
    OP
       2013-07-22 23:40:53 +08:00 via Android
    @z50hz1988 这也会查水表?不太清楚犯了哪一条,还望指导。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:09 · PVG 04:09 · LAX 12:09 · JFK 15:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.