【问题标题】:Unable to scrape a piece of static information from a webpage无法从网页中抓取一条静态信息
【发布时间】:2019-08-05 18:16:46
【问题描述】:

我在 python 中创建了一个脚本以使用凭据登录网页,然后从另一个链接解析一条信息SIGN OUT(该脚本应该被重定向到该链接)以确保我确实登录了.

Website address

我试过了:

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


【解决方案1】:

本网站需要使用 JavaScript。虽然您从登录 API 正确生成了登录令牌,但是当您转到主页时,它会进行多次额外的 API 调用,然后更新页面。

所以这个问题与登录不起作用无关。您需要为此使用硒之类的东西

from selenium import  webdriver

driver = webdriver.Chrome()

driver.get("https://member.angieslist.com/member/login")
driver.find_element_by_name("email").send_keys("none@getnada.com")
driver.find_element_by_name("password").send_keys("NUN@123456")
driver.find_element_by_id("login--login-button").click()
import time
time.sleep(3)
soup = BeautifulSoup(driver.page_source,"lxml")
login_stat = soup.select("[id*='menu-item']")

for item in login_stat:
    print(item.text)
print(login_stat)
driver.quit()

我在这里混合了bs4selenium 以方便您使用,但如果您愿意,也可以只使用selenium

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    相关资源
    最近更新 更多