Python 获取错误结果的网页时遇到问题

Python 获取错误结果的网页时遇到问题,python,python-3.x,web-scraping,Python,Python 3.x,Web Scraping,我已经用python编写了一个脚本,通过将postcode放在网页的输入框中来填充结果。我只想在控制台中看到所需的响应 我试用过的邮政编码: SW1A2AA 到目前为止,我写过: import requests from bs4 import BeautifulSoup link = "https://finddrivinginstructor.dvsa.gov.uk/DSAFindNearestWebApp/findNearest.form" payload = { 'post

我已经用python编写了一个脚本,通过将
postcode
放在网页的输入框中来填充结果。我只想在控制台中看到所需的响应

我试用过的邮政编码:

SW1A2AA
到目前为止,我写过:

import requests
from bs4 import BeautifulSoup

link = "https://finddrivinginstructor.dvsa.gov.uk/DSAFindNearestWebApp/findNearest.form"

payload = {
    'postcode': 'SW1A2AA'
}

with requests.Session() as s:
    res = s.post(link,data=payload,headers={
        'User-Agent':'Mozilla/5.0',
        'origin':'https://finddrivinginstructor.dvsa.gov.uk',
        })
    print(res.text)
我得到的输出:

<html style="height:100%"><head><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta name="viewport" content="initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><script type="text/javascript" src="/_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3"></script></head><body style="margin:0px;height:100%"><iframe src="/_Incapsula_Resource?SWUDNSAI=29&xinfo=8-25811410-0%200NNN%20RT%281565517742037%20111%29%20q%280%20-1%20-1%200%29%20r%280%20-1%29%20B12%2811%2c171583%2c0%29%20U6&incident_id=957001050101826332-146401351985596056&edet=12&cinfo=0b000000" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 957001050101826332-146401351985596056</iframe></body></html>
请求失败。Incapsula事件ID:957001050101826332-146401351985596056
所需的输出是结果页面中的任何内容


如何从结果页面中获取任何信息?

以下是一些使用Selenium搜索目标站点的基本代码。我没有添加结果块,但很容易添加


搜索结果是在“单击”时生成的,因此需要使用Selenium。该网站受Incapsula保护,Incapsula是一种Web应用程序防火墙,还提供机器人检测。简单的解决方案是从浏览器复制有效的cookie,但我会看看是否可以通过
请求
以编程方式获取它们。我认为问题在于
请求
没有那些cookie:
AWSALB
nlbi_1979198
,它们是通过访问(我想)获得的。该页面包含至少在两层中被混淆的Js代码。如果我们能设法去除代码中的漏洞,它可能会很有用。当我发现你在循环中时,事情会变得更清楚、更容易。Incapsula/Imperva是一个WAF,旨在检测和防止黑客,因此它可以轻松地检测自动请求。也许我应该警告你。你应该小心不要在短时间内发出太多的请求,而是尽可能地分散它们。当然,这并不能保证它不会检测到你,但我认为它更可能不会。关于第二个问题,我通过删除URL中的
?lang=en
部分,成功地获得了Selenium请求代码的结果。抱歉@Life很复杂,因为我的回答太晚了。我从来没有尝试过你的建议,因为我的目的只是坚持要求模块。谢谢,不用担心。有时你只是想知道你的努力是否有用。谢谢你的回复。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC

# Initiate Chrome Driver
chrome_options = Options()

# NOTE: This code was written on a MAC so this piece might need changed
driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=chrome_options)

# Open Search Page
target_url = 'https://finddrivinginstructor.dvsa.gov.uk/DSAFindNearestWebApp/findNearest.form?lang=en'
driver.get(target_url)

WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.ID, 'search-form')))

postcode = driver.find_element_by_id('postcode')
postcode.send_keys('SW1A2AA')

search_button = driver.find_element_by_xpath('//*[@id="search-form"]/fieldset/div/button')
search_button.click()