在div#data-old-hires

时间:2019-04-23 21:21:45

标签: r rvest

在一些帮助下,我能够提取网址的着陆图像/主图像。但是,我也希望能够提取后续图像

require(rvest)
url <-"https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka- 
Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1- 
spons&keywords=lunch+bag&psc=1"

webpage <- read_html(url)
r <- webpage %>%
        html_nodes("#landingImage") %>% 
        html_attr("data-a-dynamic-image")
imglink <- strsplit(r, '"')[[1]][2]
print(imglink)

这将为主图像提供正确的输出。但是,当我将鼠标悬停在同一产品的其他图像上时,我想提取链接。本质上,我希望输出具有以下链接:

1。https://images-na.ssl-images- amazon.com/images/I/81bF%2Ba21WLL。 UY500 .jpg

  1. https://images-na.ssl-images-amazon.com/images/I/81HVwttGJAL.UY500.jpg

  2. https://images-na.ssl-images-amazon.com/images/I/81Z1wxLn-uL.UY500.jpg

  3. https://images-na.ssl-images-amazon.com/images/I/91iKg%2BKqKML.UY500.jpg

  4. https://images-na.ssl-images-amazon.com/images/I/91zhpH7%2B8gL.UY500.jpg

非常感谢

1 个答案:

答案 0 :(得分:0)

根据要求在底部显示Python脚本。为了使它适用于所有语言,答案分为两个部分。 1)可以使用R / Python /许多其他语言执行的高级伪代码描述步骤2)python示例。

R脚本获取末尾显示的字符串(处理的步骤1-3)。

1)流程:

  1. 通过GET请求获取html
  2. 正则表达式从脚本标签之一中提取一个子字符串,实际上这是页面上的jquery用于提供来自json的图像链接的内容

正则表达式为

jQuery\.parseJSON\(\'(.*)\'\);

解释是:

基本上,包含的json对象是从{之前的"dataInJson"到字符')之前的colorImages收集的。该操作将this json对象提取为字符串。第一个捕获组(。*)的使用从起始字符串和结束字符串之间(不包括任一侧)收集。

  1. 第一个比赛是唯一想要的比赛,因此必须从返回的比赛中提取第一个比赛。然后使用可解析字符串并返回json对象的json解析库进行处理
  2. 通过密钥循环访问json对象(在Python中,由于结构是字典-R会稍有不同)import requests #library to handle xhr GET import re #library to handle regex import json headers = {'User-Agent' : 'Mozilla/5.0', 'Referer':'https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc='} r = requests.get('https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc=1', headers = headers) p1 = re.compile(r'jQuery\.parseJSON\(\'(.*)\'\);') data = p1.findall(r.text)[0] json_source = json.loads(data) for colour in json_source['colorImages']: for image in json_source['colorImages'][colour]: print(image['large']) ,以生成(产品的)颜色,这些颜色依次使用自己访问实际的网址。

颜色:

图像的嵌套级别:

2)Python中显示的那些步骤

library(rvest)
library( jsonlite)
library(stringr)

con <- url('https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc=1', "rb")
page = read_html(con)
page %>%
  html_nodes(xpath=".//script[contains(., 'colorImages')]")%>%
  html_text() %>% as.character %>% str_match(.,"jQuery\\.parseJSON\\(\\'(.*)\\'\\);") -> res

json = fromJSON(res[,2][2])

输出:

该产品所有颜色的所有链接-仅大图像链接(因此,URL看起来略有不同,数量更多,但都是相同的图像)


R脚本来正则表达式输出所需的字符串并生成JSON:

import requests  #library to handle xhr GET
import re #library to handle regex

headers = {'User-Agent' : 'Mozilla/5.0', 'Referer':'https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc='}
r = requests.get('https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc=1', headers = headers)
p1 = re.compile(r'"large":"(.*?)"')
links = p1.findall(r.text)
print(links)

他们已经更新了页面,所以现在使用:

Python:

library(rvest)
library(stringr)
con <- url('https://www.amazon.in/Livwell-Multipurpose-MultiColor-Polka-%20Lunch/dp/B07LGTPM3D/ref=sr_1_1_sspa?ie=UTF8&qid=1548701326&sr=8-1-%20spons&keywords=lunch+bag&psc=1', "rb")
page = read_html(con)
res <- page %>%
  html_nodes(xpath=".//script[contains(., 'var data')]")%>%
  html_text() %>% as.character %>% 
  str_match_all(.,'"large":"(.*?)"')
print(res[[1]][,2])

R:

plot_acf()