我正在尝试使用pythons的请求库从php脚本中检索html内容。
该脚本驻留在我的本地Apache服务器上,我直接在http://localhost/aaa/index.php
脚本的内容是:
<?php
$headers = json_encode(apache_request_headers());
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The Title</title>
<meta name="description" content="The Title">
</head>
<body>
<?php echo json_encode($headers); ?>
</body>
</html>
直接访问上述脚本会产生以下响应:
<head>
<meta charset="utf-8">
<title>The Title</title>
<meta name="description" content="The Title">
</head>
<body>
"{\"Host\":\"localhost\",\"User-Agent\":\"Mozilla\\\/5.0 (Windows NT 6.3; WOW64; rv:42.0) Gecko\\\
/20100101 Firefox\\\/42.0\",\"Accept\":\"text\\\/html,application\\\/xhtml+xml,application\\\/xml;q=0
.9,*\\\/*;q=0.8\",\"Accept-Language\":\"en-US,en;q=0.5\",\"Accept-Encoding\":\"gzip, deflate\",\"Cookie
\":\"menu=users%3Bconfiguration; fieldset=; PHPSESSID=tn82odn5hdtr45mw0bkd6rhf56; nr
=5c3ab462abb1d3364b8ba59fa4d8b7f6; ru=popopo; rp=64864wb5630986rgn5860f52vy0614909b8a8736
\",\"Connection\":\"keep-alive\",\"Cache-Control\":\"max-age=0\"}"
</body>
</html>
当我使用Python访问上述url [http://localhost/aaa/index.php
]时,我得到了不同的回复。
Python代码:
import requests
url = "http://localhost/aaa/index.php"
headers = {'User-Agent': 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.5',
'Connection': 'Keep-Alive',
'Content-Type': 'text/html; charset=UTF-8'}
req = requests.get(url, headers=headers)
print("Body :::", req.content)
回复:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>The Title</title>
<meta name="description" content="The Title">
</head>
<body>
"{\\"Host\\":\\"localhost\\",\\"Accept-Encoding\\":\\"gzip,
deflate\\",\\"Accept-Language\\":\\"en-US,en;q=0.5\\",
\\"Accept-Charset\\":\\"ISO-8859-1,utf-8;q=0.7,*;q=0.3\\",
\\"User-Agent\\":\\"Mozilla\\\\\\/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident
\\\\\\/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)\\",\\"Accept\\":\\"text\\\\\\/html,application
\\\\\\/xhtml+xml,application\\\\\\/xml;q=0.9,*
\\\\\\/*;q=0.8\\",\\"Connection\\":\\"Keep-Alive
\\",\\"Content-Type\\":\\"text\\\\\\/html; charset=UTF-8\\"}"
</body>
</html>
请注意&#34; Cookie&#34;我用Python请求资源时丢失了。 cookie是我实际想要检索的。我需要它,以便从其他php页面读取内容。
我也试过以下但没有成功:
import requests
url = "http://localhost/aaa/index.php"
session = requests.Session()
session.cookies.get_dict()
response = session.get(url, headers=headers)
print("Cookies :::", session.cookies.get_dict())
有没有办法帮助那个?
答案 0 :(得分:0)
您的浏览器正在为您的PHP代码添加“cookie”HTTP标头,因此您的PHP代码会返回它(根据您的代码)。这就是浏览器的作用:接受cookie的设置然后在请求中返回它们。 Python没有。
您的Python程序没有发送“cookie”HTTP标头,因此您的PHP代码不会返回它。您的Python仅发送'User-Agent','Accept','Accept-Charset','Accept-Encoding','Accept-Language','Connection'和'Content-Type'。但没有'Cookie'。
没有发送'Cookie'意味着没有“Cookie”:)
答案 1 :(得分:0)
PHP使用cookie跟踪您的用户,但前提是您正在使用会话。每当你开始一个会话时,PHP都会检查用户的请求,看看他是否已经定义了一个定义了会话ID的cookie(默认情况下名为PHPSESSID)。如果请求中没有cookie,PHP将生成一个新的会话ID。无论哪种方式,它都会将cookie发送回客户端作为响应,因此下次用户访问此页面或其他页面时,将显示具有唯一会话ID的cookie。
无。 PHP不会自动检查cookie请求。但是,之前设置的任何cookie都保持活动状态(直到它们过期)。因此,如果您的浏览器过去收到了PHPSESSID cookie并且尚未过期,它将保留它,并将继续将其发送到每个请求的服务器。因此,您的代码将能够在输出中检索并打印它。
除非你提出要求,否则什么都没有。如果你不告诉Python向服务器发送cookie,它就不会。由于它不会发送任何cookie,PHP脚本将不会收到任何cookie。由于PHP脚本没有在代码中的任何地方启动会话,因此它也不会自动创建任何会话。
您可以在PHP脚本中启动会话。然后它将始终生成一个cookie并发送响应。但请注意,它不允许您的Python脚本加入您可能已在浏览器中启动的某个会话,因为将生成新的会话ID 。要加入现有会话,您需要从浏览器的数据中检索PHPSESSID cookie,这些数据通常是加密的,以保护您的cookie免受恶意程序(甚至Python脚本)的侵害。
在你的php代码中,在开始之前,在任何输出之前写:
session_start()
嗯,至少那是几年前的一个解决方案。我不知道会话处理中最新的PHP时尚。