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

Scrapy 在 1G 内存的环境下是不是无法发挥工作呢?

  •  
  •   linkbg · 2017-06-19 12:12:40 +08:00 · 2508 次点击
    这是一个创建于 2713 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Scrapy 在 1G 内存的环境下是不是无法发挥工作呢?尝试了三次,在运行一段时间(一小时以上)之后就是遇到 OOM。 可能代码逻辑有问题?

    # 从一个入口站点入手,获取全部的 a 标签。再然后循环。
    for url in response.xpath('//a/@href').extract():
    	# 存取 title 之类
        
        yield item
        yield scrapy.Request(url,callback=self.parse, dont_filter=True)
    

    谢谢指导

    第 1 条附言  ·  2017-06-19 13:06:47 +08:00
    import scrapy
    import re
    import urlparse
    import socket
    import datetime
    import logging
    import tldextract
    from domain_spider.items import DomainSpiderItem
    
    
    DOMAINS= []
    DBD_DOMAINS = ['youtube.com', 'tumblr.com', 'facebook.com','google.com', 'twitter.com', 'yahoo.com','apple.com']
    def get_domain(url):
        domain = urlparse.urlparse(url).netloc
        return domain
    
    def items(item,domain, ip):
        item['domain'] = domain
        item['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        return item
    
    class TestSpider(scrapy.Spider):
        name = "Test"
        start_urls = [
                'https://xxx.com/',
        ]
    
        def parse(self, response):
            item = DomainSpiderItem()
            try:
                for url in response.xpath('//a/@href').extract():
                    if re.match('^http',url):
                        for x in DBD_DOMAINS :
                            if x in url:
                                break
                        else:
                            domain = get_domain(url)
                            ip = domain_get_ip(get_domain(url))
                            items(item, domain, ip)
                            yield item
                            yield scrapy.Request(url,callback=self.parse, dont_filter=True)
            except Exception as error:
              logging.log(logging.WARNING,error)
    
    14 条回复    2017-06-19 13:52:37 +08:00
    whwq2012
        1
    whwq2012  
       2017-06-19 12:19:48 +08:00 via Android
    我在我的阿里云 1g 内存的服务器上跑过半个月都没有问题
    linkbg
        2
    linkbg  
    OP
       2017-06-19 12:28:29 +08:00 via iPhone
    @whwq2012 可能我的姿势不对。求指教。
    VicYu
        3
    VicYu  
       2017-06-19 12:32:15 +08:00
    报错看看
    linkbg
        4
    linkbg  
    OP
       2017-06-19 12:34:15 +08:00 via iPhone
    @VicYu 没有错误。直接被 kill 了。/var/log/message 中记录 OOM kill
    knightdf
        5
    knightdf  
       2017-06-19 12:40:25 +08:00
    @linkbg 检查自己的代码把,这个应该是你代码内存泄漏了
    whwq2012
        6
    whwq2012  
       2017-06-19 12:55:49 +08:00 via Android
    @linkbg 你都不贴出整个项目,我没出现过这个错误
    linkbg
        7
    linkbg  
    OP
       2017-06-19 13:07:46 +08:00
    @whwq2012 不好意思,我看了一下,好像这代码也没什么保密价值。哈哈。
    whwq2012
        8
    whwq2012  
       2017-06-19 13:15:22 +08:00 via Android
    scrapy 的日志看了吗,没有的话就设置成 debug 级别的,再运行一次,期间你可以去 scrapy 的 github 项目,搜搜有没有 issue 出现过和你一样的问题。
    linkbg
        9
    linkbg  
    OP
       2017-06-19 13:23:47 +08:00
    @whwq2012 谢谢啦,
    日志方面除了在插入到数据库时会报唯一限制的错误,没有其他关于 scrapy 的报错,最后一次,我盯着它在我眼皮底下直接就被 kill 掉。
    /var/log/message 中的记录
    ```
    kernel: Out of memory: Kill process 2454 (scrapy) score 333 or sacrifice child
    kernel: Killed process 2454 (scrapy) total-vm:999536kB, anon-rss:346860kB, file-rss:1176kB, shmem-rss:0kB
    ```
    VicYu
        10
    VicYu  
       2017-06-19 13:38:59 +08:00
    @linkbg 能发一下内存监控之内吗?

    遍历所有在需求 domain 里 a[href], generator 应该不小, 你换一下 PickleFifoDiskQueue 试试
    awanabe
        12
    awanabe  
       2017-06-19 13:40:54 +08:00
    用 yield 就是迭代器, 之前的对象都不会释放的。
    linkbg
        13
    linkbg  
    OP
       2017-06-19 13:48:29 +08:00
    @VicYu 内存监控这块,我没有监控,我也是在他 kill 掉我才去看 log 的。我试一下您说的这个。谢谢
    mansur
        14
    mansur  
       2017-06-19 13:52:37 +08:00
    ps aux | grep python
    运行一阵后看下有几个 py 进程
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:20 · PVG 12:20 · LAX 20:20 · JFK 23:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.