【问题标题】:Scrapy splash can't find elementScrapy splash找不到元素
【发布时间】:2018-05-26 23:29:39
【问题描述】:

问题:

我正在使用 scrapy splash 来抓取网页。但是,imageURL 的 css 路径似乎没有返回任何元素,但 namecategory 的路径运行良好。 (xpath 和 selector 都是直接从 Chrome 复制过来的。)

我尝试过的事情:

起初我以为是因为调用parse 时页面尚未完全加载,所以我将SplashRequest 的wait 参数更改为5,但它没有帮助。我还从 splash GUI (http://localhost:8050) 下载了 html 响应的副本,并验证了 xpath/selectors 在下载的副本上都可以正常工作。在这里,我假设这个 html 正是 scrapy 在 parse 中看到的内容,所以我无法理解为什么它在 scrapy 脚本中不起作用。

代码:

这是我的代码:

class NikeSpider(scrapy.Spider):
name = 'nike'
allowed_domains = ['nike.com', 'store.nike.com']
start_urls = ['https://www.nike.com/t/air-vapormax-flyknit-utility-running-shoe-XPTbVZzp/AH6834-400']

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest (
            url=url,
            callback=self.parse,
            args= {
                'wait': 5
            }
        )

def parse(self, response):

    name = response.xpath('//*[@id="RightRail"]/div/div[1]/div[1]/h1/text()').extract_first()
    imageURL = response.css('#PDP > div > div:nth-child(2) > div.css-1jldkv2 > div:nth-child(1) > div > div > div.d-lg-h.bg-white.react-carousel > div > div.slider-container.horizontal.react-carousel-slides > ul > li.slide.selected > div > picture:nth-child(3) > img::attr(src)').extract_first()
    category = response.css('#RightRail > div > div.d-lg-ib.mb0-sm.mb8-lg.u-full-width > div.ncss-base.pr12-sm > h2::text').extract_first()
    url = response.url


    if name != None and imageURL != None and category != None:
        item = ProductItem()
        item['name'] = name
        item['imageURL'] = imageURL
        item['category'] = category
        item['URL'] = url

        yield item

【问题讨论】:

    标签: web-scraping scrapy scrapy-splash splash-js-render


    【解决方案1】:

    他们可能会使用不同的格式,但对我来说是(source::attr(srcset) 结尾):

    imageURL = response.css('#PDP > div > div:nth-child(2) > div.css-1jldkv2 > div:nth-child(1) > div > div > div.d-lg-h.bg-white.react-carousel > div > div.slider-container.horizontal.react-carousel-slides > ul > li.slide.selected > div > picture:nth-child(3) > source::attr(srcset)').extract_first()
    

    【讨论】:

    • 感谢您的回答!我认为 css 选择器不是这里的问题——当我在浏览器中测试时,我的选择器确实获得了我需要的 img 元素。我错过了什么吗?
    • 我已经在浏览器和 Scrapy 中测试过
    • 为什么我的不能在 Scrapy 中工作?它也适用于浏览器。
    • 我能看到它的唯一原因是某种 RANDOM HTML 格式
    • 有时是img,但有时是source
    猜你喜欢
    • 2021-12-17
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多