我已经使用请求模块在python中创建了一个脚本,以获取使用此电子邮件africk2@nd.edu
填写表单后显示的一些信息。问题是,当我按下搜索按钮时,我可以看到一个新选项卡,其中包含我想获取的所有信息。此外,我在chrome开发工具的All
部分下的Network
标签中看不到任何链接。因此,我对于如何使用请求模块获取信息毫无希望。
手动填充结果的步骤:
将此电子邮件地址
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)
上面的脚本是错误的方法。但是,我找不到任何方法来获取与该电子邮件相关的信息。
P.S。我不追求面向硒的解决方案。
答案 0 :(得分: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
模块对值本身进行编码。否则,+
符号将进行双重编码。