使用登录页面在 Python 中进行 Web 抓取

Web Scraping in Python with a Login Page

我正在使用此代码尝试进行一些网络抓取。我正在尝试使用 requests 和 beautiful soup 访问我的学校成绩,但我在登录时遇到了很多问题。我只是收到错误消息:

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)

感谢任何帮助!非常感谢!

在发布数据之前,您应该使用一些东西来呈现网页的 javascript。一个好的方法是将您的登录脚本与 Splash:

结合使用 Scrapy 蜘蛛程序

https://github.com/scrapy-plugins/scrapy-splash

您可以使用硒。我也用它从学校页面上获取我的成绩。

按下登录按钮后,网站会发送带有登录信息的 xhr 请求。以下应该有效,只需在提供的 space 中替换您的用户名和密码。

代码

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)