Python网络抓取已阻止

时间:2020-11-02 14:59:37

标签: python web-scraping beautifulsoup proxy

我想对德国房地产网站immobilienscout24.de进行网上抓取。我想下载给定URL的HTML,然后离线使用HTML。它不打算用于商业用途或出版物,我也不打算对该站点进行垃圾邮件发布,它仅用于编码实践。我想编写一个Python工具,该工具可以自动下载给定的immobilienscout24.de网站的HTML。我试图为此使用beautifulsoup,但是,解析的HTML不会显示内容,而是询问我是否是机器人等,这意味着我的网络爬虫被检测到并被阻止(我可以在Firefox中访问该站点)。我设置了一个引荐来源,一个延迟和一个用户代理。我还能做些什么来避免被检测到(即旋转代理,旋转用户代理,随机点击,其他未被检测到的网络抓取工具...)?我尝试使用电话IP,但结果相同。 GUI网络抓取工具不是一个选项,因为我需要使用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)

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

谢谢!

4 个答案:

答案 0 :(得分:3)

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

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

localstorageAvailable: true

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

testLocalStorage: 1

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

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

答案 1 :(得分:1)

尝试设置Accept-Language HTTP标头(这有助于我从服务器获得正确的响应):

import requests
from bs4 import BeautifulSoup

url = "https://www.immobilienscout24.de/Suche/de/wohnung-mieten?sorting=2#"

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0',
    'Accept-Language': 'en-US,en;q=0.5'
}

soup = BeautifulSoup(requests.get(url, headers=headers).content, 'html.parser')

for h5 in soup.select('h5'):
    print(h5.get_text(strip=True, separator=' '))

打印:

NEU Albertstadt: Praktisch geschnitten und großer Balkon
NEU Sehr geräumige 3-Raum-Wohnung in der Eisenacher Weststadt
NEU Gepflegte 3-Zimmer-Wohnung am Rosenberg in Hofheim a.Taunus
NEU ERSTBEZUG: Wohnung neu renoviert
NEU Freundliche 3,5-Zimmer-Wohnung mit Balkon und EBK in Rheinfelden
NEU Für Singles und Studenten! 2 ZKB mit EBK und Balkon
NEU Schöne 3-Zimmer-Wohnung mit 2 Balkonen im Parkend
NEU Öffentlich geförderte 3-Zimmer-Neubau-Wohnung für die kleine Familie in Iserbrook!
NEU Komfortable, neuwertige Erdgeschosswohnung in gefragter Lage am Wall
NEU Möbliertes, freundliches Appartem. TOP LAGE, S-Balkon, EBK, ruhig, Schwabing Nord/, Milbertshofen
NEU Extravagant & frisch saniert! 2,5-Zimmer DG-Wohnung in Duisburg-Neumühl
NEU wunderschöne 3 Zimmer Dachgeschosswohnung mit Einbauküche. 2er WG-tauglich.
NEU Erstbezug nach Sanierung: Helle 3-Zimmer-Wohnung mit Balkon in Monheim am Rhein
NEU Morgen schon im neuen Zuhause mit der ganzen Familie! 3,5 Raum zur Miete in DUI-Overbruch
NEU Erstbezug: ansprechende 2-Zimmer-EG-Wohnung in Bad Düben
NEU CALENBERGER NEUSTADT | 3-Zimmer-Wohnung mit großem Süd-Balkon
NEU Wohnen und Arbeiten in Bestlage von HH-Lokstedt !
NEU Erstbezug: Wohlfühlwohnen in modernem Dachgeschoss nach kompletter Sanierung!
NEU CASACONCEPT Stilaltbau-Wohnung München-Bogenhausen nahe Prinzregentenplatz
NEU schöne Wohnung mit Balkon und Laminatboden

答案 2 :(得分:1)

过一会再来回答这个问题...

为了您的信息,我在 Fredy 中恢复了对 Immoscout 的支持。看看这里。 https://github.com/orangecoding/fredy#immoscout

答案 3 :(得分:0)

也许可以和requests一起使用,下面的代码对我来说似乎很好:

import requests
from bs4 import BeautifulSoup

r = requests.get('https://www.immobilienscout24.de/')

soup = BeautifulSoup(r.text, 'html.parser')
print(soup.prettify)

另一种方法是使用selenium;它功能强大,但可能要复杂一些。

编辑:

使用Selenium的可能解决方案(对于您在评论中提供的链接,它似乎对我有用):

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome('path/to/chromedriver') # it can also work with Firefox, Safari, etc
driver.get('some_url')
soup = BeautifulSoup(driver.page_source, 'html.parser')

如果您以前从未使用过硒,请先看看here,以了解如何入门。