php登录抓取网页指定内容(背景PHP写爬虫说实话基础的爬虫知识至于正则吗?)

优采云 发布时间: 2021-10-09 20:11

  php登录抓取网页指定内容(背景PHP写爬虫说实话基础的爬虫知识至于正则吗?)

  给同事写个小工具,抓取月报然后做统计处理。第一反应是做一个爬虫去抓取需要的表格和图表,这样就不用自己去连接数据库,整理表格生成图片了。以上是背景

  PHP编写爬虫

  说实话,我也想用Python,毕竟他们有签名。无奈,我还停留在看Python语法的阶段。我真的很惭愧。这里我们使用php的CURL库进行页面抓取。

  同事用的系统需要先登录,然后有很多自定义图表。每个图表都有一个 graph_id。根据graph_id,可以导出某段时间的csv格式报告和对应的图形png。

  1. 登录cookie

  或许爬虫遇到的第一关就是登录,通常你要爬取的网页需要先对登录用户进行认证。我们知道,通常用户的会话状态是通过SessionID来标识的,SessionID是通过cookie保存到客户端的。所以当你想先登录爬取页面的时候,先请求登录界面,将获取到的cookie保存在本地,以后每次抓取内容时都要带上cookie文件。用于保存 cookie 的 CURL 选项 CURLOPT_COOKIEJAR:

  # 保存cookie的代码

$this->cookie_file = '/tmp/cookie.curl.tmp';

curl_setopt($ch, CURLOPT_COOKIEJAR , $this->cookie_file);

  然后在抓取页面时使用此 cookie 设置 CURLOPT_COOKIEFILE:

  # 设置cookie的代码

curl_setopt($ch, CURLOPT_COOKIEFILE , $this->cookie_file);

  2. 页面重定向

  解决session问题,第二个头疼的是302和301重定向。重定向页面的响应一般没有body部分,head是这样的:

  HTTP/1.1 302 Found

Date: Thu, 29 Jun 2017 09:49:51 GMT

Server: Apache/2.2.15 (CentOS)

...

Location: curl_test.php?action=real_page

Content-Length: 0

Connection: close

Content-Type: text/html; charset=UTF-8

  那我们该怎么办呢?仔细观察header信息,可以发现其中收录重定向的目标页面Location: xxx....并且CURL可以通过curl_getinfo($ch, CURLINFO_HTTP_CODE)获取http状态码。接下来要做什么,似乎已经很清楚了。

   // 获取的curl结果

$re = curl_exec($ch);

list ($header, $body) = explode("\r\n\r\n", $re, 2);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

// 有的网站会检查referer地址来判断是否请求来自重定向,这里保存上次请求的url供重定向构造referer使用

$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

if ($http_code == 301 || $http_code == 302) {

if (preg_match('/Location:(.*?)\n/', $header, $matches)) {

// 继续抓取目标页面

$urlinfo = parse_url($url);

// 这里match的url地址可能不一样,所以不一定这么简单的拼接就行

$re_url = $urlinfo['scheme'] . '://' . $urlinfo['host'] . substr($urlinfo['path'], 0, strrpos($urlinfo['path'], '/')+1) . trim($matches[1]);

return $this->_http_get($re_url, $last_url);

} else {

return FALSE;

}

} else if ($http_code == 200) {

return $body;

} else {

echo 'Error: CURL failed.[url='.$url.']; [http code= '. $http_code.']';

return FALSE;

}

  有些网站会检查referer地址来判断请求是否来自重定向,通过设置curl的CURLOPT_REFERER参数来伪造HTTP_REFERER。

  概括

  以上可以说是最基本的爬虫知识,至于规则规则,这里就不介绍了。以后可能是下载的内容根据Content-type、爬虫效率问题、反爬虫策略来判断文件类型。简而言之,爬虫试图模拟用户行为来抓取页面。反爬虫试图找出哪些请求是爬虫,哪些不是,并相互对抗。等爬虫有更深入的研究再继续聊,仅此而已。

  转载于:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线