php的curl可以实现模拟http的各种请求,这也是php做网络爬虫的基础,也多用于接口api的调用。

这个时候有人就要发问了:为什么你特么不用file_get_contents?

curl的性能比它好,而且可以完成更多复杂的操作,不仅仅只是获取页面数据。

下面先分别介绍一些常用的函数。

curl_init 初始化一个curl对话

curl_exec 执行请求

curl_close 关闭一个curl对话

curl_setopt 设置curl参数,即传输选项

curl_errno 返回最后一次错误码,php已经定义了诸多错误枚举编码

curl_errror 返回一个保护当前会话最近一次错误的字符串

....

下面我先举一个例子,简单的get获取我博客首页的数据:

<?php
/**
* test get request
* User: freephp
* Date: 2015/10/8
* Time: 15:08
*/ $ch = curl_init(); // 2. 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.cnblogs.com/freephp");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
// 4. 释放curl句柄
curl_close($ch); print_r($output);

就可以打印出首页的html代码。
也可把内容写入某个文件存储,这不就是爬虫的第一步么? 然后我们正则匹配过滤出文章的url,我封装了一个方法:
/**
* 从html内容中筛选链接
*
* @param string $web_content
* @return array
*/
function filterUrl($web_content){
$reg_tag_a = '/<[a|A].*?class="postTitle2".*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
$result = preg_match_all($reg_tag_a,$web_content,$match_result);
if($result){
return $match_result[1];
}
} print_r(filterUrl($output));

打印出来如图:

然后再遍历去请求这些url,然后拿到所有的文章内容。

(待续.....)

为了复用,我把curl请求发起,内容写入文件,过滤得到文章内容等操作封装成方法。最终的完整代码如下:

<?php
/**
* test get request
* User: freephp
* Date: 2015/10/8
* Time: 15:08
*/ /**
* 获取网页源码
*
* @param $url get方式请求的url
* @return mixed
*/
function getRquest($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. 执行并获取HTML文档内容
$output = curl_exec($ch);
// 4. 释放curl句柄
curl_close($ch);
return $output;
} /**
* 从html内容中筛选链接
*
* @param string $web_content
* @return array
*/
function filterUrl($web_content)
{
$reg_tag_a = '/<[a|A].*?class="postTitle2".*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
$result = preg_match_all($reg_tag_a, $web_content, $match_result);
if ($result) {
return $match_result[1];
}
} /**
* 从html内容中筛选文章内容
*
* @param string $content
* @return array
*/
function filterContent($content)
{ $reg = '/<.*\"cnblogs_post_body\">(.*?)<\/div>/ism';
$result = preg_match_all($reg, $content, $match_result);
if ($result) {
return $match_result[1];
}
} /**
* 抓取文章内容写入文件。
*
* @param string $fileName 存储文件名
* @param string $contents 文章内容
*/
function writeToFile($fileName, $contents)
{
$fp = fopen($fileName, 'w'); fwrite($fp, $contents);
fclose($fp);
} $output = getRquest("http://www.cnblogs.com/freephp"); $articleUrls = filterUrl($output);
if (empty($articleUrls)) {
echo '获取文章url失败';
die();
}
$articleNum = count($articleUrls);
echo '总共文章为:', $articleNum, "\r\n";
foreach ($articleUrls as $url) {
echo '开始爬取url:', $url, "\r\n";
$out = getRquest($url);
$cont = filterContent($out);
$filename = str_replace('.html', '', str_replace('http://www.cnblogs.com/freephp/p/', '', $url));
writeToFile($filename . '.txt', $cont[0]);
echo '完成爬取url:', $url, "\r\n";
}

后面还会用使用post方式等用途的curl,等到那个时候再封装成工具类吧。

PHP curl之爬虫初步的更多相关文章

  1. python预课04 列表,元祖,统计值计算示例,py文件转为EXE文件,爬虫初步学习

    列表,元组 #list l1 = [1, 2, 3, '高弟弟'] #定义一个列表 #增 l1.append("DSB") #最后增加"DSB"的元素 #删 l ...

  2. python爬虫-初步认识

    特此声明: 以下内容来源于博主:http://blog.csdn.net/pleasecallmewhy                                     http://cuiq ...

  3. PHP之cURL(爬虫)

    public static function SendDataByCurl($url,$data=array()){ //对空格进行转义 $url = str_replace(' ','+',$url ...

  4. curl 做爬虫 用服务器代理ip

    有时候会ip会封锁,所以会用一些模拟代理ip进行抓取测试 从网上找了一下代码 function curl_string ($url,$user_agent,$proxy){        $ch = ...

  5. python预课05 爬虫初步学习+jieba分词+词云库+哔哩哔哩弹幕爬取示例(数据分析pandas)

    结巴分词 import jieba """ pip install jieba 1.精确模式 2.全模式 3.搜索引擎模式 """ txt ...

  6. 爬虫抓取页面数据原理(php爬虫框架有很多 )

    爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...

  7. python3爬虫初探(一)之urllib.request

    ---恢复内容开始--- #小白一个,在此写下自己的python爬虫初步的知识.如有错误,希望谅解并指出. #欢迎和大家交流python爬虫相关的问题 #2016/6/18 #----第一把武器--- ...

  8. 基于php编写的新闻类爬虫,插入WordPress数据库

    这个爬虫写的比较久远,很久没有更新博客了. 1.首先思路是:通过php的curl_setopt()函数可以方便快捷的抓取网页. 2.什么样的新闻吸引人呢,当然的热点新闻了.这里选百度的搜索风云榜,获取 ...

  9. 转:CURL库在程序中的运用浅析

    CURL库在程序中的运用浅析-nk_ysg-ChinaUnix博客 http://blog.chinaunix.net/uid-22476414-id-3286638.html 这个目录的文章转载fr ...

随机推荐

  1. 是男人就下100层【第四层】——Crazy贪吃蛇(1)

    贪吃蛇是一款非常经典的游戏,这些经典游戏给我们的童年添加了不少乐趣,今天開始我们来一步一步的在Android设备上实现一款贪吃蛇游戏,我也是第一次写这个游戏,有可能会写错,或者走弯路,可是终于希望能有 ...

  2. WeChatAPI 开源系统架构详解

    WeChatAPI 开源系统架构详解 如果使用WeChatAPI,它扮演着什么样的角色? 从图中我们可以看到主要分为3个部分: 1.业务系统 2.WeChatAPI: WeChatWebAPI,主要是 ...

  3. leetcode 第42题 Multiply Strings

    题目:Given two numbers represented as strings, return multiplication of the numbers as a string. Note: ...

  4. 一个web开发框架

    一个web开发框架 怎么才能成为一名架构师?需要具备哪些条件? 作为一名码农我迫切希望自己成为一个比较合格的web架构师,昨晚心血来潮小弟花了4个小时的时间整了个简易的web开发框架,由于第一次搭建框 ...

  5. Visual Studio 2013 IIS Explorer 停止调试继续访问站点

    升级到2013后,在做调试的时候默认调试服务器是 IIS Explorer,当终止调试的时候再次访问调试站点时已经无法访问了.此时想预览一下感觉很不方便. 为了能够预览可以参考一下配置: Tools  ...

  6. 2014.first[未填]

    之后就按照自己的直觉,整理了第一套,难度为简单,差不多比2013noipday1水一点...先练练手而已 T1 vijos1196吃糖果游戏 博弈论 依题意,我们可知,如果去分数目为2,3,7,8必输 ...

  7. asp.net mvc4 运用 paypal sdk实现支付

    1.https://developer.paypal.com/ 注册账号,并且申请一个app,获得 client id,secret等数据   2.点击页面中"Sandbox Account ...

  8. [转]解决MySQL出现大量unauthenticated user的问题

    最近发现两台MySQL server在中午的时候忽然(很突然的那种)发飙,不断的挂掉.重启mysql也尽是失败,看mysql的errorlog,只能看到类似如下的信息: Forcing close o ...

  9. 长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)

    问题: 长度为n的数组,有一个数重复出现了n/2+1次,找出这个数:   解决: 比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止: #inc ...

  10. 新时代的Vim C++自动补全插件 clang_complete

    Vimer的福音 新时代的Vim C++自动补全插件 clang_complete   使用vim的各位肯定尝试过各种各样的自动补全插件,比如说大名鼎鼎的 OmniCppComplete .这一类的插 ...