Я сталкиваюсь с этой проблемой, когда при доступе к источнику URL-адреса страницы с моего локального компьютера он работает нормально, но когда я запускаю тот же фрагмент кода на компьютере-героке, он показывает, что доступ запрещен.

Я пытался изменить заголовки (например, добавить Referers или изменить User-Agent), но ни одно из этих решений не работает.

МЕСТНАЯ МАШИНА

~/Development/repos/eater-list  master  python manage.py shell            1 ↵  12051  21:15:32
>>> from accounts.zomato import *
>>> z = ZomatoAPI()
>>> response = z.page_source(url='https://www.zomato.com/ncr/the-immigrant-cafe-khan-market-new-delhi')
>>> response[0:50]
'<!DOCTYPE html>\n<html  lang="en"  prefix="og: http'
>>> response[0:100]
'<!DOCTYPE html>\n<html  lang="en"  prefix="og: http://ogp.me/ns#" >\n<head>\n    <meta charset="utf-8"

УДАЛЕННАЯ МАШИНА

~ $ python manage.py shell
Python 3.5.7 (default, Jul 17 2019, 15:27:27)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from accounts.zomato import *
>>> z = ZomatoAPI()
>>> response = z.page_source(url='https://www.zomato.com/ncr/the-immigrant-cafe-khan-market-new-delhi')
>>> response
'<HTML><HEAD>\n<TITLE>Access Denied</TITLE>\n</HEAD><BODY>\n<H1>Access Denied</H1>\n \nYou don\'t have permission to access "http&#58;&#47;&#47;www&#46;zomato&#46;com&#47;ncr&#47;the&#45;immigrant&#45;cafe&#45;khan&#45;market&#45;new&#45;delhi" on this server.<P>\nReference&#32;&#35;18&#46;56273017&#46;1572225939&#46;46ec5af\n</BODY>\n</HTML>\n'
>>>

КОД API ZOMATO

Нет изменений в заголовках или запросах версии.

class ZomatoAPI:
    def __init__(self):
        self.user_key = api_key
        self.headers = {
            'Accept': 'application/json',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/77.0.3865.90 Safari/537.36',
            'user-key': self.user_key}

    def page_source(self, url):
        fng = requests.session()
        page_source = fng.get(
            url, headers=self.headers).content.decode("utf-8")
        return page_source

Буду признателен за некоторые советы по этому вопросу.

0
python 28 Окт 2019 в 04:30

1 ответ

Проверьте ответ HTTP-код состояния. Возможно, IP-адрес Heroku просто запрещен для Zomato. Это чаще, чем можно поверить - такие службы, как Cloudflare, часто помещают общие IP-адреса в «список запрещенных».

Вот, что вам следует искать в отношении кода состояния HTTP, чтобы дать вам больше контекста.

1
Felipe 28 Окт 2019 в 09:25
Собираюсь загрузить сертификат ssl на сервер, а затем проверить.
 – 
python
28 Окт 2019 в 20:57
Это тоже может быть причиной. В этом случае ваш код статуса HTTP для запроса без SSL к источнику SSL обычно приводит к 301 (перманентно перемещено).
 – 
Felipe
28 Окт 2019 в 21:02
Я получаю код статуса 403 и даже после добавления сертификата ssl.
 – 
python
29 Окт 2019 в 19:09
На второй взгляд кажется, что вы не используете их api должным образом. Согласно этому здесь, ваш запрос будет отправлен на https://developers.zomato.com/api/v2.1/ ссылка. Обратите внимание, что если вы удалите user_key в своем классе ZomatoApi() и запустите его локально, он все равно сможет вытащить страницу.
 – 
Felipe
29 Окт 2019 в 19:35
1
Я предполагаю, что они заблокировали IP-адреса AWS. Я собираюсь попробовать использовать прокси через запросы
 – 
python
29 Окт 2019 в 19:47