Scrapy mempunyai masalah kebocoran memori.
仅有的幸福
仅有的幸福 2017-06-30 09:53:22
0
1
880

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

仅有的幸福
仅有的幸福

membalas semua(1)
巴扎黑

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan