繁体   English   中英

无法使用 Python 和请求从网站下载图片

[英]Can't download pictures from website using Python and requests

我在 Python 中练习我的 web 抓取技巧。 我想从房地产网站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>

有谁知道避免它的方法? 据我了解,该网站将我识别为机器人。 但奇怪的是我可以刮除图片之外的所有其他内容。 我使用请求库来保存图片,操作系统将它们保存在正确的路径中,并使用 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)

如果您使用 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.ZFC35FDC70D5FC69D26988A的地址所以标题也可以帮助你不被发现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM