EEfaq论坛-赚客自留地

 找回密码
 免费注册
查看: 1386|回复: 24

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

  [复制链接]
发表于 2014-10-29 21:58:04 | 显示全部楼层 |阅读模式
本帖最后由 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[1]);$i++)//for循环结构很常用,这里的作用是循环记录总数的的次数,每次循环中可以任意处理采集到的内容
{
$title = $matches[2][$i];
$geturl = $matches[1][$i];
echo "我要的标题是:" . $title. "<br/>" . "对应的网址是:" . $geturl . "<br/><br/><br/>";
}
?>


代码运行的结果如下:

aa.png

要点:

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

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

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


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








评分

参与人数 14e币 +51 收起 理由
采姑娘的小蘑菇 + 1 这个很强大,不会php的我都看懂了.
useejack + 1 谢谢分享!
ebookyx + 1
Rick + 1 谢谢分享!
1988chg + 1
minlab + 2 有見地
xx19941215 + 1 楼主好牛
ryan2101 + 1
月光飞燕 + 30
Leeker + 1 打赏点辛苦钱
youdy17 + 1 送花花~~~
乐乐 + 5 很不错
roror999 + 3 必须加币,必须的!
wawylysys + 2 鼓勵

查看全部评分

回复

使用道具 举报

发表于 2014-10-29 22:37:28 | 显示全部楼层
楼主也会PHP,不会PHP程序员出身吧。现在不用上班了吧
回复 支持 反对

使用道具 举报

发表于 2014-10-29 22:42:01 | 显示全部楼层
谢谢分享~~~~~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-10-29 22:49:08 | 显示全部楼层
感谢楼主分享,期待后续大作
回复 支持 反对

使用道具 举报

发表于 2014-10-29 23:56:25 | 显示全部楼层
这个可以收藏下。。;。
回复 支持 反对

使用道具 举报

发表于 2014-10-30 00:03:01 | 显示全部楼层
占座 学习                                                         
回复 支持 反对

使用道具 举报

发表于 2014-10-30 00:22:26 来自手机 | 显示全部楼层
谢谢楼主分享,我就懂点PHP::::
回复 支持 反对

使用道具 举报

发表于 2014-10-30 00:22:41 | 显示全部楼层
mark   学习                                 
回复 支持 反对

使用道具 举报

发表于 2014-10-30 10:42:42 | 显示全部楼层
前排占座,  好好学习
回复 支持 反对

使用道具 举报

发表于 2014-10-30 10:55:33 | 显示全部楼层
$i<count($matches[1]);    这个count()是个函数吗?
回复 支持 反对

使用道具 举报

发表于 2014-10-30 11:10:59 | 显示全部楼层
$matches是一个二维数组?                                    
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-30 11:20:53 | 显示全部楼层

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

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

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

回复 支持 反对

使用道具 举报

发表于 2014-10-30 11:49:20 | 显示全部楼层
kevinmy 发表于 2014-10-30 11:20
你的两个回帖,理解都是正确的。

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

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

回复 支持 反对

使用道具 举报

发表于 2014-10-30 12:42:21 | 显示全部楼层
感谢分享                                   
回复 支持 反对

使用道具 举报

发表于 2014-10-30 13:16:02 | 显示全部楼层
[mw_shl_code=php,true]<?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[1]);$i++)//for循环结构很常用,这里的作用是循环记录总数的的次数,每次循环中可以任意处理采集到的内容
{
$title = $matches[2][$i];
$geturl = $matches[1][$i];
echo "我要的标题是:" . $title. "<br/>" . "对应的网址是:" . $geturl . "<br/><br/><br/>";
}
?>[/mw_shl_code]

这是我测试的代码,怎么出现了这个
2014-10-30_131545.jpg

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-30 15:11:50 | 显示全部楼层
xx19941215 发表于 2014-10-30 13:16
这是我测试的代码,怎么出现了这个

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

回复 支持 反对

使用道具 举报

发表于 2014-10-30 16:09:37 | 显示全部楼层
kevinmy 发表于 2014-10-30 15:11
看了你贴出的代码,出现上面那大段是因为你自己在代码中加了一句:print_r($matches);把数组的结构打印出 ...

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

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




回复 支持 反对

使用道具 举报

发表于 2014-10-30 16:58:45 | 显示全部楼层
目前为止还只停留在火车头的阶段,楼主高手啊
回复 支持 反对

使用道具 举报

发表于 2014-10-30 17:30:13 | 显示全部楼层
会写代码的话就很简单啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-30 20:29:46 | 显示全部楼层
xx19941215 发表于 2014-10-30 16:09
那您帮忙看看这个http://ygcf.sinaapp.com/ceshi.php

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

给你个思路,用div+css可以实现,如果暂时不会,也可以先使用HTML的<table> 标签来实现功能。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|联系我们|Archiver|手机版|小黑屋|EEfaq论坛

GMT+8, 2024-11-24 11:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表