Python 网页抓取已阻止
Python webscraping blocked
我想抓取德国房地产网站 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
谢谢!
也许可以试试 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 的解决方案(对于我在评论中提供的 link 而言它似乎对我有用):
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')
如果您以前没有使用过 selenium,请先看看 here 如何开始。
尝试设置 Accept-Language
HTTP header(这对我来说很有效,可以从服务器获得正确的响应):
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
我是 Fredy (https://github.com/orangecoding/fredy) 的开发者。我遇到了同样的问题。在深入研究这个问题后,我发现他们是如何检查你是否是机器人的。
首先他们设置了一个本地存储值。
localstorageAvailable: true
如果可用,他们会设置一个值:
testLocalStorage: 1
如果两者都有效,则会设置一个名为 reese84=xxx
的 cookie。
这就是你想要的。如果您将此 cookie 与您的请求一起发送,它应该可以工作。我已经测试过几次了。
注意:这尚未在 Fredy 中实现,因此 immoscout 仍然无法在实时源上运行,因为我目前正在重写代码。
过一会儿再回到这个问题...
供您参考,我在 Fredy 中恢复了对 Immoscout 的支持。看看这里。
https://github.com/orangecoding/fredy#immoscout
我想抓取德国房地产网站 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
谢谢!
也许可以试试 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 的解决方案(对于我在评论中提供的 link 而言它似乎对我有用):
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')
如果您以前没有使用过 selenium,请先看看 here 如何开始。
尝试设置 Accept-Language
HTTP header(这对我来说很有效,可以从服务器获得正确的响应):
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
我是 Fredy (https://github.com/orangecoding/fredy) 的开发者。我遇到了同样的问题。在深入研究这个问题后,我发现他们是如何检查你是否是机器人的。
首先他们设置了一个本地存储值。
localstorageAvailable: true
如果可用,他们会设置一个值:
testLocalStorage: 1
如果两者都有效,则会设置一个名为 reese84=xxx
的 cookie。
这就是你想要的。如果您将此 cookie 与您的请求一起发送,它应该可以工作。我已经测试过几次了。
注意:这尚未在 Fredy 中实现,因此 immoscout 仍然无法在实时源上运行,因为我目前正在重写代码。
过一会儿再回到这个问题...
供您参考,我在 Fredy 中恢复了对 Immoscout 的支持。看看这里。 https://github.com/orangecoding/fredy#immoscout