Python requests: как парсить "авито"?
Не получается средствами python и библиотеки requests сделать запрос на авито: всегда возвращается ответ 403, хотя средствами php-curl я получил нужный мне код ответа 200
Headers'ы в python разные пробовал, но все тщетно...
Код python:
headers={'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
r=requests.get('https://www.avito.ru//omsk/avtomobili?radius=200',headers=headers)
print(r)
код php:
$agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36';
$c=curl_init('https://www.avito.ru/omsk/avtomobili?radius=200');
curl_setopt($c, CURLOPT_USERAGENT, $agent);
curl_setopt($c,CURLOPT_RETURNTRANSFER,true);
$response=curl_exec($c);
curl_close($c);
echo $response;
Ответы (1 шт):
Автор решения: J0hn SCA
→ Ссылка
Requests в Python по умолчанию использует устаревший протокол TLS V1. Для корректной работы парсера рекомендую вам использовать TLS не ниже V1.2.
Пример:
import ssl
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_
CIPHERS = """ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA"""
class TlsAdapter(HTTPAdapter):
def __init__(self, ssl_options=0, **kwargs):
self.ssl_options = ssl_options
super(TlsAdapter, self).__init__(**kwargs)
def init_poolmanager(self, *pool_args, **pool_kwargs):
ctx = ssl_.create_urllib3_context(ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options)
self.poolmanager = PoolManager(*pool_args, ssl_context=ctx, **pool_kwargs)
session = requests.session()
adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)
try:
r = session.request('GET', 'https://www.avito.ru')
print(r.text)
except Exception as exception:
print(exception)