php登录抓取网页指定内容(背景PHP写爬虫说实话基础的爬虫知识至于正则吗?)
优采云 发布时间: 2021-10-09 20:11php登录抓取网页指定内容(背景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、爬虫效率问题、反爬虫策略来判断文件类型。简而言之,爬虫试图模拟用户行为来抓取页面。反爬虫试图找出哪些请求是爬虫,哪些不是,并相互对抗。等爬虫有更深入的研究再继续聊,仅此而已。
转载于: