最近抽时间总结了一下爬虫,写了一个小爬虫框架(工具),便于自己以后需要使用爬虫时不必重新再写,也作为爬虫教程示例记录一下。
本爬虫适用于爬取搜索引擎的数据,适用于大多数搜索引擎的搜索结果页面的数据爬取。
整个爬虫的编写过程,即此类爬虫的实现思路如下:
1. 首先确认一个想要爬取的网页;
2. 输入不同的关键字,选择不同的排序方式以及每一页显示的结果数量(如果有这些选项的话)等等;
3. 每更改一次选项和点击一次“搜索”,就观察地址栏 url 参数的变化情况,以确定要爬取网页的 url;
4. 使用该 url,编写代码尝试爬取网页源码;
5. 爬取源码成功后,开始分析源码,写出用于匹配你想要的数据的正则表达式;
6. 使用写好的正则表达式匹配源码,提取(解析)出你想要的数据内容;
7. 根据你的需要处理这些数据。
下面以爬取百度学术为例,写一个负责每天查看我的研究方向最新论文的爬虫,以便当出现新论文时,它能够及时提醒我查看。
很简单,很快就能学会。
实现步骤:
-
打开百度学术,输入我的研究方向“protocol reverse”,点击“搜索”,观察地址栏的url。
然后选择“按时间排序”,如下图,可以看到地址栏url的“sort”参数值变成了“sc_time”,这就是按时间排序的意思。然后再仔细观察可以看到url里还有个“wd”参数(word的缩写,不同的网站参数名一般也不同),该参数的值就是已输入的关键字,此参数可以手动修改,修改之后按回车,网站就会以新输入的关键字进行搜索,这和在搜索框输入和修改是一样的效果。
-
复制该url到代码中,尝试将该url对应的源码爬取下来;
贴上我实现爬取的php函数代码:
/* 爬取网站的html源码
* $url : 网站链接
* $cookie : 请求头部中的cookie值,即header中的cookie值
* $proxy : 代理ip,默认为空(若爬取源码失败,可能是主机ip被封,此时可以使用已有的代理再次尝试获取)
* $proxy_port : 代理端口号,默认为空
* $referer : 来源地址,有些网站需要有该参数才能爬取到源码
* $gzip : 是否使用gzip编码
* return : 返回$url对应的网站源码
*/
function get_html($url, $cookie='', $proxy='', $proxy_port='', $referer='', $gzip=false) {
$ch = curl_init();
// 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.3 Safari/537.36');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 允许页面跳转,获取重定向
curl_setopt($ch, CURLOPT_HEADER, 0); // 设置头文件的信息作为数据流输出
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 60秒超时
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // https跳过检查
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // https跳过检查
if($gzip) curl_setopt($ch, CURLOPT_ENCODING, "gzip"); // 编码格式
if($cookie != '') {
$coo = "Cookie:$cookie";
$headers[] = $coo;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置请求头部信息
}
if($referer != '') {
curl_setopt($ch, CURLOPT_REFERER,