CrawlSpider не выполняет обратный вызов - PullRequest
0 голосов
/ 05 февраля 2019

Я создал паука, расширив CrawlSpider.

Когда паук запускается и находит страницу статьи, я хочу получить ссылку на профиль автора и сделать запрос на страницу профиля и проанализировать его с помощью parse_author, но для некоторыхпричина, этот обратный вызов parse_author никогда не выполняется.

Мой код:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.http.request import Request


class CityamSpider4(CrawlSpider):

    name = "city_am_v4"
    custom_settings = {
        'CONCURRENT_REQUESTS': '1',
    }
    allowed_domains = ['cityam.com']
    start_urls = [
        'http://www.cityam.com',
    ]
    rules = (
        Rule(LinkExtractor(deny=('dev2.cityam.com', 'sponsored-content', )), callback='parse_item'),
    )

    def parse_item(self, response):
        # parse article page
        article_title = response.css('.article-headline h1::text').extract_first(default='null').strip()
        if article_title is not 'null':
            print 'Article url : ' + response.url
            author_url = response.css('.author-container .author-text a.author-name::attr(href)').extract_first(default='null').strip()
            print 'Author link: ' + author_url
            author_url = response.urljoin(author_url)
            print 'Author link: ' + author_url
            yield Request(author_url, callback=self.parse_author)

    def parse_author(self, response):
        # parse author page
        author_name = response.css(".cam-profile-header-title::text").extract_first(default='null').strip()
        print 'Author name: ' + author_name
        yield {
            'name': author_name,
        }

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Проблема в том, что ваши правила извлечения ссылок также соответствуют авторским ссылкам, и Scrapy по умолчанию отбрасывает повторяющиеся запросы, поэтому ваш parse_item метод - это тот, который получает ответы, которые вы ожидаете получить в parse_author.

Возможные решения включают:

  • Измените свой LinkExtractor, чтобы он не соответствовал URL-адресам авторов.

  • Переместите логику анализа автора с parse_author наparse_item.

  • Добавьте dont_filter=True к Request, чтобы те запросы, которые вы выдавали, не отфильтровывались, даже если они являются дубликатами запросов, найденных вашим экстрактором ссылок.

0 голосов
/ 05 февраля 2019

Вы используете неправильный порт на страницах сайта:

  1. HTTP: 80 порт - НЕ
  2. HTTPS: 443 порт - ДА

Ваша строка yield Request(url=author_url, callback=self.parse_author) ссылается (например) http : //www.cityam.com/profile/joseph.ray (на порт 80).

Вы должны использовать запрос через HTTPS: https : //www.cityam.com/profile/joseph.ray И тогда выполнение программы перейдет к методу parse_author .

Измените URL вашего запроса, и все будут счастливы.enter image description here И, кстати, я считаю плохой практикой писать код, подобный следующему:

print 'Article url : ' + response.url (Некоторые компиляторы не поймут это и будут иметь ошибку.)

Должно быть: print("Article url : " + response.url)

...