Ich versuche, einige ausgewählte Domänen zu crawlen und nur die wesentlichen Seiten von diesen Websites zu nehmen. Mein Ansatz besteht darin, eine Webseite der Domain zu crawlen und eine begrenzte Anzahl von URLs zu verwenden. Diese URLs werden nach wiederkehrenden URLs gecrawlt, die ich auf der ersten Webseite gefunden habe. Auf diese Weise versuche ich alle URLs zu eliminieren, die nicht mehr vorkommen (Content-URLs wie Produkte usw.). Der Grund, warum ich um Hilfe frage, ist, weil scrapy.Request nicht mehr als einmal ausgeführt wird. Dies ist, was ich bisher:Scrap Crawl mehrere Domänen mit wiederkehrenden URLs pro Domain
class Finder(scrapy.Spider):
name = "finder"
start_urls = ['http://www.nu.nl/']
uniqueDomainUrl = dict()
maximumReoccurringPages = 5
rules = (
Rule(
LinkExtractor(
allow=('.nl', '.nu', '.info', '.net', '.com', '.org', '.info'),
deny=('facebook','amazon', 'wordpress', 'blogspot', 'free', 'reddit',
'videos', 'youtube', 'google', 'doubleclick', 'microsoft', 'yahoo',
'bing', 'znet', 'stackexchang', 'twitter', 'wikipedia', 'creativecommons',
'mediawiki', 'wikidata'),
),
process_request='parse',
follow=True
),
)
def parse(self, response):
self.logger.info('Entering URL: %s', response.url)
currentUrlParse = urlparse.urlparse(response.url)
currentDomain = currentUrlParse.hostname
if currentDomain in self.uniqueDomainUrl:
yield
self.uniqueDomainUrl[currentDomain] = currentDomain
item = ImportUrlList()
response.meta['item'] = item
# Reoccurring URLs
item = self.findReoccurringUrls(response)
list = item['list']
self.logger.info('Output: %s', list)
# Crawl reoccurring urls
#for href in list:
# yield scrapy.Request(response.urljoin(href), callback=self.parse)
def findReoccurringUrls(self, response):
self.logger.info('Finding reoccurring URLs in: %s', response.url)
item = response.meta['item']
urls = self.findUrlsOnCurrentPage(response)
item['list'] = urls
response.meta['item'] = item
# Get all URLs on each web page (limit 5 pages)
i = 0
for value in urls:
i += 1
if i > self.maximumReoccurringPages:
break
self.logger.info('Parse: %s', value)
request = Request(value, callback=self.test, meta={'item':item})
item = request.meta['item']
return item
def test(self, response):
self.logger.info('Page title: %s', response.css('title').extract())
item = response.meta['item']
urls = self.findUrlsOnCurrentPage(response)
item['list'] = set(item['list']) & set(urls)
return item
def findUrlsOnCurrentPage(self, response):
newUrls = []
currentUrlParse = urlparse.urlparse(response.url)
currentDomain = currentUrlParse.hostname
currentUrl = currentUrlParse.scheme +'://'+ currentUrlParse.hostname
for href in response.css('a::attr(href)').extract():
newUrl = urlparse.urljoin(currentUrl, href)
urlParse = urlparse.urlparse(newUrl)
domain = urlParse.hostname
if href.startswith('#'):
continue
if domain != currentDomain:
continue
if newUrl not in newUrls:
newUrls.append(newUrl)
return newUrls
Es scheint nur zu sein, um die erste Seite ausgeführt wird, die andere Request() wird nicht genannt, wie ich auf dem Rückruf sehen.
ImportUrlList enthält nur ein Feld mit einer Liste = dict() zu nennen; Ich möchte findUrlsOnCurrentPage wiederverwenden, also habe ich eine neue Funktion für den Rückruf gemacht, weil ich mit dieser Funktion experimentiert habe, nannte ich es Test. Beim ersten Aufruf hat die Funktion bereits eine Seite geholt, daher muss ich die Anfrage nicht wiederholen. –