Запросы Python и cURL никогда не возвращают ответPython

Программы на Python
Anonymous
Запросы Python и cURL никогда не возвращают ответ

Сообщение Anonymous »

Я пытаюсь очистить веб-сайт NSE для конкретной компании на Python. Я пытаюсь это сделать, используя библиотеку Requests и соответствующий метод get(). Это должно вернуть файл .html, который я затем смогу использовать для дальнейшей обработки с помощью Beautiful Soup 4.

Код: Выделить всё

url = 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS'

response = requests.get(url)
Однако это не дает ответа даже через несколько минут, а вместо этого приводит к сбою моей системы. Судя по вопросу, Запросам Python GET требуется много времени для ответа на некоторые запросы,

Сервер может разрешать только определенные строки пользовательского агента

Я добавил строку пользовательского агента в заголовки запроса следующим образом:

Код: Выделить всё

url = 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS'
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
}

response = requests.get(url, headers=headers)
Этот метод также не решил проблему, дав мне понять, что это вряд ли проблема с производительностью. Вместо этого я решил попытаться исправить это, используя другой метод, упомянутый в вышеупомянутом вопросе:

IPv6 не работает, а IPv4 работает
На самом деле это было так: при попытке запустить его в режиме IPv6 я получил ошибку.

Код: Выделить всё

$ curl --ipv6 -v 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS'
* Could not resolve host: www.nseindia.com
* Closing connection
curl: (6) Could not resolve host: www.nseindia.com
Но и в этом случае режим IPv4 оказался не намного лучше.

Код: Выделить всё

$ curl --ipv4 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS' # -v removed to focus on the error
curl: (92) HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)
Очевидно, что веб-сайт также не поддерживает протокол HTTP/"#
m
2 и, наконец, запустился при запуске в этом режиме установлен HTTP/1.1.

Код: Выделить всё

curl --ipv4 -v 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS' --http1.1
* Host www.nseindia.com:443 was resolved.
* IPv6: (none)
* IPv4: 184.29.25.143
*   Trying 184.29.25.143:443...
* Connected to www.nseindia.com (184.29.25.143) port 443
* ALPN: curl offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 / x25519 / RSASSA-PSS
* ALPN: server accepted http/1.1
* Server certificate:
*  subject: C=IN; ST=Maharashtra; L=Mumbai; O=National Stock Exchange of India Ltd.; CN=www.nseindia.com
*  start date: May 28 00:00:00 2024 GMT
*  expire date: May 22 23:59:59 2025 GMT
*  subjectAltName: host "www.nseindia.com" matched cert's "www.nseindia.com"
*  issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=GeoTrust RSA CA 2018
*  SSL certificate verify ok.
*   Certificate level 0: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 1: Public key type RSA (2048/112 Bits/secBits), signed using sha256WithRSAEncryption
*   Certificate level 2: Public key type RSA (2048/112 Bits/secBits), signed using sha1WithRSAEncryption
* using HTTP/1.x
> GET /get-quotes/equity?symbol=20MICRONS HTTP/1.1
> Host: www.nseindia.com
> User-Agent: curl/8.8.0
> Accept: */*
>
* Request completely sent off
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
Однако запрос cURL по-прежнему не завершается. Затем я просмотрел вопросы, касающиеся самого веб-сайта NSE India, и нашел вопрос: Запросы Python получают код ответа 401 для веб-сайта NSE India,

Чтобы получить доступ к сайту NSE (api) несколько раз, а затем установить файлы cookie в каждом последующем запросе

по сути, рекомендуется добавить файлы cookie в запрос.

Код: Выделить всё

baseurl = 'https://www.nseindia.com/'
url = 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36',
'accept-language': 'en,gu;q=0.9,hi;q=0.8',
'accept-encoding': 'gzip, deflate, br'
}

session = requests.Session()
request = session.get(baseurl, headers=headers, timeout=5)
cookies = dict(request.cookies)
response = session.get(url, headers=headers, timeout=5, cookies=cookies)
Это решение по-прежнему сталкивалось с той же проблемой: запрос просто никогда не завершался. Этот вопрос был задан и получен для API NSE India, и вполне понятно, что он не работает. Я также проверил, добавив заголовок Accept в соответствии с комментарием @GTK,

вам нужно принять заголовок [...]

Код: Выделить всё

url = 'https://www.nseindia.com/get-quotes/equity?symbol=20MICRONS'
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
"Accept": "text/html"
}

response = requests.get(url, headers=headers)
К сожалению, это не влияет на проблему, возможно, потому, что для заголовка Accept уже установлено значение */*, которое допускает любой тип MIME.
Как мне поступить в этой ситуации и почему это происходит. Действительно ли запрос настолько медленный или произошла какая-то ошибка?

Подробнее здесь: https://stackoverflow.com/questions/786 ... a-response

Вернуться в «Python»