Scrapy не соскабливает следующую страницу - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь почерпнуть новости из skynewsarabia.com

class SkyNewsSportsSpider(scrapy.Spider):

    name = 'sky_news_sports'

sport = "https://www.skynewsarabia.com/sport/"
custom_settings = {
    'FEED_EXPORT_FIELDS': ["article_content", "tags"],
}
allowed_domains = ['www.skynewsarabia.com']

first_token = "1569266773000"
scrape_this_link = "https://api.skynewsarabia.com//rest/v2/latest.json?defaultSectionId=6&nextPageToken={}&pageSize=20&types=ARTICLE"
start_urls = [scrape_this_link.format(first_token)]
urls = []

def parse(self, response):
    articles = json.loads(response.text)

    # to get the link for each article we need to combine both the id and the urlFriendlySuffix in one link
    for article in range(0, len(articles["contentItems"])):
        article_id = articles["contentItems"][article]["id"]
        article_url = articles["contentItems"][article]["urlFriendlySuffix"]
        relative_link = article_id + "-" + article_url
        full_link = self.sport + relative_link
        self.urls.append(full_link)

    for url in self.urls:
        yield scrapy.Request(url=url, callback=self.parse_details)

    self.urls = []

    print("Before Check")
    self.first_token = articles["nextPageToken"]
    if self.first_token is not None:
        next_page = self.scrape_this_link.format(self.first_token)
        print("I am inside!")
        print(next_page)
        yield response.follow(url=next_page, callback=self.parse)

def parse_details(self, response):
    pass

Основная идея заключается в том, что вы сначала очищаете ссылку, содержащую 20 ссылок. кроме того, у первой ссылки есть также токен для следующей ссылки, который нужно добавить к следующему URL, чтобы вы могли очистить следующие 20 ссылок. Однако проблема, с которой я сталкиваюсь, заключается в том, что при первом запуске сценария он берет следующий токен, получает все ссылки этого токена и затем останавливается! так что я всего лишь соскабливаю 20 ссылок! когда я печатаю first_token, он дает мне что-то отличное от 1569266773000, что предусмотрено в скрипте по умолчанию. Тем не менее, тот же сценарий работает отлично, когда у меня есть счетчик и просто увеличить этот счетчик self.counter += 1

1 Ответ

0 голосов
/ 30 сентября 2019

Вам нужно изменить allowed_domains = ['www.skynewsarabia.com'] на allowed_domains = ['skynewsarabia.com']. Или полностью удалите переменную allowed_domains.

Поскольку вы указали имя хоста www Scrapy фильтрует запросы на api.skynewsarabia.com как удаленные, а вызовы просто сбрасываются.

Дополнительная подсказка: Попробуйте использовать self.logger.info и self.logger.debug вместо команд print в вашем коде.

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