scrapy shell xpath从itunes.apple.com返回空列表

时间:2018-06-30 17:27:58

标签: python xpath scrapy

scrapy shell 'https://itunes.apple.com/us/album/no-tears-left-to-cry/1374085537?i=1374087460&v0=WWW-NAUS-ITSTOP100-SONGS&l=en&ign-mpt=uo%3D4'

我想从这里获得专辑“泪流满面-Single”,

Itunes chart _ music preview page "no tears left to cry - Single / Ariana Grande"

相册名称的xpath是这样的: //*[@id="ember653"]/section[1]/div/div[2]/div[1]/div[2]/header/h1

我试图

response.xpath('//*[@id="ember653"]/section[1]/div/div[2]/div[1]/div[2]/header/h1')

但结果是[]

如何从此wepsite获取相册信息?

2 个答案:

答案 0 :(得分:0)

这是因为scrapy不要等待javascript加载,您需要使用scrapy-splashscrapy-splashhere is my answer how you need to setup scrapy-project

如果我使用scrapy-splash,我会得到结果

2018-06-30 20:50:21 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://itunes.apple.com/us/album/no-tears-left-to-cry/1374085537?i=1374087460&v0=WWW-NAUS-ITSTOP100-SONGS&l=en&ign-mpt=uo%3D4%27 via http://localhost:8050/render.html> (referer: None)
2018-06-30 20:50:21 [scrapy.core.scraper] DEBUG: Scraped from <200 https://itunes.apple.com/us/album/no-tears-left-to-cry/1374085537?i=1374087460&v0=WWW-NAUS-ITSTOP100-SONGS&l=en&ign-mpt=uo%3D4%27>
{'title': 'no tears left to cry - Single'}

这是我简单的蜘蛛

import scrapy
from scrapy_splash import SplashRequest


class TestSpider(scrapy.Spider):
    name = "test"

    start_urls = ['https://itunes.apple.com/us/album/no-tears-left-to-cry/1374085537?i=1374087460&v0=WWW-NAUS-ITSTOP100-SONGS&l=en&ign-mpt=uo%3D4%27']

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url,
                                callback=self.parse,
                                endpoint='render.html',
                                )

    def parse(self, response):
        yield {'title': response.xpath('//*[@id="ember653"]/section[1]/div/div[2]/div[1]/div[2]/header/h1//text()').extract_first()}

您也可以使用scrapy shell

scrapy shell 'http://localhost:8050/render.html?url=https://itunes.apple.com/us/album/no-tears-left-to-cry/1374085537?i=1374087460&v0=WWW-NAUS-ITSTOP100-SONGS&l=en&ign-mpt=uo%3D4'

In [2]: response.xpath('//*[@id="ember653"]/section[1]/div/div[2]/div[1]/div[2]/header/h1//text()').extract_first()
Out[2]: 'no tears left to cry - Single'

答案 1 :(得分:0)

您最好避免JS渲染,该渲染太慢,繁琐且容易出错。 在Chrome的“网络”标签上花费5分钟,以查找数据源。它通常内置在页面源中或通过XHR请求传递。

在这种情况下,所需的所有数据都可以在页面本身上找到,但是您应该检查其源代码,而不是呈现的版本。在Chrome中使用ctrl+u,然后在ctrl+f中查找所有需要的部分。

import json

track_data = response.xpath('//script[@name="schema:music-album"]/text()').extract_first()
track_json = json.loads(track_data)
track_title = track_json['name']
yield {'title': track_title}

在这种情况下将可以解决问题,并且比splash的速度快约5-7倍