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
Cloudreve
Cloudreve 可助您快速搭建网盘,支持权限控制、分享、在线协作、离线下载、WebDAV 等丰富特性。
Promoted by AaronLiu00
gracece
V2EX  ›  Python

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

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

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import urllib
    import urllib2
    import csv
    def post(url,data):
    """for score post """
    req = urllib2.Request(url)
    data = urllib.urlencode(data)
    opener = urllib2.build_opener()
    response = opener.open(req,data)
    lnum = 0
    result =""
    for line in response:
    lnum += 1
    if lnum == 81:
    if(line.find('未能查到') != -1):
    return "\nnot found!"
    if(lnum >= 80) and (lnum <=83):
    result +=line
    return result
    def main():
    """main"""
    postUrl ="http://120.197.89.132:8800/myExamWeb/wap/school/gaokao/loveHS!dispatcher.action"
    mobileNo = "13800138000"
    birthdayRange = ['9310','9311','9312','9401','9402','9403','9404','9405','9406',\
    '9407','9408','9409','9410','9411','9412','9501','9502','9503','9504','9505',\
    '9506','9507','9508','9509','9510','9511','9512','9601','9602','9603']
    reader = csv.reader(open("Book1.csv"))
    for examReferenceNo,userName in reader:
    print examReferenceNo
    print userName
    open("result.txt",'a+').write("\n"+examReferenceNo+userName+"\n")
    for i in range(len(birthdayRange)):
    print birthdayRange[i]
    birthday = birthdayRange[i]
    data = {'id':'14356B43-7F8B-4B00-BB13-F95841F33C46','userName':userName,'examReferenceNo':examReferenceNo,\
    'birthday':birthday,'mobileNo':mobileNo}
    response = post(postUrl,data)
    print response
    open("result.txt",'a+').write(response)
    open("result.txt",'a+').write('<p>' + birthday + '</p>\n')
    if __name__ == '__main__':
    main()
    view raw p.py hosted with ❤ by GitHub


    主要功能是根据已知的考生号和姓名(生日未知)去抓取高考录取结果。程序跑没多久就会卡住不动,刚学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   ·   实用小工具   ·   950 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:37 · PVG 06:37 · LAX 15:37 · JFK 18:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.