如何使用requests模块提取指定网页中所有户型图的图片链接?
如何使用requests模块提取指定网页中所有户型图的图片链接?
嘿,我看了你的代码和问题,你之所以用正则没成功,主要是因为目标图片链接所在的数组嵌套在一个大的JSON结构里,页面里的转义字符太多,用简单的正则很难精准匹配到完整的内容,容易断在中间或者匹配不全。
咱们换个思路,直接定位到页面里的初始化状态JSON块,解析后就能轻松拿到所有户型图的图片链接了,具体步骤和代码如下:
解决思路
- 页面里的户型图数据其实存在
window.__INITIAL_STATE__这个全局变量对应的JSON结构里,我们先把这个JSON字符串提取出来 - 将提取到的字符串解析成Python字典,就能方便地遍历里面的户型图数据
- 从每个户型图的信息里提取
images数组中的图片链接
修改后的完整代码
import re import json import requests link = 'https://www.livabl.com/abbotsford-bc/jem1' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'Referer': 'https://www.livabl.com/', } def get_floor_plan_images(link, headers): res = requests.get(link, headers=headers) print(f"请求状态码: {res.status_code}") # 匹配页面中的初始化状态JSON块 match = re.search(r'window\.__INITIAL_STATE__ = (.*?);', res.text, re.DOTALL) if not match: print("未找到目标JSON数据") return [] # 解析JSON字符串为Python字典 try: initial_state = json.loads(match.group(1)) except json.JSONDecodeError as e: print(f"JSON解析失败: {e}") return [] # 提取所有户型图的图片链接 all_image_links = [] floor_plans = initial_state.get('floorPlans', {}).get('items', []) for plan in floor_plans: # 遍历每个户型图的images数组 for image in plan.get('images', []): img_url = image.get('url') if img_url: all_image_links.append(img_url) return all_image_links images = get_floor_plan_images(link, headers) print(f"共提取到 {len(images)} 张户型图图片链接:") for idx, url in enumerate(images, 1): print(f"{idx}. {url}")
代码说明
- 用
re.DOTALL参数让正则的.匹配换行符,确保能完整捕获整个JSON块 - 用
json.loads解析JSON,避免了手动处理转义字符的麻烦 - 逐层提取
floorPlans->items->images->url,确保不会遗漏任何一张图片 - 添加了异常处理,避免因为页面结构小变动导致程序直接崩溃
运行这段代码后,你就能拿到全部11张户型图的图片链接啦~
备注:内容来源于stack exchange,提问作者SMTH
相关产品推荐
相关产品推荐

