我尝试使用urllib从tripadvisor下载一些图片,但我从html获取的src字段中的url是this
我做了一些研究,发现那些是懒加载图片......有没有办法下载它们?
答案 0 :(得分:0)
您可以使用Beautiful Soup和json模块从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)