请求与redi进行奇怪的交互

2024-09-30 14:30:34 发布

您现在位置:Python中文网/ 问答频道 /正文

试着写一个小刮刀来提取马拉松比赛的成绩马拉松语言网站,无法重定向到显示正确的页面。在

网站上的导航非常简单:

当我遵循标准表单提交导航时,此结果页面仅显示分页装订器数据。但是,如果我刷新这个页面,或者直接输入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来模拟用户体验的争论,但我确信我的请求代码中缺少一些小东西。在

编辑:根据反馈,我更新了问题,以反映我的实际代码。在


Tags: comhttpurlwww事件页面resultsmax
1条回答
网友
1楼 · 发布于 2024-09-30 14:30:34

将您定向回events页面的原因是因为这个特定的POST请求需要一个推荐。这意味着,如果直接访问它,而不是来自预期的URL,它将不会处理您的请求。这可以阻止简单的表单数据发布操作以及字符串操作。在

一个简单的测试,看看这是否在页面中:尝试立即转到结果页面。会发生什么?几乎什么都没有,因为你被带着各自的mid返回到events页面。即使你试图操纵字符串,它也不会起作用。在

解决这个问题的方法是找到引用的URL。您可以通过检查标题并查找Referer键来完成此操作。见下面的截图。在

enter image description here

然后我们得到这个值并将其合并到POST请求中。下面是您的代码,经过修改以适应上述操作。在

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 = 'M,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'}
headers = {
"Referer":"http://www.marathonguide.com/results/browse.cfm?MIDD=472131103",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
}

results = s.post(rp, data=data, headers=headers)
soup = BeautifulSoup(results.content)

rows = soup.find_all("tr", {"bgcolor":"#CCCCCC"})
for row in rows:
  print row.find("td").get_text()

注意headers行以及新的results = s.post...行。另外,请注意,正确的性别值不是B,而是M。检查race_range行以了解我的意思。在

最后,结果如下:

^{pr2}$

与在浏览器中查看的页面本身的结果相匹配:

enter image description here

让我们知道这是否有帮助。在

相关问题 更多 >