kevinmy 发表于 2014-10-29 21:58:04

从0开始学采集------中级篇:使用Curl抓取网页内容

本帖最后由 kevinmy 于 2014-10-29 22:05 编辑

前言:
在初级篇和中级篇之前期准备我们介绍了利用火车头采集内容并发布到wordpress的过程(帖子地址:http://www.eefaq.com/thread-121090-1-1.html),也介绍如何在本机搭建PHP环境,在结尾处贴出了一个由3行代码组成的最简易的采集小程序(帖子地址:http://www.eefaq.com/thread-121117-1-1.html),帖子发出20多分钟,就得到了朋友们的积极反馈,会员:mulao在回帖中提到“不建议使用file_get_contents采集,推荐使用php的curl库”并在帖中贴出了两者
读取google.com首页的效率对比。mulao的说法是正确的,curl和file_get_contents对比起来,不仅是效率高,同时它还支持很多协议,如HTTP、FTP、TELNET等,用curl还可以完成一些高难度任务,比如:处理coockies、验证、表单提交、文件上传等等。file_get_contents相比较起来只有一个简单、让新手树立信心的优势了,不知道昨天的3行采集程序有多少人去实验了?好,今天我们正式开始中级篇:使用Curl抓取网页内容

在学习更为复杂的功能之前,先来看一下在PHP中建立curl请求的基本步骤:
1.初始化
2.设置变量
3.执行并获取结果
4.释放curl句柄

以下为采集TGL帖子列表的代码:
<?php
set_time_limit(0);//设置程序执行时间
header("Content-Type: text/html; charset= utf-8"); //设置页面的编码,不设置会乱码

$url="http://www.eefaq.com/forum-4-1.html";
$ch = curl_init($url);//初始化
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回的内容我们是作为变量储存, 而不输出,所以这里选1.
$contents = curl_exec($ch);// 运行cURL,请求网页
preg_match_all('{<a href="([^"]+)" class="xst" >(.*)</a>}',$contents,$matches);//正则匹配想要的内容
curl_close($ch);// 关闭URL请求

for ($i=0;$i<count($matches);$i++)//for循环结构很常用,这里的作用是循环记录总数的的次数,每次循环中可以任意处理采集到的内容
{
$title = $matches[$i];
$geturl = $matches[$i];
echo "我要的标题是:" . $title. "<br/>" . "对应的网址是:" . $geturl . "<br/><br/><br/>";
}
?>

代码运行的结果如下:



要点:

1.在curl这段代码中 curl_setopt() )最为重要,通过参数指定URL请求的各个细节来实现一些复杂的功能,但由于参数众多,要一次性看完并理解也比较困难,所以今天我们只用了这一个选项,curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);这里的参数我们设置为1或者true的原因是,返回的内容我们要作为变量储存, 而不直接输出到屏幕上。

2. preg_match_all这段正则匹配,想要学好采集,正则是必须学会的。这个一句两句说不清,请百度搜索:正则表达式,有很多教程。

3.for循环读出数组内的内容。这个结构在采集中经常用到的。


今天的教程好像解释的不清楚,也不知道该写点什么,可能还是因为本人水平有限,无法简单易懂的说明原理。有问题回帖吧








btzx1 发表于 2014-10-29 22:37:28

:lol楼主也会PHP,不会PHP程序员出身吧。现在不用上班了吧

wjk861025 发表于 2014-10-29 22:42:01

谢谢分享~~~~~~~~~~~~~~~~~~~~~~~

wawylysys 发表于 2014-10-29 22:49:08

感谢楼主分享,期待后续大作

myzd 发表于 2014-10-29 23:56:25

这个可以收藏下。。;。

Dhf 发表于 2014-10-30 00:03:01

占座 学习                                                         

1988chg 发表于 2014-10-30 00:22:26

谢谢楼主分享,我就懂点PHP::::

youdy17 发表于 2014-10-30 00:22:41

mark   学习                                 

lmdkboy 发表于 2014-10-30 10:42:42

前排占座,好好学习:)

xx19941215 发表于 2014-10-30 10:55:33

$i<count($matches);    这个count()是个函数吗?

xx19941215 发表于 2014-10-30 11:10:59

$matches是一个二维数组?                                    

kevinmy 发表于 2014-10-30 11:20:53

xx19941215 发表于 2014-10-30 10:55 static/image/common/back.gif
$i

你的两个回帖,理解都是正确的。

1.count() 函数是计算数组中的单元数目或对象中的属性个数。用来计算总数。

2.$matches是一个二维数组。

xx19941215 发表于 2014-10-30 11:49:20

kevinmy 发表于 2014-10-30 11:20 static/image/common/back.gif
你的两个回帖,理解都是正确的。

1.count() 函数是计算数组中的单元数目或对象中的属性个数。用来计算总 ...

保存的为啥是个二维数组呢、?

Rick 发表于 2014-10-30 12:42:21

感谢分享                                 

xx19941215 发表于 2014-10-30 13:16:02

<?php
set_time_limit(0);//设置程序执行时间
header("Content-Type: text/html; charset= utf-8"); //设置页面的编码,不设置会乱码

$url="http://www.eefaq.com/forum-4-1.html";
$ch = curl_init($url);//初始化
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//返回的内容我们是作为变量储存, 而不输出,所以这里选1.
$contents = curl_exec($ch);// 运行cURL,请求网页
preg_match_all('{<a href="([^"]+)"target="_blank">(.*)</a>}',$contents,$matches);//正则匹配想要的内容
curl_close($ch);// 关闭URL请求
print_r($matches);
for ($i=0;$i<count($matches);$i++)//for循环结构很常用,这里的作用是循环记录总数的的次数,每次循环中可以任意处理采集到的内容
{
$title = $matches[$i];
$geturl = $matches[$i];
echo "我要的标题是:" . $title. "<br/>" . "对应的网址是:" . $geturl . "<br/><br/><br/>";
}
?>

这是我测试的代码,怎么出现了这个


kevinmy 发表于 2014-10-30 15:11:50

xx19941215 发表于 2014-10-30 13:16 static/image/common/back.gif
这是我测试的代码,怎么出现了这个

看了你贴出的代码,出现上面那大段是因为你自己在代码中加了一句:print_r($matches);把数组的结构打印出来了,直接在浏览器上看会比较乱,你点击鼠标右键选择查看源代码,在那里面数组的结构清晰,你就能看出来,输出的是个二维数组了。

xx19941215 发表于 2014-10-30 16:09:37

kevinmy 发表于 2014-10-30 15:11 static/image/common/back.gif
看了你贴出的代码,出现上面那大段是因为你自己在代码中加了一句:print_r($matches);把数组的结构打印出 ...

那您帮忙看看这个http://ygcf.sinaapp.com/ceshi.php

怎么用for打印出像表格那样的格式呢?




sdwzzx 发表于 2014-10-30 16:58:45

目前为止还只停留在火车头的阶段,楼主高手啊

紫气东来 发表于 2014-10-30 17:30:13

会写代码的话就很简单啦

kevinmy 发表于 2014-10-30 20:29:46

xx19941215 发表于 2014-10-30 16:09 static/image/common/back.gif
那您帮忙看看这个http://ygcf.sinaapp.com/ceshi.php

怎么用for打印出像表格那样的格式呢?


给你个思路,用div+css可以实现,如果暂时不会,也可以先使用HTML的<table> 标签来实现功能。
页: [1] 2
查看完整版本: 从0开始学采集------中级篇:使用Curl抓取网页内容