#asp.net-mvc #python-3.x #python-requests #web-crawler
#asp.net-mvc #python-3.x #python-запросы #веб-сканер
Вопрос:
Я хочу обход веб-приложения (ASP.NET ) для которого требуется логин.
URL, с которого я хочу сканировать данные:https://wo.gruposese.com/mod_Clientes/Pedido
URL для входа в систему:https://wo.gruposese.com/Login.aspx?ReturnUrl=/Default.aspx
Я попробовал следующий код (я использую прокси, но в этом коде я опускаю часть прокси, потому что он работает нормально, что означает, что я могу получить простой HTML-код с веб-сайта, но просто не могу войти в систему — так что это не должно быть проблемой):
import requests
from lxml import html
username = "I-am-a-username"
password = "I-am-a-password"
url = "https://wo.gruposese.com/Login.aspx?ReturnUrl=/Default.aspx"
session_requests = requests.session()
result = session_requests.get(url)
tree = html.fromstring(result.text)
auth_key = list(set(tree.xpath("//input[@name='__VIEWSTATE']/@value")))[0]
payload = {
"LoginControl$UserName": username,
"LoginControl$Password": password,
"__VIEWSTATE": auth_key
}
session_requests.get(url, data=payload, headers=dict(referer=url))
Однако я получаю, казалось бы, бесконечное сообщение об ошибке:
---------------------------------------------------------------------------
gaierror Traceback (most recent call last)
C:Anaconda3libsite-packagesurllib3connection.py in _new_conn(self)
158 conn = connection.create_connection(
--> 159 (self._dns_host, self.port), self.timeout, **extra_kw)
160
C:Anaconda3libsite-packagesurllib3utilconnection.py in create_connection(address, timeout, source_address, socket_options)
56
---> 57 for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
58 af, socktype, proto, canonname, sa = res
C:Anaconda3libsocket.py in getaddrinfo(host, port, family, type, proto, flags)
747 addrlist = []
--> 748 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
749 af, socktype, proto, canonname, sa = res
gaierror: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
NewConnectionError Traceback (most recent call last)
C:Anaconda3libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
599 body=body, headers=headers,
--> 600 chunked=chunked)
601
C:Anaconda3libsite-packagesurllib3connectionpool.py in _make_request(self, conn, method, url, timeout, chunked, **httplib_request_kw)
342 try:
--> 343 self._validate_conn(conn)
344 except (SocketTimeout, BaseSSLError) as e:
C:Anaconda3libsite-packagesurllib3connectionpool.py in _validate_conn(self, conn)
838 if not getattr(conn, 'sock', None): # AppEngine might not have `.sock`
--> 839 conn.connect()
840
C:Anaconda3libsite-packagesurllib3connection.py in connect(self)
300 # Add certificate verification
--> 301 conn = self._new_conn()
302 hostname = self.host
C:Anaconda3libsite-packagesurllib3connection.py in _new_conn(self)
167 raise NewConnectionError(
--> 168 self, "Failed to establish a new connection: %s" % e)
169
NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
MaxRetryError Traceback (most recent call last)
C:Anaconda3libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
448 retries=self.max_retries,
--> 449 timeout=timeout
450 )
C:Anaconda3libsite-packagesurllib3connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
637 retries = retries.increment(method, url, error=e, _pool=self,
--> 638 _stacktrace=sys.exc_info()[2])
639 retries.sleep()
C:Anaconda3libsite-packagesurllib3utilretry.py in increment(self, method, url, response, error, _pool, _stacktrace)
397 if new_retry.is_exhausted():
--> 398 raise MaxRetryError(_pool, url, error or ResponseError(cause))
399
MaxRetryError: HTTPSConnectionPool(host='wo.gruposese.com', port=443): Max retries exceeded with url: /Login.aspx?ReturnUrl=/Default.aspx (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
During handling of the above exception, another exception occurred:
ConnectionError Traceback (most recent call last)
<ipython-input-1-f6691b6c307b> in <module>
23
24
---> 25 session_requests.get(url, data=payload, headers=dict(referer=url))
C:Anaconda3libsite-packagesrequestssessions.py in get(self, url, **kwargs)
544
545 kwargs.setdefault('allow_redirects', True)
--> 546 return self.request('GET', url, **kwargs)
547
548 def options(self, url, **kwargs):
C:Anaconda3libsite-packagesrequestssessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
531 }
532 send_kwargs.update(settings)
--> 533 resp = self.send(prep, **send_kwargs)
534
535 return resp
C:Anaconda3libsite-packagesrequestssessions.py in send(self, request, **kwargs)
644
645 # Send the request
--> 646 r = adapter.send(request, **kwargs)
647
648 # Total elapsed time of the request (approximately)
C:Anaconda3libsite-packagesrequestsadapters.py in send(self, request, stream, timeout, verify, cert, proxies)
514 raise SSLError(e, request=request)
515
--> 516 raise ConnectionError(e, request=request)
517
518 except ClosedPoolError as e:
ConnectionError: HTTPSConnectionPool(host='wo.gruposese.com', port=443): Max retries exceeded with url: /Login.aspx?ReturnUrl=/Default.aspx (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x00000006B0B48470>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
У меня есть два вопроса:
-
Я, по-видимому, что-то здесь не так, но я уже так много пробовал, и у меня ничего не работает. Обычно я предполагаю наличие токена csrf для использования в словаре полезной нагрузки, но на этом веб-сайте, похоже, его нет… Я не уверен, что проблема здесь в «__VIEWSTATE».
-
Кроме того, мне интересно, как я могу продолжить после входа на фактическую веб-страницу (см. URL выше) в этом ASP.net регистрировать и сканировать данные оттуда?
P.S. Мне не разрешено устанавливать Selenium и, следовательно, необходимо решить проблему с запросами или scrapy.
Комментарии:
1. Для # 1, ASP.Net Viewstate может быть сложным. Иногда это зависит от javascript, и если вы не реплицируете это точно, страницы не будут отображать правильные данные. Например, вместо запроса get на URL для следующей страницы вам может потребоваться опубликовать общий щелчок кнопки «далее» на той же странице, чтобы увеличить значение ViewState или Session, которое вы не можете прочитать чисто. По этой причине ASP.net страницы webforms имеют репутацию немного более сложных для обхода. Часто владельцы сайтов рассматривают это как функцию.
2. Для части # 2 сервер, скорее всего, установит cookie, который вы должны включить вместе с последующими запросами. Этот файл cookie будет содержать токен аутентификации, который будет проверен на соответствие вашей подписи запроса (тот же исходный IP / пользовательский агент / токен csrf).