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
yield item
Adakah anda perlu melaksanakannya dan menyimpan fail atau db, jika tidak, ia akan disimpan dalam ingatan?