Python 网页抓取被阻止

Sah*_*876 2 python proxy beautifulsoup web-scraping

我想抓取德国房地产网站 immobilienscout24.de。我想下载给定 URL 的 HTML,然后离线使用 HTML。它不用于商业用途或出版,我也不打算向网站发送垃圾邮件,它仅用于编码练习。我想编写一个 python 工具,自动下载给定 immobilienscout24.de 站点的 HTML。我曾尝试为此使用 beautifulsoup,但是,解析的 HTML 没有显示内容,而是询问我是否是机器人等,这意味着我的网络爬虫被检测到并被阻止(我可以在 Firefox 中访问该站点就好了)。我已经设置了一个引用、一个延迟和一个用户代理。我还能做些什么来避免被检测到(即旋转代理、旋转用户代理、随机点击、其他未被检测到的网页抓取工具...... )?我曾尝试使用我的电话 IP 但得到了相同的结果。GUI webscraping 工具不是一个选项,因为我需要用 python 控制它。如果可能,请提供一些可实现的代码。到目前为止,这是我的代码:

import urllib.request
from bs4 import BeautifulSoup
import requests
import time
import numpy

url = "https://www.immobilienscout24.de/Suche/de/wohnung-mieten?sorting=2#"
req = urllib.request.Request(url, data=None, headers={ 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36' })
req.add_header('Referer', 'https://www.google.de/search?q=immoscout24)
delays = [3, 2, 4, 6, 7, 10, 11, 17]
time.sleep(numpy.random.choice(delays)) # I want to implement delays like this
page = urllib.request.urlopen(req)
soup = BeautifulSoup(page, 'html.parser')
print(soup.prettify)

Run Code Online (Sandbox Code Playgroud)
username:~/Desktop$ uname -a
Linux username 5.4.0-52-generic #57-Ubuntu SMP Thu Oct 15 10:57:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

谢谢!

Chr*_*ian 5

我是 Fredy ( https://github.com/orangecoding/fredy )的开发者。我遇到了同样的问题。在深入研究这个问题后,我发现了他们如何检查你是否是机器人。

首先,他们设置了一个 localstorage 值。

localstorageAvailable: true
Run Code Online (Sandbox Code Playgroud)

如果可用,他们会设置一个值:

testLocalStorage: 1
Run Code Online (Sandbox Code Playgroud)

如果两者都有效,则设置一个名为 的 cookie reese84=xxx。这就是你想要的。如果您随请求发送此 cookie,它应该可以工作。我已经测试过几次了。

注意:这尚未在 Fredy 中实现,因此 immoscout 仍然无法在实时源上运行,因为我目前正在重写代码。