Соскоб Python: ошибки 403 и 503
Я пытаюсь просканировать некоторую общедоступную информацию (информацию о приложении Apple) на веб-сайте.
Этот веб-сайт требует авторизации для выполнения таких действий, как "поиск приложения / разработчика". Хотя существует много веб-сайтов, предоставляющих аналогичную информацию, но я считаю, что этот конкретный веб-сайт предоставляет наиболее полную и подробную информацию для каждого приложения.
Я, как действительный пользователь, могу выполнить задачу.
Однако, когда я пытаюсь получить доступ к информации через код Python, у меня возникает ошибка 403 при отправке запроса POST и ошибка 504 при отправке запроса Get.
Я пытался использовать
реальный заголовок userAgent
поддельный усерагент "
FancyOpener[/sth вроде этого, показан устаревшим для python 3.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'
}
------------------------------------------------ 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).