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

2013-07-20 21:40:29 +08:00
 gracece
贴gist好像乱了,view raw: http://t.cn/zQtcsQv (短网址防止v2ex自动识别gist)

https://gist.github.com/gracece/6045024

主要功能是根据已知的考生号和姓名(生日未知)去抓取高考录取结果。程序跑没多久就会卡住不动,刚学python不是太懂哪里出了问题,麻烦大家帮忙看看,谢谢!
8776 次点击
所在节点    Python
7 条回复
SR1
2013-07-20 21:48:58 +08:00
会不会是你发起连接过多,
被服务器限制了或者服务器本身性能不佳所以卡住了

你设置一下超时时间,如果超时的话重新发起一次请求试试
yuelang85
2013-07-20 23:05:19 +08:00
同意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
2013-07-20 23:13:35 +08:00
抓取这种活,不要太爆力,自觉保持一个正常点的频率。
gracece
2013-07-20 23:36:32 +08:00
@yuelang85 感谢建议!
Zuckonit
2013-07-22 08:44:40 +08:00
strace 看一下
z50hz1988
2013-07-22 17:54:02 +08:00
用代理哇... 少年! 偷东西你还大义凛然的... 这样不好吧.
gracece
2013-07-22 23:40:53 +08:00
@z50hz1988 这也会查水表?不太清楚犯了哪一条,还望指导。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/76430

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX