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