0

我现在正在学习网络抓取并构建一个简单的网络应用程序,我决定练习抓取课程表。这是我在应用程序中遇到问题的代码片段,它使用 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 上的一些设置吗?起初我以为是学校设置,但后来我想知道为什么它在本地运行没有任何问题......任何解释/建议将不胜感激!先感谢您。

4

1 回答 1

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

于 2020-03-10T21:56:37.960 回答