首页 > 解决方案 > 使用登录页面在 Python 中进行 Web 抓取

问题描述

我正在使用此代码尝试进行一些网络抓取。我正在尝试使用请求和漂亮的汤来访问我的学校成绩,但我在登录时遇到了很多麻烦。我只是收到错误消息:

TypeError: 'NoneType' object has no attribute '__getitem__'

这是我正在使用的代码:

import requests
from bs4 import BeautifulSoup

    headers = {
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

login_data = {
    'name': 'my_username',
    'pass': 'my_password',
    'form_id': 'new_login_form',
    'op': 'Login'
}

with requests.Session() as s:
    url = 'https://irc.d125.org'
    r = s.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'html5lib')
    login_data['form_build_id'] = soup.find('input', attrs={'name': 'form_build_id'})['value']
    r = s.post(url, data=login_data, headers=headers)
    print(r.content)

任何帮助表示赞赏!非常感谢!

标签: pythonweb-scrapingscreen-scraping

解决方案


当登录按钮被按下时,站点会发送一个带有登录信息的 xhr 请求。以下应该可以工作,只需在提供的空间中替换您的用户名和密码。

代码

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}

login_data = {
    "UserName": "REPLACE_USER",  # Enter Username
    "Password": "REPLACE_PASSWORD",  # Enter password
    "RememberMe": False,
}

with requests.Session() as s:
    url = 'https://irc.d125.org/Login'
    s.get(url, headers=headers)
    r = s.post(url, data=login_data)
    print(r.text)

推荐阅读