【问题标题】:Retrieving content with Python requests library使用 Python 请求库检索内容
【发布时间】:2016-03-16 15:16:00
【问题描述】:

我正在尝试使用 pythons 的 requests 库从 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 访问上述网址 [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>

请注意,当我使用 Python 请求资源时,“Cookie”丢失了。 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())

有什么方法可以帮到你吗?

【问题讨论】:

  • 你试过看req.cookies吗?
  • @Morgan Thrapp 是的,cookiejar 是空的
  • @Darth Vader 我试过了,但我得到了空的 cookiejar
  • “上述脚本的直接访问会产生以下响应:” ...不完全是。您做了一些事情让服务器向您发送该 cookie,现在您的浏览器正在将它与每个请求一起发送回来。如果您从浏览器中清除 localhost 的所有 cookie,您将不会再看到它。

标签: php python apache session cookies


【解决方案1】:
  1. PHP 会话的工作原理。

PHP 使用 cookie 跟踪您的用户,但前提是您使用会话。每当您启动会话时,PHP 都会检查用户的请求,以查看他是否已经获得了一个定义了会话 ID(默认命名为 PHPSESSID)的 cookie。如果请求中没有 cookie,PHP 会生成一个新的 session id。无论哪种方式,它都会向客户端发送一个 cookie 作为响应,所以下次用户访问这个或另一个页面时,这个具有唯一会话 id 的 cookie 就会出现。

  1. 不使用会话时会发生什么。

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

  1. 从 Python 脚本发送请求时会发生什么。

除非你要求,否则什么都没有。如果你不告诉 Python 将 cookie 发送到服务器,它就不会。由于它不会发送任何 cookie,PHP 脚本将不会收到任何 cookie。而且由于 PHP 脚本不会在代码中的任何位置启动会话,因此它也不会自动创建任何会话。

  1. 如何解决。

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

  1. 结论。

在你的 php 代码中,写在最开始,在任何输出之前:

session_start()

好吧,至少几年前这是一个解决方案。我不知道会话处理中最新的 PHP 时尚。

【讨论】:

    【解决方案2】:

    您的浏览器正在将“cookie”HTTP 标头添加到您的 PHP 代码请求中,因此您的 PHP 代码会返回它(根据您的代码)。这就是浏览器所做的:接受 cookie 的设置,然后在请求中返回它们。 Python 没有。

    您的 Python 程序没有发送“cookie”HTTP 标头,因此您的 PHP 代码没有返回它。你的 Python 只发送“User-Agent”、“Accept”、“Accept-Charset”、“Accept-Encoding”、“Accept-Language”、“Connection”和“Content-Type”。但没有“Cookie”。

    没有发送'Cookie'意味着你没有'Cookie' :)

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 2015-09-23
      • 2015-12-27
      相关资源
      最近更新 更多