为什么我在尝试使用 Mechanical Soup 填写表格时收到 400 响应

Why am I getting a 400 response when trying to fill in a form using Mechanical Soup

我目前正在构建一个基本的网络爬虫,它使用 Python 和 MechanicalSoup 从 National Rail 获取火车票价格。

我正在尝试使用基本的火车数据(起点站和终点站,以及日期和时间)填写表格,这样我就可以获得特定火车旅程的票价。

这是我用来填写表格的代码

import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup as Soup
import mechanicalsoup

#Mechanical soup
browser = mechanicalsoup.StatefulBrowser()
browser.open("http://www.nationalrail.co.uk/")

#Find the correct form
trainForm = browser.select_form('form[action="http://ojp.nationalrail.co.uk/service/planjourney/plan"]')

#Basic parameters (start and end, and date and time)
browser["from.searchTerm"]                              = "Norwich"
browser["to.searchTerm"]                                = "London Liverpool Street"
browser["timeOfOutwardJourney.monthDay"]                = "28/11/2018"
browser["timeOfOutwardJourney.hour"]                    = 13 
browser["timeOfOutwardJourney.minute"]                  = 15 
browser["_checkbox"]                                    = "off"                           

#Submit the form
browser.launch_browser()
response = browser.submit_selected()

#print the response
print(response)

我遇到的问题是当表单提交时 returns <Response [400]>。研究使我相信我的表格填写不正确。但是,当执行 browser.launch_browser() 并且打开我的浏览器时,所有字段似乎都已正确填写,如果我自己按下提交,则表单会正确提交并打开正确的票价页面。

有人知道我做错了什么吗?

它只发生在 python3,问题是 requests 将重定向 URL 中的 space 替换为 %09

print(response.url)
# http://www.nationalrail.co.uk/times_fares/109179.aspx%09%09%09%09

你可以打补丁,去

的第114行
python_dir\Lib\site-packages\requests\sessions.py

并替换

location = location.encode('latin1')

location = location.strip().encode('latin1')