使用 Scrapy 和 Splash 在动态 JavaScript 网页中抓取图像

Scraping images in a dynamic, JavaScript webpage using Scrapy and Splash

我正在尝试从 this link 抓取 高分辨率图像的 link,但图像的高分辨率版本只能是单击页面上的中号 link,即单击 “单击此处放大图像”(在页面上,它是土耳其语)后进行检查。
然后我可以使用 Chrome 的“开发人员工具”检查它并获得 xpath/css 选择器。到目前为止一切都很好。

但是,您知道在 JS 页面中,您无法键入 response.xpath("//blah/blah/@src") 并获取一些数据。我安装 Splash(使用 Docker pull)并配置我的 Scrapy setting.py 文件等以使其工作 (这 YouTube link 有帮助。无需访问 link 除非你想学习如何去做)。 ...并且它适用于其他 JS 网页!

只是...我无法通过 “单击此处放大图像!” 东西并获得响应。它给了我 null 回应。

这是我的代码:

import scrapy
#import json
from scrapy_splash import SplashRequest

class TryMe(scrapy.Spider):
    name = 'try_me'
    allowed_domains = ['arabam.com']

    def start_requests(self):
        start_urls = ["https://www.arabam.com/ilan/sahibinden-satilik-hyundai-accent/bayramda-arabasiz-kalmaa/17753653",
        ]

        for url in start_urls:
            yield scrapy.Request(url=url, 
            callback=self.parse, 
            meta={'splash': {'endpoint': 'render.html', 'args': {'wait': 0.5}}})
            # yield SplashRequest(url=url, callback=self.parse)  # this works too

    def parse(self, response):
        ## I can get this one's link successfully since it's not between js codes:
        #IMG_LINKS = response.xpath('//*[@id="js-hook-for-ing-credit"]/div/div/a/img/@src').get() 
        ## but this one just doesn't work:      
        IMG_LINKS = response.xpath("/html/body/div[7]/div/div[1]/div[1]/div/img/@src").get()
        print(IMG_LINKS)  # prints null :(
        yield {"img_links":IMG_LINKS}  # gives the items: img_links:null

Shell 我正在使用的命令:
scrapy crawl try_me -O random_filename.jl

link 的 Xpath 我正在尝试 抓取:
/html/body/div[7]/div/div[1]/div[1]/div/img

Image of this Xpath/link

我实际上可以在 开发人员工具 window 网络 选项卡上看到我想要的 link当我点击放大它时,但我不知道如何从该选项卡中 抓取 link。

可能的解决方案: 我也会尝试获取我的回复的整个乱码,即 response.text 并应用 正则表达式(例如以 https://... 开始并以 .jpg 结束)。这绝对是大海捞针,但听起来也很实用

谢谢!

据我了解,您想找到主图像 link。我查看了该页面,它位于元元素之一内:

<meta itemprop="image" content="https://arbstorage.mncdn.com/ilanfotograflari/2021/06/23/17753653/3c57b95d-9e76-42fd-b418-f81d85389529_image_for_silan_17753653_1920x1080.jpg">

你可以得到什么

>>> response.css('meta[itemprop=image]::attr(content)').get()
'https://arbstorage.mncdn.com/ilanfotograflari/2021/06/23/17753653/3c57b95d-9e76-42fd-b418-f81d85389529_image_for_silan_17753653_1920x1080.jpg'

您不需要为此使用启动画面。如果我用 splash 检查网站,arabam.com 给出权限被拒绝的错误。我建议不要为这个网站使用 splash。

为了更好地解决所有图像,您可以解析javascript。在源代码中加载了 js 的图像数组。

要联系 javascript,请尝试:

  response.css('script::text').getall()[14]

这将为您提供包含图像数组的整个 javascript 字符串。您可以使用 built-in 像 js2xml 这样的库来解析它。

在此处查看如何使用它 https://github.com/scrapinghub/js2xml。如果还有疑问,可以提问。祝你好运