Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用登录页面从网站中抓取数据_Python_Python 3.x_Login_Python Requests_Scrape - Fatal编程技术网

Python 使用登录页面从网站中抓取数据

Python 使用登录页面从网站中抓取数据,python,python-3.x,login,python-requests,scrape,Python,Python 3.x,Login,Python Requests,Scrape,我正在尝试使用python登录我的大学网站,并使用以下代码登录请求库,但是我无法登录 import requests payloads = {"User_ID": <username>, "Password": <passwrord>, "option": "credential", "Log in":"Log in" } with requests.Session() as session: session.post('', data=payloads

我正在尝试使用python登录我的大学网站,并使用以下代码登录请求库,但是我无法登录

import requests

payloads = {"User_ID": <username>,
"Password": <passwrord>,
    "option": "credential",
"Log in":"Log in"
}
with requests.Session() as session:
    session.post('', data=payloads)
    get = session.get("")
print(get.text)
导入请求
有效载荷={“用户ID”:,
“密码”:,
“选项”:“凭证”,
“登录”:“登录”
}
将requests.Session()作为会话:
session.post(“”,数据=有效载荷)
get=session.get(“”)
打印(get.text)

有人知道我做错了什么吗?

为了用python登录网站,你必须使用比请求库更复杂的方法,因为你必须在代码中模拟浏览器,让它请求登录学校的网站服务器。原因是,您需要学校的服务器认为它正在从浏览器获取请求,然后它应该返回结果页面的内容,然后您必须呈现这些内容,以便您可以对其进行刮取。幸运的是,一个很好的方法是使用python中的selenium模块


我建议大家通过谷歌来了解更多关于硒的知识。是使用selenium登录网页的一个很好的例子,其中详细解释了每行代码的作用。使用selenium登录网站也是一个很好的切入点

要登录,您需要发布
标签要求的所有信息。在您的情况下,您还必须提供隐藏的输入。您可以通过抓取这些值,然后发布它们来实现这一点。您可能还需要发布一些标题来模拟浏览器行为

from lxml import html
import requests

s = requests.Session()
login_url = "https://intranet.cardiff.ac.uk/students/applications"
session_url = "https://login.cardiff.ac.uk/nidp/idff/sso?sid=1&sid=1"
to_get = s.get(login_url)
tree = html.fromstring(to_get.text)
hidden_inputs = tree.xpath(r'//form//input[@type="hidden"]')
payloads = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
payloads["Ecom_User_ID"] = "<username>"
payloads["Ecom_Password"] = "<password>"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
result = s.post(session_url, data=payloads, headers = headers)
从lxml导入html
导入请求
s=请求。会话()
登录\u url=”https://intranet.cardiff.ac.uk/students/applications"
会话url=”https://login.cardiff.ac.uk/nidp/idff/sso?sid=1&sid=1"
to_get=s.get(登录地址)
tree=html.fromstring(to_get.text)
hidden_inputs=tree.xpath(r'//form//input[@type=“hidden”]”)
有效载荷={x.attrib[“name”]:x.attrib[“value”]用于隐藏的_输入中的x}
有效载荷[“Ecom_用户ID”]=“”
有效载荷[“Ecom_密码”]=“”
headers={'User-Agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/63.0.3239.132 Safari/537.36'}
结果=s.post(会话\ url,数据=有效负载,标题=标题)

希望这能起作用

我们还需要做更多的事情,除非我们自己真的这么做。当使用data关键字时,请求将数据作为表单编码数据发布;当使用json关键字时,请求将数据作为json发布。这是一个相当普遍的问题,所以对你来说可能就是这个问题
session.post(url,json=data)
这是因为您将密码作为userid传递,将userid作为密码传递吗?@AlanHoover这是一个很好的呼叫,但遗憾的是,这只是我在上输入代码时的一个输入错误stackoverflow@Fozoro我只是浏览了一下有问题的网站。它是表单编码的数据,因此使用数据而不是json应该仍然有效。但还有另一个字段看起来像它的必需
“选项”:“credential”
。您应该使用chrome开发者工具的“网络”选项卡来查找此信息。基本上,只需查看有效请求的外观,然后尝试使用python重新创建这些请求。该网站还可能筛选出看起来不正确的请求,例如不正确的
Referer
标题等。@DerekR我已经更新了stackoverflow上的代码,请查看。我曾尝试在有效载荷中添加“option”和其他一些内容,但它不断重复打印这些内容(PS:我尝试只使用request.get而不使用有效载荷,它提供的内容与我尝试使用有效载荷时的内容相同)我将我的登录详细信息插入到您的代码中,很遗憾,它仍然不起作用,也许可以检查一下这个关于登录网站的信息。在底部的“单点登录”部分有一个关于登录网站的部分,这些网站会像您的情况一样将身份验证委托给其他人。