免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5499 | 回复: 2
打印 上一主题 下一主题

Python 多线程爬虫自动Killed问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-11 12:53 |只看该作者 |倒序浏览
我写了一个多线程抓取9游游戏论坛帖子的爬虫, 每次最多建立100个线程去抓取,当startPage=1, endPage<100的时候可以正常运行, 但当endPage > 100的时候,总是在处理完1~101页之后自动Killed 掉, 请问这是什么原因?  有什么解决的办法?
  1. #!/usr/bin/env python
  2. # encoding: utf-8

  3. import sys
  4. import urllib2
  5. import threading
  6. from bs4 import BeautifulSoup

  7. suffix = "-1.html"

  8. def analyse(start, end, url):
  9.     threads = []
  10.     while start <= end:
  11.         i = 0
  12.         while start <= end:
  13.             if i > 100 :
  14.                 break
  15.             t = threading.Thread(target=getContent, args=(url + str(start) + suffix, i))
  16.             threads.append(t)
  17.             start = start + 1
  18.             i += 1
  19.             print(i)
  20.         for thread_obj in threads:
  21.             thread_obj.start()
  22.         for thread_obj in threads:
  23.             thread_obj.join()
  24.         del threads[:]

  25.                
  26. def getContent(url, index):
  27.     req  = urllib2.Request(url, headers={"user-Agent":"Magic Browser"})
  28.     page = urllib2.urlopen(req)
  29.     html = page.read()
  30.     soup = BeautifulSoup(html)
  31.     userName = []
  32.     floorNum = []
  33.     replyCon = []
  34.     result = ""

  35.     #get user name
  36.     for auth in soup.find_all('div',{"class":"i y"}):
  37.                 for ya in auth.stripped_strings:
  38.                         userName.append(unicode(ya))
  39.                         break

  40.     #get floor number
  41.     click = "setCopy(this.href, '帖子地址复制成功');return false;"
  42.     for s in soup.find_all('a', {"onclick": click}):
  43.         for ya in s.strings:
  44.              floorNum.append(unicode(ya))
  45.              break

  46.     #get reply content
  47.     for s in soup.find_all('div', {"class": "t_fsz"}):
  48.         tmpList = []
  49.         for ya in s.stripped_strings:
  50.             tmpList.append(unicode(ya))
  51.         replyCon.append(''.join(tmpList))
  52.         del tmpList[:]

  53.     #merge name, number, replay and return
  54.     i = 0
  55.     while i < len(userName):
  56.                 single = floorNum[i] + "\t\t" + userName[i] + "\t\t" + replyCon[i] + "\n"
  57.                 print single
  58.                 result = result + single
  59.                 i = i + 1
  60.     page.close()


  61. if __name__ == "__main__":
  62.     reload(sys)
  63.     sys.setdefaultencoding('utf8')
  64.     #url = raw_input("输入待分析帖子的ID:")
  65.     #startPage = string.atoi(raw_input("输入起始页码:"))
  66.     #endPage = string.atoi(raw_input("输入终止页码:"))
  67.     #url = "http://bbs.9game.cn/thread-6688328-4-1.html"
  68.     url=6651496
  69.     startPage=1
  70.     endPage=130
  71.     url = "http://bbs.9game.cn/thread-" + str(url) + "-"
  72.     if startPage > endPage:
  73.         print("页码参数错误")
  74.         exit(0)
  75.     analyse(startPage, endPage, url)
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-09-11 19:39 |只看该作者
qq17920 发表于 2014-09-11 12:53
我写了一个多线程抓取9游游戏论坛帖子的爬虫, 每次最多建立100个线程去抓取,当startPage=1, endPage 100的时 ...

之前把这个脚本在我的内存128MB的VPS上运行, 不停的被KILLED, 后来在本地电脑上运行, 顺畅运行到结束. 可能是由于内存请求过大导致不停被KILLED, 程序在本地window xp运行的时候内存占用基本维持在200MB~300MB之间.

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
3 [报告]
发表于 2014-09-12 10:16 |只看该作者
使用内存过多被OOM了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP