我编写了一个超级简单的脚本来从网站上抓取一些数据(最多 100 个条目)供个人使用(这样我就可以进行快速比较)。
但是每当我收到请求的页面时,我都会收到一个不同的页面,说他们认为我不是真正的用户(这是真的)。我该如何规避?因为如果我在新的隐身窗口中从代码中打开 url,它会加载。
所以我错过了一些特定的标题吗?
还是我需要做一些不同的事情?
这是我目前编写的代码:
import requests
from lxml import etree
import mysql.connector
from mysql.connector import Error
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8,la;q=0.7',
'Referer': 'https://www.google.com/',
'sec-ch-ua': '"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'cross-site',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
base_request_url = 'https://www.funda.nl/koop/gemeente-eindhoven/verkocht/200000-350000/sorteer-postcode-af/p'
request_page_id = 1
request_url = base_request_url + str(request_page_id)
res = requests.get(request_url, headers = headers)
print(res.text)
答案 0 :(得分:1)
也许对于您的情况来说就足够了,而不是绕过这个问题,只需下载页面即可。然后你可以将html文件指定为(base_)request_url。
(抱歉,我还没有足够的声誉来撰写评论)
答案 1 :(得分:1)
您可以将 headers
更改为
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36'}
这是在无头模式下使用 selenium
的替代方法。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
#Set up user agent to avoid bot detection.
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36'
#Specify headless mode
chrome_options.add_argument("--headless")
#Add user agent
chrome_options.add_argument(f'user-agent={user_agent}')
DRIVER_PATH = "path/to/chromedriver"
driver = webdriver.Chrome(DRIVER_PATH, options=chrome_options)
driver.get("https://www.funda.nl/koop/gemeente-eindhoven/verkocht/200000-350000/sorteer-postcode-af/p")
page_source = driver.page_source
答案 2 :(得分:0)