Как сделать так, чтобы продолжить повторение сайтов даже с ошибками? - PullRequest
0 голосов
/ 29 апреля 2020

Так что я относительно новичок в области 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 проходить по каждой странице на начальной странице списка, независимо от того, какая ошибка запроса возникает, но чтобы сканер появлялся и выходил из найденных веб-сайтов и пытался очистить данные эти сайты.

1 Ответ

0 голосов
/ 01 мая 2020
class EmailSpider(CrawlSpider):
    name = "followwebsite"
    start_urls = [
        # 'https://www.manta.com/mb_35_D000B000_000/offices_and_clinics_of_medical_doctors',
         # 'https://www.chess.com/home'
         # 'https://webscraper.io/test-sites/e-commerce/static'
        '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):
        website = response.xpath('//*[@class="links"]/a/@href')
        yield from response.follow_all(website, self.parse_email)

        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)

    def parse_email(self, response):
        selector = Selector(response)
        for found_address in selector.re('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.com'):
            item = EmailAddressItem()
            item['email_address'] = found_address
            # item['url'] = response.url
            yield item

    def handle_error(self, failure):
        self.log("Request failed: %s" % failure.request)

Разобрался, нет, благодаря тебе, задницы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...