【问题标题】:Set session to scrape page将会话设置为抓取页面
【发布时间】:2012-01-06 10:37:47
【问题描述】:

网址1:https://duapp3.drexel.edu/webtms_du/

网址2:https://duapp3.drexel.edu/webtms_du/Colleges.asp?Term=201125&univ=DREX

URL3:https://duapp3.drexel.edu/webtms_du/Courses.asp?SubjCode=CS&CollCode=E&univ=DREX

作为个人编程项目,我想抓取我大学的课程目录并将其作为 RESTful API 提供。

但是,我遇到了以下问题。

我需要抓取的页面是 URL3。但是URL3只有在我访问URL2后才返回有意义的信息(它在那里设置了术语Colleges.asp?Term=201125),但是URL2只有在访问URL1之后才能访问。

我尝试使用 Fiddler 监控往返的 HTTP 数据,但我认为他们没有使用 cookie。关闭浏览器会立即重置所有内容,所以我怀疑他们正在使用 Session。

如何抓取 URL 3?我尝试以编程方式首先访问 URL 1 和 2,然后执行 file_get_contents(url3) 但这不起作用(可能是因为它注册为三个不同的会话。

【问题讨论】:

  • 有一个使用cookies设置的会话:ASPSESSIONIDASBRRCCS是它的名字,虽然我不明白为什么需要URL2(可能是我,我第一次忘记注意了)
  • @Grexis:啊,谢谢你的信息。 URL3 提供诸如上课地点和上课人员等信息。这取决于似乎在 URL2 中设置的术语(学期)
  • 也许值得一提的是,php 是少数没有机械化库的动态语言之一。出于这个原因,perl python 或 ruby​​ 都是更好的抓取选择。

标签: php http session screen-scraping


【解决方案1】:

会话也需要一种机制来识别您。流行的方法包括:cookie、URL 中的会话 id。

URL 1 上的curl -v 表明确实正在设置会话 cookie。

Set-Cookie: ASPSESSIONIDASBRRCCS=LKLLPGGDFBGGNFJBKKHMPCDA; path=/

您需要在任何后续请求中将此 cookie 发送回服务器以保持会话活动。

如果您想使用file_get_contents,您需要使用stream_context_create 手动为其创建一个上下文,以便在请求中包含cookie。

另一种选择(我个人更喜欢)是使用 PHP 方便地提供的curl functions。 (它甚至可以为您处理 cookie 流量!)但这只是我的偏好。

编辑:

这是一个在您的问题中抓取路径的工作示例。

$scrape = array(
    "https://duapp3.drexel.edu/webtms_du/",
    "https://duapp3.drexel.edu/webtms_du/Colleges.asp?Term=201125&univ=DREX",
    "https://duapp3.drexel.edu/webtms_du/Courses.asp?SubjCode=CS&CollCode=E&univ=DREX"
);

$data = '';
$ch = curl_init();

// Set cookie jar to temporary file, because, even if we don't need them, 
// it seems curl does not store the cookies anywhere otherwise or include
// them in subsequent requests
curl_setopt($ch, CURLOPT_COOKIEJAR, tempnam(sys_get_temp_dir(), 'curl'));

// We don't want direct output by curl
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Then run along the scrape path
foreach ($scrape as $url) {
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);
}

curl_close($ch);

echo $data;

【讨论】:

  • 看来curl 确实是一个更好的选择。你如何使用curl -v。 Fiddler 没有向我展示 cookie,所以看来我应该 curl -v 是一个更好的选择。你在 shell 中使用它吗?
  • 是的,curl 是一个 shell 程序,-v 只是表示verbose,它将显示请求和响应标头。 Curl 手册页:manpagez.com/man/1/curl
  • 完美。我能够接收 cookie 并将其保存到文件中。至于在下一个请求中发送它,手册页将帮助我。顺便说一句,一旦我收到 cookie,它的有效期是多久?这取决于他们的配置吗?
  • 只要你一直发送到服务器就有效。不过,服务器上的会话将在某个时候过期。
  • @xbonez 我用一个(看似)工作示例更新了我的答案。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2014-01-03
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多