试着写一个小刮刀来提取马拉松比赛的成绩马拉松语言网站,无法重定向到显示正确的页面。在
网站上的导航非常简单:
当我遵循标准表单提交导航时,此结果页面仅显示分页装订器数据。但是,如果我刷新这个页面,或者直接输入URL,URL将反映结果页面,但显示事件页面。在
我的代码是:
import requests
from bs4 import BeautifulSoup
marathon = 'http://www.marathonguide.com/results/browse.cfm?MIDD=472131103'
s = requests.session()
p = s.get(marathon)
race_range = 'B,201,300,50062'
rp = 'http://www.marathonguide.com/results/makelinks.cfm'
data = {'RaceRange':race_range, 'RaceRange_Required':'You must make a selection before viewing results.', 'MIDD':'472131103', 'SubmitButton':'View'}
results = s.post(rp, data=data)
print results.status_code
print results.url
print results.text
>>> 200
>>> http://www.marathonguide.com/results/browse.cfm?MIDD=472131103&Gen=B&Begin=201&End=300&Max=50062
>>> HTML from http://www.marathonguide.com/results/browse.cfm?MIDD=472131103
基于我得到的HTML,我被发送回事件页面,想知道为什么服务器不喜欢我的帖子。关于使用selenium来模拟用户体验的争论,但我确信我的请求代码中缺少一些小东西。在
编辑:根据反馈,我更新了问题,以反映我的实际代码。在
将您定向回events页面的原因是因为这个特定的POST请求需要一个推荐。这意味着,如果直接访问它,而不是来自预期的URL,它将不会处理您的请求。这可以阻止简单的表单数据发布操作以及字符串操作。在
一个简单的测试,看看这是否在页面中:尝试立即转到结果页面。会发生什么?几乎什么都没有,因为你被带着各自的mid返回到events页面。即使你试图操纵字符串,它也不会起作用。在
解决这个问题的方法是找到引用的URL。您可以通过检查标题并查找
Referer
键来完成此操作。见下面的截图。在然后我们得到这个值并将其合并到POST请求中。下面是您的代码,经过修改以适应上述操作。在
注意
headers
行以及新的results = s.post...
行。另外,请注意,正确的性别值不是B
,而是M
。检查race_range
行以了解我的意思。在最后,结果如下:
^{pr2}$与在浏览器中查看的页面本身的结果相匹配:
让我们知道这是否有帮助。在
相关问题 更多 >
编程相关推荐