来自python的url请求被服务器“阻止”

时间:2021-01-18 22:07:58

标签: python web-scraping python-requests

我编写了一个超级简单的脚本来从网站上抓取一些数据(最多 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)

3 个答案:

答案 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)

您能否从您之前使用的实际浏览器中获取标题。 这是如何在 Firefox 中获取它的示例。 切换“原始”切换有助于:

enter image description here