Соскоб Python: ошибки 403 и 503

Я пытаюсь просканировать некоторую общедоступную информацию (информацию о приложении Apple) на веб-сайте.

Этот веб-сайт требует авторизации для выполнения таких действий, как "поиск приложения / разработчика". Хотя существует много веб-сайтов, предоставляющих аналогичную информацию, но я считаю, что этот конкретный веб-сайт предоставляет наиболее полную и подробную информацию для каждого приложения.

Я, как действительный пользователь, могу выполнить задачу.

Однако, когда я пытаюсь получить доступ к информации через код Python, у меня возникает ошибка 403 при отправке запроса POST и ошибка 504 при отправке запроса Get.

Я пытался использовать

  1. реальный заголовок userAgent

  2. поддельный усерагент "

  3. FancyOpener[/sth вроде этого, показан устаревшим для python 3.4]

  4. HttpAuthM.. [/ sth как это, для аутентификации, все еще не работает]

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

Спасибо!!

Я пробовал этот заголовок:

ua = {#'User-Agent':'Mozilla/5.0 (compatible; Googlebot/2.1; +Googlebot - Webmaster Tools Help)',  
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36',  
      'Connection':'Keep-Alive',  
      'Accept-Language':'zh-CN,zh;q=0.8',  
      'Accept-Encoding':'gzip,deflate,sdch',  
      'Accept':'*/*',  
      'Accept-Charset':'GBK,utf-8;q=0.7,*;q=0.3',  
      'Cache-Control':'max-age=0'  
      }  

Ошибка 503

Ошибка 403

------------------------------------------------ HTTPError   
Traceback (most recent call last) <ipython-input-43-421b27c5194e> in <module>()
     68 data= data.encode('utf-8')
     69 request = urq.Request(url, data, headers = ua)
---> 70 response = urq.urlopen(request)
     71 the_page = response.read()
     72 print(the_page)

c:\python34\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    159     else:
    160         opener = _opener
--> 161     return opener.open(url, data, timeout)
    162 
    163 def install_opener(opener):

c:\python34\lib\urllib\request.py in open(self, fullurl, data, timeout)
    468         for processor in self.process_response.get(protocol, []):
    469             meth = getattr(processor, meth_name)
--> 470             response = meth(req, response)
    471 
    472         return response

c:\python34\lib\urllib\request.py in http_response(self, request, response)
    578         if not (200 <= code < 300):
    579             response = self.parent.error(
--> 580                 'http', request, response, code, msg, hdrs)
    581 
    582         return response

c:\python34\lib\urllib\request.py in error(self, proto, *args)
    506         if http_err:
    507             args = (dict, 'default', 'http_error_default') + orig_args
--> 508             return self._call_chain(*args)
    509 
    510 # XXX probably also want an abstract factory that knows when it makes

c:\python34\lib\urllib\request.py in _call_chain(self, chain, kind, meth_name, *args)
    440         for handler in handlers:
    441             func = getattr(handler, meth_name)
--> 442             result = func(*args)
    443             if result is not None:
    444                 return result

c:\python34\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs)
    586 class HTTPDefaultErrorHandler(BaseHandler):
    587     def http_error_default(self, req, fp, code, msg, hdrs):
--> 588         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    589 
    590 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 403: FORBIDDEN
----------------------------------------------

Приведенный ниже результат я получил с помощью "Advanced REST client", который является расширением Chrome для отправки запроса. Обратите внимание, что на странице, которая не требует входа, код 200; другой был 403 на странице входа. См. ссылку в комментарии ниже

[успех доступа] [3]

[сбой доступа][4]

1 ответ

Достаточно простого пакета запросов Python, вам не нужны другие пакеты.

Я уверен, что ваша проблема в том, что вы не совсем эмулируете запрос браузера. В Google Chrome и Mozilla Firefox вы сможете видеть заголовки запросов из панели разработчика.

Убедитесь, что вы всегда используете один и тот же объект сеанса.

Убедитесь, что не забыли установить правильные заголовки:

  • User-Agent
  • принимать
  • Accept-Language
  • Accept-Encoding
  • Реферер (URL предыдущего GET-запроса)
  • Соединение (keep-alive)
  • Хост ( abc.website.com)

,

session.headers = {
    'User-Agent' : 'real one',
    ...
}

Обязательно соблюдайте редиректы:

session.get(url, allow_redirects=True, timeout=x_secs)

В почтовых запросах обязательно отправляйте все обязательные поля, могут быть некоторые скрытые (например, токен csfr).

Другие вопросы по тегам