在Python中对Heroku的POST请求 - 403禁止

时间:2013-08-19 09:17:04

标签: python-2.7 heroku beautifulsoup python-requests

我正在学习网络抓取并建立一个简单的网络应用程序,我决定练习刮取课程安排。这是我在我的应用程序中遇到问题的代码片段,使用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的一些设置吗?起初我以为这是学校的设置,但后来我想知道为什么它在本地工作没有任何麻烦...任何解释/建议将非常感谢!提前谢谢。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,请求在本地运行,但在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