【发布时间】:2019-08-05 18:16:46
【问题描述】:
我在 python 中创建了一个脚本以使用凭据登录网页,然后从另一个链接解析一条信息SIGN OUT(该脚本应该被重定向到该链接)以确保我确实登录了.
我试过了:
import requests
from bs4 import BeautifulSoup
url = "https://member.angieslist.com/gateway/platform/v1/session/login"
link = "https://member.angieslist.com/"
payload = {"identifier":"usename","token":"password"}
with requests.Session() as s:
s.post(url,json=payload,headers={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36",
"Referer":"https://member.angieslist.com/member/login",
"content-type":"application/json"
})
r = s.get(link,headers={"User-Agent":"Mozilla/5.0"},allow_redirects=True)
soup = BeautifulSoup(r.text,"lxml")
login_stat = soup.select_one("button[class*='menu-item--account']").text
print(login_stat)
当我运行上述脚本时,我收到AttributeError: 'NoneType' object has no attribute 'text' 这个错误,这意味着我在登录过程中出现了错误,因为我希望解析SIGN OUT 的信息是静态内容。
如何解析来自该网页的 SIGN OUT 信息?
【问题讨论】:
-
如果您从浏览器复制经过身份验证的 cookie,它可以工作,但您必须将选择器更改为
"button[id*='menu-item']",就像下面 Tarun 的回答一样。似乎 API 返回了所需 cookie 的一些元素,因此可以从 json 响应中创建它。 -
是的,你的建议让我解决了@t.m.adam 的问题。您应该将其发布为未来读者的答案。顺便说一句,这就是我在获取请求标头
"Cookie": f'{"authToken="}{res.json()["authToken"]}'中传递 cookie 的方式,该标头取自第一个请求(帖子)。 -
太棒了!这几天有点忙,所以无法给出正确的答案,除此之外,是你想出了最终的解决方案。如果您不想给出答案,或者不想浪费赏金代表,您可以接受 Tarun 的答案,这也解决了问题。再见!
-
事实上,如果我坚持@t.m.adam 以上的当前实现,只需按照您的建议更改选择器就足以提取该内容。
-
是的,它比我们想象的要简单得多。该站点会自动设置 cookie,只需要更改选择器即可。所以这基本上是一个错字(不是吗?),但仍然是一个有趣的挑战。
标签: python python-3.x web-scraping python-requests