我可以下载延迟加载图片吗?

时间:2016-06-07 22:14:02

标签: python html xpath lazy-loading urllib

我尝试使用urllib从tripadvisor下载一些图片,但我从html获取的src字段中的url是this

我做了一些研究,发现那些是懒加载图片......有没有办法下载它们?

1 个答案:

答案 0 :(得分:0)

您可以使用Beautiful Soupjson模块从Javascript中提取图像列表,然后遍历列表并检索您感兴趣的图像。

修改

问题是图像名称相同,因此被覆盖了。获取前三个图像是微不足道的,但是在旋转木马被打开之前不会加载对旋转木马中其他图像的引用,因此这更加棘手。对于某些图像,您可以通过用“photo-w”替换路径中的“photo-s”找到更高分辨率的版本,但要弄清楚哪些需要深入了解Javascript逻辑。

import urllib, re, json
from bs4 import BeautifulSoup as bs

def img_data_filter(tag):
    if tag.name == "script" and tag.text.strip().startswith("var lazyImgs"):
        return True
    return False

response = urllib.urlopen("https://www.tripadvisor.it/Restaurant_Review-g3174493-d3164947-Reviews-Le_Ciaspole-Tret_Fondo_Province_of_Trento_Trentino_Alto_Adige.html")
soup = bs(response.read(), 'html.parser')
img_data = soup.find(img_data_filter)

js = img_data.text
js = js.replace("var lazyImgs = ", '')
js = re.sub(r";\s+var lazyHtml.+", '', js, flags=re.DOTALL)

imgs = json.loads(js)
suffix = 1

for img in imgs:
    img_url = img["data"]

    if not "media/photo-s" in img_url:
        continue

    img_name = img_url[img_url.rfind('/')+1:-4]
    img_name = "%s-%03d.jpg" % (img_name, suffix)
    suffix += 1

    urllib.urlretrieve(img_url, img_name)