【问题标题】:POST Request to Heroku in Python - 403 Forbidden在 Python 中向 Heroku 发送 POST 请求 - 403 Forbidden
【发布时间】:2013-08-21 01:01:17
【问题描述】:

我目前正在学习网络抓取并构建一个简单的网络应用程序,我决定练习抓取课程表。这是我在应用程序中遇到问题的代码 sn-p,使用 Python 2.7.4、Flask、Heroku、BeautifulSoup4 和 Requests。

import requests
from bs4 import BeautifulSoup as Soup

url = "https://telebears.berkeley.edu/enrollment-osoc/osc"
code = "26187"
values = dict(_InField1 = "RESTRIC", _InField2 = code, _InField3 = "13D2")
html = requests.post(url, params=values)
soup = Soup(html.content, from_encoding="utf-8")

sp = soup.find_all("div", {"class" : "layout-div"})[2]
print sp.text

这在本地效果很好。它按预期返回字符串“Computer Science 61A P 001 LEC:”。但是,当我尝试在 Heroku 上运行它时(使用 heroku run bash 然后运行 ​​python),我得到了一个错误,403 Forbidden

我是否缺少 Heroku 上的某些设置?起初我以为是学校设置,但后来我想知道为什么它在本地运行没有任何问题......任何解释/建议将不胜感激!提前谢谢你。

【问题讨论】:

  • 我相信 403 错误来自 CSRF 问题。
  • 谢谢,这意味着我应该无法获得有关 Heroku 的信息?我已经搜索并找到了这个flask.pocoo.org/snippets/3,但我不确定它与我现在需要的东西有多大关系
  • 我不太了解 Heroku,但我知道 Django,其中应该提供 CSRF 令牌作为表单中的隐藏字段。这样 Django 就知道表单是可以安全阅读的。我认为您的要求从那里缺少这种安全性。 当我尝试在 Heroku 上运行它时 是什么意思?您是否尝试使用位于 Heroku 上的脚本从外部网站获取字符串?
  • 是的,完全正确。我在heroku上部署了我的应用程序,但它没有做任何事情(Chrome开发工具说POST请求中有问题),所以我缩小了问题范围,在heroku的shell中制作了一个小脚本,我在上面发布的部分给出了错误。
  • 那么我相信您的问题是 Heroku 特有的。可能确实缺少一些设置。您可以随时联系 Heroku 支持,抱歉,我无法为您提供更多帮助。

标签: python-2.7 heroku beautifulsoup python-requests


【解决方案1】:

我遇到了类似的问题,请求在本地工作,但在 Heroku 上被阻止。看起来问题是某些网站阻止了来自 Heroku(在 AWS 服务器上)的请求。为了解决这个问题,您可以通过代理服务器发送您的请求。

heroku 中有很多不同的附加组件来实现这一点,我选择了具有合理大小的免费层的 fixie。

安装:

heroku addons:create fixie:tricycle

然后导入到你的本地环境中,这样你就可以在本地尝试了:

heroku config -s | grep FIXIE_URL >> .env

然后在你的 python 文件中添加几行:

import os
import requests
from bs4 import BeautifulSoup as Soup

proxyDict = {
    "http"  : os.environ.get('FIXIE_URL', ''),
    "https" : os.environ.get('FIXIE_URL', '')
}

url = "https://telebears.berkeley.edu/enrollment-osoc/osc"
code = "26187"
values = dict(_InField1 = "RESTRIC", _InField2 = code, _InField3 = "13D2")
html = requests.post(url, params=values, proxies=proxyDict)
soup = Soup(html.content, from_encoding="utf-8")

sp = soup.find_all("div", {"class" : "layout-div"})[2]
print sp.text

Fixie 的文档在这里: https://devcenter.heroku.com/articles/fixie

【讨论】:

  • 我认为这是我的 issue 的问题我尝试了你提到的这个代理,但它似乎对我的情况没有帮助
猜你喜欢
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2020-12-05
  • 2019-12-21
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
相关资源
最近更新 更多