为什么尝试使用Mechanical Soup填写表单时得到400响应

时间:2018-11-27 21:34:31

标签: python web-scraping mechanicalsoup

我目前正在构建一个基本的网络爬虫,该爬虫使用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)

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

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

1 个答案:

答案 0 :(得分:1)

它仅在python3中发生,问题是int main() { Node* root = new Node("A"); cout << "status adding B to A: " << insert("A", "B", root) << endl; // return true cout << "status adding E to G: " << insert("G", "E", root) << endl; // return false cout << "status adding E to B: " << insert("B", "E", root) << endl; // return true return 0; } requests替换重定向URL中的空间

%09

您可以对其进行修补,转到第114行

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

并替换

python_dir\Lib\site-packages\requests\sessions.py

使用

location = location.encode('latin1')