Я пытаюсь использовать 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}