【问题标题】:Can't download pictures from website using Python and requests无法使用 Python 和请求从网站下载图片
【发布时间】:2021-12-30 07:29:09
【问题描述】:

我正在用 Python 练习我的网页抓取技巧。我想从房地产网站www.immobilier.ch 下载图片。我在其他网站上成功了,但是这次我想保存 URL 的内容,保存后我在文件中看到了这个:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>

有谁知道避免它的方法吗?据我了解,该网站将我识别为机器人。但奇怪的是我可以刮除图片之外的所有其他内容。我使用 Requests 库来保存图片,使用 OS 将它们保存在正确的路径中,并使用 Selenium webdriver (Chrome)。这是我的代码示例:

image_url = driver.find_element_by_class_name("im__col__content").find_element_by_tag_name("img").get_attribute("src") #comment
path = "C:/Users/potek/Jupyter_projects/APARTMENTS"
with open(os.path.join(path, "Immobilier"+str(time.time())+".jpg"), "wb") as f:
        f.write(requests.get(i).content)

【问题讨论】:

  • 如果我的回答解决了你的问题,请接受,否则留下更多问题/细节的评论

标签: python image selenium-webdriver web-scraping python-requests


【解决方案1】:

如果您使用 Selenium 和 Webbot 等浏览器控制器,则发送到服务器的标头将是有效的,并且服务器将无法将您识别为机器人,除非您的流量比预期的大得多,例如,如果您有 100 个驱动程序打开所有图像/链接等每秒点击 10 次。

但是,对于您直接发送到图像 URL 的请求,您没有使用浏览器包装器,您使用的是没有免费标头的基本请求。您必须手动设置标头以使服务器认为请求来自合法浏览器,例如:

header = {'User-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15'}
res = requests.get(url = 'https://www.immobilier.ch/Medias/bory-cie-agence-immobiliere-sa-21/641557/images/NewThumbnail/20445175.jpg', headers = header)

如果驱动程序有一种方法来获取已经使用的标头,那么这将是一个更好的解决方案,因为某些服务器端请求合法性检查会比较从某个 IP 地址接收到的不同浏览器标头的数量并暂时阻止这些标头好吧。如果您想长时间抓取大量数据,循环浏览十几个免费代理 IP 地址(例如来自 https://free-proxy-list.net/uk-proxy.html 的地址)以及十几个标头也可以帮助您不被发现。

【讨论】:

  • 谢谢@GS 我尝试使用免费代理,不幸的是,它没有解决问题。但另一方面,标题完全按照我想要的方式工作。非常感谢您对我的问题的澄清 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多