V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   linkbg · 127 天前 · 988 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条附言  ·  127 天前
    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
        1
    whwq2012   127 天前 via Android
    我在我的阿里云 1g 内存的服务器上跑过半个月都没有问题
        2
    linkbg   127 天前 via iPhone
    @whwq2012 可能我的姿势不对。求指教。
        3
    VicYu   127 天前
    报错看看
        4
    linkbg   127 天前 via iPhone
    @VicYu 没有错误。直接被 kill 了。/var/log/message 中记录 OOM kill
        5
    knightdf   127 天前
    @linkbg 检查自己的代码把,这个应该是你代码内存泄漏了
        6
    whwq2012   127 天前 via Android
    @linkbg 你都不贴出整个项目,我没出现过这个错误
        7
    linkbg   127 天前
    @whwq2012 不好意思,我看了一下,好像这代码也没什么保密价值。哈哈。
        8
    whwq2012   127 天前 via Android
    scrapy 的日志看了吗,没有的话就设置成 debug 级别的,再运行一次,期间你可以去 scrapy 的 github 项目,搜搜有没有 issue 出现过和你一样的问题。
        9
    linkbg   127 天前
    @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
    ```
        10
    VicYu   127 天前
    @linkbg 能发一下内存监控之内吗?

    遍历所有在需求 domain 里 a[href], generator 应该不小, 你换一下 PickleFifoDiskQueue 试试
        12
    awanabe   127 天前
    用 yield 就是迭代器, 之前的对象都不会释放的。
        13
    linkbg   127 天前
    @VicYu 内存监控这块,我没有监控,我也是在他 kill 掉我才去看 log 的。我试一下您说的这个。谢谢
        14
    mansur   127 天前
    ps aux | grep python
    运行一阵后看下有几个 py 进程
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2613 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.0 · 60ms · UTC 07:49 · PVG 15:49 · LAX 00:49 · JFK 03:49
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1