使用Python与Requests库爬取immobilier.ch网站图片时遭遇403禁止访问的解决方案求助
解决immobilier.ch图片爬取403 Forbidden问题
看起来你遇到的问题很典型:虽然用Selenium成功拿到了图片URL,但直接用Requests请求时被网站识别为非浏览器请求,返回了403。这是因为网站的反爬机制会检查请求头(比如User-Agent、Referer),而Requests默认的请求头和浏览器的差异很大,很容易被拦截。不过别担心,有两种靠谱的解决方法:
方法一:让Requests模拟浏览器的请求头
既然Selenium能正常访问页面,我们可以复用浏览器的请求头信息,让Requests的请求看起来更像正常用户操作:
- 先从Selenium的driver中获取当前浏览器的User-Agent,同时把当前页面的URL作为Referer(告诉网站这个图片请求是从合法页面发起的);
- 把这些头信息加到Requests的请求里,再去获取图片内容。
修改后的代码示例:
import requests import os import time from selenium import webdriver driver = webdriver.Chrome() driver.get("你的目标房产页面URL") # 获取图片URL image_element = driver.find_element_by_class_name("im__col__content").find_element_by_tag_name("img") image_url = image_element.get_attribute("src") # 构造请求头:复用浏览器的User-Agent,加上当前页面作为Referer headers = { "User-Agent": driver.execute_script("return navigator.userAgent;"), "Referer": driver.current_url } path = "C:/Users/potek/Jupyter_projects/APARTMENTS" # 用带请求头的Requests请求图片 with open(os.path.join(path, "Immobilier"+str(time.time())+".jpg"), "wb") as f: f.write(requests.get(image_url, headers=headers).content) driver.quit()
方法二:直接用Selenium保存图片
既然Selenium已经在浏览器里加载了图片,我们可以跳过Requests,直接用Selenium的元素截图功能保存图片,这样完全模拟用户浏览器的行为,不会触发反爬:
代码示例:
import os import time from selenium import webdriver driver = webdriver.Chrome() driver.get("你的目标房产页面URL") # 找到图片元素 image_element = driver.find_element_by_class_name("im__col__content").find_element_by_tag_name("img") path = "C:/Users/potek/Jupyter_projects/APARTMENTS" # 直接用screenshot方法保存图片 image_element.screenshot(os.path.join(path, "Immobilier"+str(time.time())+".jpg")) driver.quit()
额外建议
- 不要过于频繁地请求,适当加入
time.sleep(2)之类的延迟,避免被网站判定为恶意爬虫; - 如果还是遇到问题,可以检查是否需要处理Cookie,方法一的Requests可以加上
cookies={key: value for key, value in driver.get_cookies()},把浏览器的Cookie也带上。
内容的提问来源于stack exchange,提问作者Stash
相关产品推荐
相关产品推荐

