В последнее время я пытался разработать веб-сканер, используя Scrapy для извлечения всех документов PDF из определенного домена, и, хотя я могу каким-то образом достичь цели, он все еще застревает в каком-то «бесконечном цикле», потому что части «поисковой системы» указанного сайта.
Можно ли как-нибудь избежать такого поведения?
Вот код сканера, который был написан до сих пор (извините, если это спагетти, все еще пытаюсь поправиться ..):
class AirbusSpider(CrawlSpider):
name = "test"
tag = "aircraft"
n_iterations = 3
allowed_domains = ['airbus.com']
start_urls = [
'https://www.airbus.com'
]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
yield scrapy.Request(url=response.url+'/'+self.tag+'.html', callback=self.parse_item, meta={'iteration': self.n_iterations})
def parse_item(self, response):
current_iteration = response.meta['iteration']
if(current_iteration>0):
temp_links = []
valuable_links = []
current_iteration-=1
#all "somewhat-valuable" links to crawl into
links = response.selector.xpath('//a[contains(@href,"aircraft")]/@href').extract() #all hrefs of current page
for link in links:
valuable_links.append(link)
temp_links = set(valuable_links)
valuable_links = list(temp_links)
for link in valuable_links:
link = str(link.encode('utf-8'))
if '.pdf' not in link:
if(link[0] == '/' or link[0] == '#'):
yield scrapy.Request(url=self.start_urls[0]+link, callback=self.parse_item, meta={'iteration': current_iteration})
else:
yield scrapy.Request(url=link, callback=self.parse_item, meta={'iteration': current_iteration})
else:
if(link[0] == '/' or link[0] == '#'):
#increase the priority of these requests
yield scrapy.Request(url=self.start_urls[0]+link, callback=self.download_file, priority = 1)
else:
yield scrapy.Request(url=link, callback=self.download_file, priority = 1)
def download_file(self, response):
item = PdfLink()
item['link'] = str(response.url)
return item
Я попытался ограничить рекурсию, добавив ограничитель (n_iterations) того, насколько глубоко должен проникнуть сканер. Это работает, но, тем не менее, я хотел бы отфильтровать ссылки, по которым он сканирует должным образом.
Большое спасибо за помощь, хорошей недели!