Python请求无法通过403 Forbidden刮取网页

时间:2018-03-13 12:53:24

标签: python web-scraping python-requests http-status-code-403

我想审核列车时刻表。火车有一个GPS,他们的位置发布在https://trenesendirecto.sofse.gob.ar/mapas/sanmartin/index.php我的计划是刮掉列车位置并检查他们到达车站的时间并将此信息发布给所有用户。 为了获得列车坐标,我在Python中编写以下脚本     导入请求,随机,字符串

#Function to generate random code for rnd
def RandomGenerator():
     x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
    return x

# URL requests
url = 'https://trenesendirecto.sofse.gob.ar/mapas/ajax_posiciones.php'

parametros = {
              'ramal':'31', 
              'rnd':RandomGenerator(),                   
              'key':'v%23v%23QTUNWp%23MpWR0wkj%23RhHTqVUM'}

encabezado = {
          'Host': 'trenes.sofse.gob.ar', 
          'Referer': 'https://trenesendirecto.sofse.gob.ar/mapas/sanmartin/index.php', 
          'X-Requested-With': 'XMLHttpRequest', 
          'Accept':'application/json, text/javascript, */*',
          'UserAgent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) \
                  Chrome/65.0.3325.146 Safari/537.36'
                }

res = requests.get(url, params = parametros, headers = encabezado, timeout=1)

# Output
print(res.url)
print(res.headers)
print(res.status_code)
print(res.content)

输出结果为:

https://trenesendirecto.sofse.gob.ar/mapas/ajax_posiciones.php?ramal=31&key=v%2523v%2523QTUNWp%2523MpWR0wkj%2523RhHTqVUM&rnd=ui8GObHTSpVpPqRo
{'Date': 'Tue, 13 Mar 2018 12:16:03 GMT', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Server': 'nginx'}
403
b'<html>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor="white">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'

使用浏览器中请求生成的相同url,我获得以下内容 output from browser,这正是我想要的。

为什么脚本不起作用?

是否有其他方法可以获取数据?

1 个答案:

答案 0 :(得分:0)

您是否尝试在REST客户端(例如Postman或Mozilla的RESTClient插件)上测试API网址?这是Web开发的第一步,然后才能在应用程序中使用Web服务。

此外,错误代码403表示您可能无权访问此数据或未设置正确的权限。后者最常见的情况是403错误,因为它与401 error不同。

您必须确认API是使用基本身份验证还是基于令牌的身份验证。

对此URL的RESTClient的一般GET请求给出状态:200OK,这意味着端点响应HTTP请求,但如果要请求某些信息则需要授权。

enter image description here