Так что я относительно новичок в области scrapy и пытаюсь найти сканер, который тянет гиперссылки для предприятий на странице листинга. Вот код:
class EmailSpider(CrawlSpider):
name = "emailcrawler"
start_urls = [
'https://www.yellowpages.com/search?search_terms=Computer+Software+%26+Services&geo_location_terms=Florence%2C+KY'
# 'https://www.yellowpages.com/search?search_terms=Computers+%26+Computer+Equipment-Service+%26+fix&geo_location_terms=FL'
]
def parse(self, response):
information = response.xpath('//*[@class="info"]')
for info in information:
website = info.xpath('.//*[@class="links"]/a/@href').extract_first()
if website != "None":
request = Request(url = website, callback=self.parse_email, errback = self.handle_error,
meta={'dont_retry': True, 'dont_redirect':True, 'handle_httpstatus_list': [302]})
request.meta['data'] = {
'Website': website
}
# yield response.follow(url = website, callback = self.parse_email)
yield request
next_page_url = response.xpath('//*[@class="next ajax-page"]/@href').extract_first()
absolute_next_page_url = response.urljoin(next_page_url)
yield Request(absolute_next_page_url, errback = self.handle_error, meta={'dont_retry': True, 'dont_redirect':True})
def parse_email(self, response):
data = response.meta.get('data')
# try:
# emails = set(re.findall(r"[a-z0-9\.\-+_]+@[a-z0-9\.\-+_]+\.com", response.text, re.I))
# except AttributeError:
# return
# data['email'] = emails
selector = Selector(response)
for found_address in selector.re('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.com'):
# item = EmailAddressItem()
data['email_address'] = found_address
# item['url'] = response.url
yield data
def handle_error(self, failure):
self.log("Request failed: %s" % failure.request)
До того, как я попытался получить scrap для перехода по каждой ссылке, я попросил его просто вернуть список веб-сайтов, которые он использовал, и которые работали отлично. Он мог запросить следующую страницу после перебора URL-адресов на странице, а затем выдать результаты. Сейчас я пытаюсь получить его на go для каждого загружаемого веб-сайта, извлечь элемент электронной почты на этом веб-сайте, если он найден, и затем вернуться на l oop, а затем попробовать другой веб-сайт. Проблема в том, что когда сканер получает ошибку ответа, сканирование просто прекращается. Также кажется, что даже если Запрос был успешным, сканер не сможет вернуться к исходной итерации через URL-адрес желтых страниц. Он застревает на одном из следующих веб-сайтов, а затем умирает за l oop. Как я могу заставить сканер оставаться в курсе и продолжать пытаться извлекать сайты, которые он просматривает, и в то же время оставаться в процессе перебора каждой страницы веб-сайта листинга. Проще говоря, мне нужно иметь возможность go проходить по каждой странице на начальной странице списка, независимо от того, какая ошибка запроса возникает, но чтобы сканер появлялся и выходил из найденных веб-сайтов и пытался очистить данные эти сайты.