利用curl怎么实现一个站外采集功能

介绍

利用curl怎么实现一个站外采集功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

旋度是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents。

使用方法

1,开启旋度支持

由于php环境安装后默认是没有打开旋度支持的,需修改php . ini文件,找到;扩展=php_curl。dll,把前面的冒号去掉,重启服务即可。

2,使用旋度进行数据抓取

代码如下:


//初始化一个旋度对象
$旋度=curl_init ();
//设置你需要抓取的URL
curl_setopt ($ curl CURLOPT_URL & # 39; http://www.cmx8.cn& # 39;);
//设置标题
curl_setopt(美元curl CURLOPT_HEADER 1);
//设置旋度参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt(美元cURL CURLOPT_RETURNTRANSFER 1);
//运行卷、请求网页
data=https://www.yisu.com/zixun/curl_exec美元($旋度);
//关闭URL请求
curl_close ($ curl);

3,通过正则匹配找到关键数据

代码如下:


//$ data是curl_exec返回的的值,即采集的目标内容
preg_match_all (“/& lt;李类=\“项\“祝辞(. * ?)& lt; \/li>/?数据,美元,美元PREG_SET_ORDER);
foreach($美元关键=比;美元值){
,,,//此处美元价值是数组,同时记录找到带匹配字符的整句和单独匹配的字符
,,,回声& # 39;匹配到的整句:& # 39;。美元价值[0]强生# 39;
& # 39;;
,,,回声& # 39;单独匹配到的:& # 39;。美元价值[1]强生# 39;
& # 39;;
}

技巧

1,超时的相关设置

通过curl_setopt (ch美元,选择)可以设置一些超时的设置,主要包括:

CURLOPT_TIMEOUT设置旋度允许执行的最长秒数。
CURLOPT_TIMEOUT_MS设置旋度允许执行的最长毫秒数。(在卷发7.16.2中被加入。从PHP 5.2.3起可使用)。
CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在卷发7.16.2中被加入。从PHP 5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。

代码如下:


curl_setopt ($ ch CURLOPT_TIMEOUT 60);,,//只需要设置一个秒的数量就可以
curl_setopt (ch美元CURLOPT_NOSIGNAL 1),,,,//注意,毫秒超时一定要设置这个
curl_setopt (ch美元,CURLOPT_TIMEOUT_MS, 200),,//超时毫秒,旋度7.16.2中被加入。从PHP 5.2.3起可使用

2,通过帖子提交数据,保留饼干

代码如下:


//以下摘抄一个例子过来,用于学习借鉴:
//卷曲模拟登录康盛创想程序,适合DZ7.0

! extension_loaded(& # 39;旋度# 39;),,死(& # 39;curl扩展不是加载# 39;公司),,,,

$ discuz_url=& # 39; http://www.lxvoip.com& # 39;;//论坛地址,,,
login_url=本市discuz_url # 39;美元/logging.php ? action=登录# 39;;//登录页地址,,,
get_url=本市discuz_url # 39;美元/my.php ?项=线程# 39;;//我的帖子,,,

$ post_fields=array ();,,,
//以下两项不需要修改,,,
$ post_fields [& # 39; loginfield& # 39;]=& # 39;用户名# 39;,,,,
$ post_fields [& # 39; loginsubmit& # 39;]=& # 39;真正的# 39;,,,,
//用户名和密码,必须填写,,,
$ post_fields[& # 39;用户名# 39;]=& # 39;lxvoip& # 39;,,,,
$ post_fields[& # 39;密码# 39;]=& # 39;88888888 & # 39;,,,,
//安全提问,,,
$ post_fields [& # 39; questionid # 39;]=0;,,,
$ post_fields[& # 39;答案# 39;]=& # 39;& # 39;,,,,
//@todo验证码,,,
$ post_fields [& # 39; seccodeverify& # 39;]=& # 39; & # 39;,,,,

//获取表单FORMHASH ,,
$ ch=curl_init ($ login_url);,,,
curl_setopt (ch美元,CURLOPT_HEADER, 0),,,,
curl_setopt (ch美元CURLOPT_RETURNTRANSFER 1),,,,
$内容=curl_exec (ch);,,,
curl_close (ch);,,,
preg_match (& # 39;/& lt;输入\ s *类型=癶idden" \ s *名称=癴ormhash" \ s *价值=https://www.yisu.com/zixun/?. * ?)“\ s */>/我”,内容、美元$ matches);如果(
!空($ matches)) {,,
,,,$ formhash=$ matches [1];,,,其他
} {,,
,,,死(& # 39;没有找到forumhash # 39;公司),,,,
},,,

//帖子数据,获取COOKIE ,,
$ cookie_file=目录名(__FILE__)。& # 39;/cookie.txt& # 39;;,,,
//$ cookie_file=tempnam (& # 39;/tmp # 39;),,,,
$ ch=curl_init ($ login_url);,,,
curl_setopt (ch美元,CURLOPT_HEADER, 0),,,,
curl_setopt (ch美元CURLOPT_RETURNTRANSFER 1),,,,
curl_setopt (ch美元CURLOPT_POST 1),,,,
curl_setopt ($ ch CURLOPT_POSTFIELDS post_fields美元),,,,
curl_setopt ($ ch CURLOPT_COOKIEJAR cookie_file美元),,,,

利用curl怎么实现一个站外采集功能