cari

Rumah  >  Soal Jawab  >  teks badan

Scrapy mempunyai masalah kebocoran memori.

Apabila saya menulis crawler, ia akan sentiasa OOMed selepas berjalan untuk seketika (tidak lebih daripada 12 jam). Sangat tidak berdaya! ! !
Menurut dokumentasi rasmi, saya menggunakan prefs() ini tetapi saya benar-benar tidak dapat mencari masalahnya.

Live References

HtmlResponse                       42   oldest: 753s ago
MySuteSpider                        1   oldest: 2964s ago
Request                         32412   oldest: 2920s ago
Selector                           42   oldest: 751s ago
TripItem                           37   oldest: 751s ago

Proses crawler adalah untuk mendapatkan pautan tag a semua halaman:

#获取域名的后缀
def get_domain_suffix(domain):
    if 'com' in tldextract.extract(domain).suffix:
        return True
    return False
#拼接域名。只存主域名
def save_domain(domain):
    domain_name = tldextract.extract(domain).domain
    suffix_name = tldextract.extract(domain).suffix

    return domain_name + '.' + suffix_name

#获取域名ip
def get_domain_ip(domain):
    try:
        ip = socket.gethostbyname(domain)
        return ip
    except:
        return '114.114.114.114'

# 获取域名所在的国家
def get_domain_ct_iso(ip):
    GEO = geoip2.database.Reader(
        '/var/test/geodb/GeoLite2-City.mmdb')
    r = GEO.city(ip)
    return r.country.iso_code

class MyDomainSpider(scrapy.Spider):
    name = 'my_domain'
    start_urls = [
        'http://xxx.com
    ]

    def parse_items(self, response):
        item = TripItem()
        for url in response.xpath('//a/@href').extract():
            if url.startswith('http'):
                    domain = urlparse.urlparse(url).netloc
                    if get_domain_tw(domain) or get_domain_ct_iso(get_domain_ip(domain)) == 'US':
                        item['domain'] = save_domain(domain)
                        item['ip'] = get_domain_ip(domain)
                        item['datetime'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                        yield item


    def parse(self, response):
        for url in response.xpath('//a/@href').extract():
            if url.startswith('http'):
                domain = urlparse.urlparse(url).netloc
                if get_domain_tw(domain) or get_domain_ct_iso(get_domain_ip(domain)) == 'US':
                     yield scrapy.Request(url, callback=self.parse_items)

Sila beri saya nasihat, terima kasih

仅有的幸福仅有的幸福2708 hari yang lalu844

membalas semua(1)saya akan balas

  • 巴扎黑

    巴扎黑2017-06-30 09:55:22

    yield item Adakah anda perlu melaksanakannya dan menyimpan fail atau db, jika tidak, ia akan disimpan dalam ingatan?

    balas
    0
  • Batalbalas