使用Python请求库检索内容

时间:2015-12-10 20:31:11

标签: php python apache session cookies

我正在尝试使用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())

有没有办法帮助那个?

2 个答案:

答案 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)

  1. PHP会话的工作原理。
  2. PHP使用cookie跟踪您的用户,但前提是您正在使用会话。每当你开始一个会话时,PHP都会检查用户的请求,看看他是否已经定义了一个定义了会话ID的cookie(默认情况下名为PHPSESSID)。如果请求中没有cookie,PHP将生成一个新的会话ID。无论哪种方式,它都会将cookie发送回客户端作为响应,因此下次用户访问此页面或其他页面时,将显示具有唯一会话ID的cookie。

    1. 不使用会话时会发生什么。
    2. 无。 PHP不会自动检查cookie请求。但是,之前设置的任何cookie都保持活动状态(直到它们过期)。因此,如果您的浏览器过去收到了PHPSESSID cookie并且尚未过期,它将保留它,并将继续将其发送到每个请求的服务器。因此,您的代码将能够在输出中检索并打印它。

      1. 当您从Python脚本发送请求时会发生什么。
      2. 除非你提出要求,否则什么都没有。如果你不告诉Python向服务器发送cookie,它就不会。由于它不会发送任何cookie,PHP脚本将不会收到任何cookie。由于PHP脚本没有在代码中的任何地方启动会话,因此它也不会自动创建任何会话。

        1. 如何解决。
        2. 您可以在PHP脚本中启动会话。然后它将始终生成一个cookie并发送响应。但请注意,它不允许您的Python脚本加入您可能已在浏览器中启动的某个会话,因为将生成新的会话ID 。要加入现有会话,您需要从浏览器的数据中检索PHPSESSID cookie,这些数据通常是加密的,以保护您的cookie免受恶意程序(甚至Python脚本)的侵害。

          1. 结论
          2. 在你的php代码中,在开始之前,在任何输出之前写:

            session_start()
            
            嗯,至少那是几年前的一个解决方案。我不知道会话处理中最新的PHP时尚。