Использование Scrapy для получения данных подкаста itune - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь использовать Scrapy для получения данных подкаста itune, однако у меня возникают проблемы при извлечении данных подкаста из RSS-канала itune с использованием response.xpath в Scrapy.

Я пытался использовать запросы, которые прекрасно работают

import requests

url='https://itunes.apple.com/us/rss/toppodcasts/limit=200/genre=1302/explicit=true/json'

r=requests.get(url)
data=r.json()['feed']['entry']

podcast_url=[data[i]['link']['attributes']['href'] for i in range(len(data)) ]
title=[data[i]['im:name']['label'] for i in range(len(data)) ]
podcast_url=[data[i]['link']['attributes']['href'] for i in range(len(data)) ]
name=[data[i]['im:name']['label'] for i in range(len(data)) ]
artist=[data[i]['im:artist']['label'] for i in range(len(data)) ]
category=[data[i]['category']['attributes']['term'] for i in range(len(data)) ]
release_date=[data[i]['im:releaseDate']['label'] for i in range(len(data)) ]

Однако мне нужно включить это в Scrapy Crawler, чтобы получить рейтинг подкаста от каждого отдельного URL подкаста. Я не знаю, как использовать скрап для очистки ответов JSON, поэтому вместо этого я попробовал xml.

scrapy shell https://itunes.apple.com/us/rss/toppodcasts/limit=200/genre=1302/explicit=true/xml -s USER_AGENT='Mozilla/5.0 (Macintosh; IntelMac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36'

response.xpath('//feed/entry/title/text()').extract()

Я попробовал приведенный выше код в оболочке Scrapy и получил пустой ответ. Статус ответа был 200, и я смог просмотреть содержимое, используя view(response)

По сути, я пытаюсь написать «Шаг 2» в этом пауке:

import scrapy

categories=[1301, 1303, 1304, 1305, 1307, 1309, 1310, 1311, 1314, 1315,1316, 1318, 1321, 1323, 1324, 1325]
start_urls=['https://itunes.apple.com/us/rss/toppodcasts/limit=200/genre=' + str(category) + '/explicit=true/xml' for category in categories]


class ImgtSpider(scrapy.Spider):
    name = "podcast"

    #step 1 get json from RSS feed
    def start_requests(self):

        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse_podcast)

    #step 2 extract podcast title, artist,category,release_date and podcast_url       
    def parse_podcast(self, response):



        for podcast_url in podcast_urls:
           yield scrapy.Request(url=podcast_url,callback=self.parse_rating)

    #step 3 extract podcast rating from podcast_url
    def parse_rating(self, response):

        rating = response.css('figcaption.we-rating-count.star-rating__count::text').extract_first()
        request_url=response.request.url

        yield {"rating": rating,
               "url": request_url}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...