使用 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。如果还有疑问,可以提问。祝你好运
我正在尝试从 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。如果还有疑问,可以提问。祝你好运