【问题标题】:Unable to grab some information displayed in a new tab无法获取新选项卡中显示的某些信息
【发布时间】:2019-07-13 20:56:33
【问题描述】:

我使用请求模块在 python 中创建了一个脚本,以获取在使用此电子邮件africk2@nd.edu 填写表单时显示的一些信息。问题是当我点击搜索按钮时,我可以看到一个包含我想要获取的所有信息的新标签。此外,我在 chrome 开发工具的 Network 部分下的 All 选项卡中看不到任何链接。所以,我对如何使用 requests 模块获取信息感到绝望。

website address

手动填充结果的步骤:

将此电子邮件地址africk2@nd.edu 放在Email address 的输入框旁边,然后点击Search 按钮。

我试过了:

import requests
from bs4 import BeautifulSoup

url = "https://eds.nd.edu/search/index.shtml"
post_url = "https://eds.nd.edu/cgi-bin/nd_ldap_search.pl"

res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text,"lxml")
payload = {item['name']:item.get('value','') for item in soup.select('input[name]')}
payload['email'] = 'africk2@nd.edu'
del payload['clear']

resp = requests.post(post_url,data=payload)
print(resp.content)

上面的脚本是错误的方法。但是,我找不到任何想法来获取与该电子邮件相关的信息。

附:我不追求面向硒的解决方案。

【问题讨论】:

  • 我很好奇你为什么不寻找硒?因为您可以无头运行 chrome 并拥有一个简单的解决方案,甚至看不到正在使用的浏览器。只是想知道是否没有无头是原因..
  • 因为我已经知道如何使用 selenium 实现相同的目标。这是driver.window_handles 可以解决问题的方法。但是,我不知道在这种情况下如何继续使用 requests 模块以实现相同的@Nic Laforge。
  • @MITHU 请看我的回答
  • 我同意。问题似乎是您希望抓取的数据正在服务器端呈现。这意味着普通的旧请求模块不会削减它。原因是请求通过在加载后立即从网页中抓取数据来工作。它在加载后不会抓取任何数据。您希望抓取的数据在最初加载(由 JS 或后端语言呈现)后被添加到页面中。因此,您需要一个能够在页面加载后从页面中获取数据的工具。所以是的,我担心硒是最好和最简单的方法。

标签: python python-3.x web-scraping


【解决方案1】:

好的,解决了:

from urllib.parse import quote

import requests


def get_contact_html(email: str):
    encoded = quote('o=\"University of Notre Dame\", '
                    'st=Indiana, '
                    'c=US?displayName,edupersonaffiliation,ndTitle,ndDepartment,postalAddress,telephoneNumber,mail,searchGuide,labeledURI,'
                    'uid?'
                    'sub?'
                    f'(&(ndMail=*{email}*))')
    data = {
        "ldapurl": f'LDAP://directory.nd.edu:389/{encoded}',
        "ldaphost": "directory.nd.edu",
        "ldapport": '389',
        "ldapbase": 'o="University of Notre Dame", st=Indiana, c=US',
        "ldapfilter": f'(&(ndMail=*{email}*))',
        "ldapheadattr": "displayname",
        "displayformat": "nd",
        "ldapmask": "",
        "ldapscope": "",
        "ldapsort": "",
        "ldapmailattr": "",
        "ldapurlattr": "",
        "ldapaltattr": "",
        "ldapjpgattr": "",
        "ldapdnattr": "",
    }
    res = requests.post('https://eds.nd.edu/cgi-bin/nd_ldap_search.pl',
                        data=data)
    res.raise_for_status()
    return res.text


if __name__ == '__main__':
    html = get_contact_html('africk2@nd.edu')
    print(html)

输出:

...
Formal Name:
...
Aaron D Frick
...

这将为您提供页面的 HTML。 诀窍是将编码空间+ 转换为"ldapbase": 'o="University of Notre Dame", st=Indiana, c=US', 字段中的真实空间,并让requests 模块对值本身进行编码。否则+ 符号会被双重编码。

【讨论】:

  • 您也可以通过查看帖子结果 url 的网络选项卡来获得相同的信息。只需要刷新页面
  • 是的,当我开始监控弹出页面时就意识到了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多