微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

登录后将无法继续执行Python Web抓取Intranet

如何解决登录后将无法继续执行Python Web抓取Intranet

我不熟悉Python网络抓取,REST API,HTML。首先,我不得不说,有很多不同的解决方案与我的问题类似。但是我的问题是通过Intranet网站获得的,与其他任何问题都不相似。自几天以来,我几乎研究了每个链接,并且在所有失败的尝试之后,由于没有得到任何帮助,因此我发布了此问题。请考虑我的努力,不要将其标记为重复或不必要的问题。

  1. 背景要求:

我正在尝试自动化内部网站上的某些列ID。为此,我使用python Web抓取来获取特定列的ID列表,然后将其设置为on或off。例如,如果某个ID与我在本地中拥有的excel文件中的ID相匹配,则应将该Intranet门户中的status列(与该ID平行)切换为打开或关闭。为此,我正在使用 请求 库。而且,只有在提供特定的用户名和密码身份验证后,此Intranet网站才能正常工作。

  1. 问题:

问题是我无法登录到该Web门户,然后无法导航到我需要使用Web抓取的页面。我所得到的只是“查看源代码” html脚本的一部分作为输出。即使当我直接抓取想要的导航网页(使用有效载荷作为用户名,密码)时,我仍然只获得此主页数据。任何人都可以建议我如何解决登录后从所需网页中抓取的数据吗?我不确定我是否能够成功登录,因为登录后我只是得到html 响应 作为状态代码。我了解找到该网站是成功代码。但是,登录后我看不到任何数据。抓取的数据是登录前的主页。

  1. 结果:

输出报废数据:

<!doctype html>
<html lang="en" ng-app="lm.login.application" class="lm-scroll-bar html-overflow" ng-strict-di>
<head>
    <Meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <Meta charset="utf-8">
    <Meta name="HandheldFriendly" content="True">
    <Meta name="viewport"
          content='width=device-width,height=device-height,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,target-densitydpi=device-dpi'/>
    <link rel="icon" href="../favicon.ico?ui-version=12.0.40.12" type="image/x-icon">
    <title>Login</title>
    <link rel="stylesheet" href="/ui/generated/webpack/authpoint.beaf402df60c88783fc6.min.css?ui-version=12.0.40.12"/>
    <script>
        var lmSession = {
            buildVersion: '76',redirectTarget: 'https\x3A\x2F\x2F<intanet_webportal_>\x2Dprod.<intanet_address_>group.net\x2Fui\x2F',language: 'english',userLanguageCode: 'en',isMLU: false,isProduction: true,isExternalAuthModeEnabled: false,productBrandEditiondisplayName: 'EDITION PLACEHOLDER',logLevel: 'error',siteParams: {"LOGIN_PAGE_NAME_LABEL": ""},loginNotice: '\x3Cdiv\x20style\x3D\x22font\x2Dsize\x3A120\x25\x3Bcolor\x3Ared\x3B\x22\x3EZur\x20erstmaligen\x20Nutzung\x20seit\x20dem\x20Update\x20Strg\x20\x2B\x20F5\x20dr\xFCcken\x20um\x20den\x20Seiten\x20Cache\x20zu\x20l\xF6schen.\x3C\x2Fdiv\x3E\x3Cbr\x3EWelcome\x20using\x20\x3Ca\x20href\x3D\x22http\x3A\x2F\x2F<intanet_webportal_>.<intanet_address_>group.net\x2F\x22\x20style\x3D\x22background\x2Dcolor\x3A\x23ffffa0\x22\x3ETAEE\x20Next\x3C\x2Fa\x3E\x20via\x20<intanet_webportal_>.\x3Cbr\x3E\x3Ca\x20href\x3D\x22https\x3A\x2F\x2Fvts4.<intanet_address_>group.net\x2Fsites\x2Ftundaee\x2F<intanet_webportal_>\x2FDocuments\x2FTAEE\x2DNext\x2520\x2D\x2520disclaimer.pdf\x3FWeb\x3D1\x22\x20style\x3D\x22background\x2Dcolor\x3A\x23ffffa0\x22\x3EErkl\xE4rung\x20zum\x20Datenschutz\x2FPrivacy\x20notice\x3C\x2Fa\x3E\x20\x3Cbr\x3E\x3Ca\x20href\x3D\x22https\x3A\x2F\x2Fvts4.<intanet_address_>group.net\x2Fsites\x2Ftundaee\x2F<intanet_webportal_>\x2FDocuments\x2FNUTZUNGSbedINGUNGEN\x2520TAEE\x2DNext.pdf\x22\x20style\x3D\x22background\x2Dcolor\x3A\x23ffffa0\x22\x3ENutzungsbedingungen\x3C\x2Fa\x3E'
        };
    </script>
</head>

<body ng-controller="lm.login.application.controller">

<noscript>
    <div class="browser-misconfig-alert">LM requires that JavaScript be enabled in your browser</div>
</noscript>

<script src="/ui/generated/webpack/authpoint.17231e2531a66bfe2e17.min.js"></script>

<div class="ng-cloak" class="web-ui-login-main-wrapper">
    <div class="web-ui-login-wrapper">
        <ng-include src="'login-app.html?ui-version=12.0.40.12'"></ng-include>
    </div>
</div>

</body>
</html>


Process finished with exit code 0`

尽管我进行了所有尝试,但我只能做到这点。但登录后无法登录或导航至下一页获取我想要的字段。

尝试的方法

  • 带有和不带有会话对象的Python请求(获取,发布)
  • 美丽汤
  • 机械化浏览器
  • 机械化汤 -urlopen(urllib)
  • 硒(网络驱动程序)
  • “会话元素”下“检查元素”下的网络文件

使用所有这些方法,我只会得到上面显示的html数据。我的网站没有 csrf令牌。它只有 xsrf标头

InspectElement

有人可以向我解释我在哪里失败,以及如何通过python抓取方式登录,导航和获取数据。由于内部限制,我必须只使用Python。我了解,响应 200 作为状态码并不意味着它已使用给定的用户ID和密码成功登录

非常感谢任何帮助。一百万吨谢谢!这将是 挽救生命的问题

由于这是Intranet网络门户,因此我更改了名称,以免泄露数据。希望你能理解

解决方法

您的硒方法对我来说似乎是正确的。这是您代码的稍作调整的版本。请检查元素选择器。主要思想是使用WebDriverWait等待所需的每个元素,然后滚动到该元素,然后再执行任何操作。对于按钮,使用EC.element_to_be_clickable代替EC.presence_of_element_located可能会有用。

检索某些容器元素后,出于调试原因,您可以使用print(element.get_attribute('innerHTML'))

from selenium import webdriver 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# delay for selenium web driver wait
DELAY = 30

# create selenium driver
chrome_options = webdriver.ChromeOptions()
#chrome_options.add_argument('--headless')
#chrome_options.add_argument('--no-sandbox')
driver = webdriver.Chrome('<<PATH_TO_CHROMEDRIVER>>',options=chrome_options)

# open web page
driver.get('<<URL>>')

# maximize window
driver.maximize_window()

# wait for username input,scroll to it,enter username
username = WebDriverWait(driver,DELAY).until(EC.presence_of_element_located((By.ID,"inputusername")))
driver.execute_script("arguments[0].scrollIntoView();",username)
username.send_keys("user") 

# wait for password input,enter password
password = WebDriverWait(driver,"password")))
driver.execute_script("arguments[0].scrollIntoView();",password)
password.send_keys("password")

# wait for submit button,click it
submit = WebDriverWait(driver,"login")))
driver.execute_script("arguments[0].scrollIntoView();",submit)
submit.click()

# quit driver
#driver.quit() 

如果有任何问题,则添加登录页面的HTML源(使用先前描述的element.get_attribute('innerHTML')方法)将很有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。