PHP中的数据传输神器cURL

73 篇文章 0 订阅
17 篇文章 0 订阅

 

  • 概念
    • cURL:(Client URL Library Functions)由Daniel Stenberg创建
    • 官方定义: curl is a command line tool for  transferring data with URL syntax
    • 即:百度翻译---用URL语法传输数据的命令行工具

 

  • cURL使用场景
    • 其他资源...
    • 所有网络上的资源都可以用cURL访问和下载到
  • FTP服务器里面的文件资源
    • 上传|下载 FTP服务器里面的文件
  • WebService数据接口资源(查询天气|号码归属地...)
    • 动态获取接口数据 如天气、号码归属地...
  • 网页资源(新闻|购物...)
    • 编写网页爬虫 抓取时时信息(新闻|热卖...)
  • 在PHP中使用cURL
    • 确认PHP支持cURL
      • Windows

 

  •             Linux

 

  • 若是环境中没有开启cURL支持 需要添加cURL支持
    1. Windows: https://blog.csdn.net/u014149394/article/details/74332870
    2. Linux:http://blog.163.com/sweet_hard/blog/static/666568382011112291327332
    3. 百度关键词
      1. PHP windows curl
      2. PHP linux curl

 

 

  • 在PHP中使用cURL
    1. 步骤分析
      1. 初始化 cURL   curl_init()
      2. 客户端向服务器发送请求 接收响应 curl_exec()
      3. 关闭cURL  curl_close()

 

  • 用cURL制作一个简单的网页爬虫
    1. 初始化|请求(响应)|关闭

 

  • 用cURL抓取网页信息并替换部分内容
    1. 初始化 curl_init()
    2. 设置访问页面的URL

curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com") ;

  • 设置获取的信息以文件流的形式返回

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;

  • 执行会话  $curl_output = curl_exec($curl) ;
    1. 关闭 curl_close($curl) ;
    2. 字串替换  echo str_replace("百度", "HAPPY", $curl_output) ;

 

<?php
	

	/*扒取百度的页面*/
	$curl =  curl_init() ; //初始化curl
	//设置一个curl传输选项
	curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com") ;//设置访问页面的URL
	//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;


	//执行一个curl会话
	$curl_output = curl_exec($curl) ;

	//关闭
	curl_close($curl) ;

	echo str_replace("百度", "HAPPY", $curl_output) ;
 

 

 

 

 

 

  • 初始化curl  curl_init()
    1. 设置url

curl_setopt($curlobj, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName") ;

  • 设置请求头信息 curl_setopt($curlobj, CURLOPT_HEADER, 0) ;
    1. 设置请求头  CURLOPT_HTTPHEADER
    2. 设置post请求数据 CURLOPT_POSTFIELDS
    3. 设置请求头 请求方式 CURLOPT_POST
    4. 设置请求头 CURLOPT_USERAGENT参数
    5. 设置 将获取信息以文件流形式返回 CURLOPT_RETURNTRANSFER

<?php
	

	/*
		通过WebService查询北京天气信息
		/WebServices/WeatherWebService.asmx/getWeatherbyCityName
	*/
	$data = "theCityName=北京" ;//多个用 &链接  
	//初始化curl
	$curlobj = curl_init() ;
	//设置url
	curl_setopt($curlobj, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName") ;
	/*设置请求头信息*/
	//CURLOPT_HEADER 启用时会将头文件的信息作为数据流输出。
	curl_setopt($curlobj, CURLOPT_HEADER, 0) ;
	//CURLOPT_RETURNTRANSFER	将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
	curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1) ;
	/*
		CURLOPT_POST	启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

		post提交设置下面四个参数
	*/
	// CURLOPT_USERAGENT	在HTTP请求中包含一个"User-Agent: "头的字符串。
	curl_setopt($curlobj,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
	curl_setopt($curlobj, CURLOPT_POST, 1) ;
	//post数据
	curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data) ;
	/*
	CURLOPT_HTTPHEADER	一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置: array('Content-type: text/plain', 'Content-length: 100')
	*/
	curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8","Content-length: ".strlen($data)
	)) ;

	/*执行会话*/
	$rtn = curl_exec($curlobj) ;
	if(!curl_errno($curlobj)) {
		// 若是没报错  返回执行结果
		echo $rtn ;
		//返回数据是xml格式的
		file_put_contents('data.xml',$rtn) ;

	}else {
		echo 'Curl error: ' . curl_error($curlobj) ;
	}
	//关闭会话
	curl_close($curlobj) ;
 

 

 

 

  • 用cURL登录慕课网 并下载个人空间页面
    1. 登陆成功之后 重新爬的页面
    2. 登陆之后的跳转页面
    3. 设置cookie
    4. 先执行登录操作

<?php
	

	/*
		登录 并下载个人空间
		先执行登录操作
		设置cookie
		登陆之后的跳转页面

		登陆成功之后 重新爬的页面

	*/
	$data = "username=18301390328&password=XO0000xo0000&rememberMe=1" ;
	//初始化
	$curl = curl_init() ;
	//设置URL
	curl_setopt($curl, CURLOPT_URL, "https://passport.csdn.net/account/login") ;
	//设置网页之后  以文件流的形式返回
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;

	//COOKIE  相关设置   需要在所有会话开始之前设置 ---保存登录信息
	date_default_timezone_set("PRC") ; //先设置时区
	/*
	CURLOPT_COOKIESESSION	启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。
	*/
	curl_setopt($curl, CURLOPT_COOKIESESSION, true) ;
	/*
	CURLOPT_COOKIEFILE	包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
	*/
	curl_setopt($curl, CURLOPT_COOKIEFILE, "cookiefile") ;
	/*
	CURLOPT_COOKIEJAR	连接结束后保存cookie信息的文件。
	*/
	curl_setopt($curl, CURLOPT_COOKIEJAR, "cookiefile") ;
	/*
		CURLOPT_COOKIE	设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。
	*/
	curl_setopt($curl, CURLOPT_COOKIE, session_name() . '=' .session_id()) ;



	/*
	CURLOPT_HEADER	启用时会将头文件的信息作为数据流输出。 不打印头部信息
	*/
	curl_setopt($curl, CURLOPT_HEADER, 0) ;
	/*
	CURLOPT_FOLLOWLOCATION	启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

	登陆成功之后  网站默认设置 跳转到一个页面  此处跟踪到 否则会登陆失败
	*/
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1) ;


	/*
	登录网站  post提交
	*/
	// CURLOPT_USERAGENT	在HTTP请求中包含一个"User-Agent: "头的字符串。
	
	curl_setopt($curl,CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
	curl_setopt($curl, CURLOPT_POST, 1) ;
	//post数据
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data) ;
	/*
	CURLOPT_HTTPHEADER	一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置: array('Content-type: text/plain', 'Content-length: 100')
	*/
	curl_setopt($curl, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8","Content-length: ".strlen($data)
	)) ;


	//设置好之后  执行登录操作
	curl_exec($curl) ;
	//设置URL 设置要爬的网页
	curl_setopt($curl, CURLOPT_URL, "https://blog.csdn.net/donglingjiu") ;
	//不是post提交 将上面的post关闭
	curl_setopt($curl, CURLOPT_POST, 0) ;
	curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: text/html")) ;

	//执行 
	$output = curl_exec($curl) ;
	
	echo $output ;

	file_put_contents('data.html', $output) ;
	curl_close($curl) ;
 

 

 

 

 

 

 

 

 

 

  • 用cURL从FTP上下载文件到本地
    1. 关闭资源句柄
    2. 本地打开资源句柄  将下载的文件写入
    3. 设置链接ftp的账号密码
    4. 设置超时时间
    5. 设置URL  目标文件在ftp上的完整路径

<?php
	

	/*
		从FTP服务器下载文件到本地
	*/
	//初始化
	$curl = curl_init() ;
	//设置下载文件的完整URL
	curl_setopt($curl, CURLOPT_URL, "ftp://192.168.1.100/a.txt") ;

	curl_setopt($curl, CURLOPT_HEADER, false);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1) ;
	//如果文件太大  中断传输   设置超时时间  单位/秒
	curl_setopt($curl, CURLOPT_TIMEOUT, 300) ;
	/*
		CURLOPT_USERPWD	传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。
	*/
	curl_setopt($curl, CURLOPT_USERPWD, "root:123456") ;//ftp登录密码

	//打开资源句柄  
	$outfile = fopen('data.txt','wb') ;//保存到本地的文件名
	//ftp上的文件下载到本地	
	curl_setopt($curl, CURLOPT_FILE, $outfile) ;

	$rtn = curl_exec($curl) ;

	//关闭资源句柄  防止资源泄露
	fclose($outfile) ;
	if(!curl_errno($curl)) {
		echo "RETURN: " .$rtn ;
	}else {
		echo 'Curl error: ' .curl_error($curl) ;
	}
 

 

 

 

 

 

 

 

 

  • 用cURL从本地上传文件到FTP
    1. 设置ftp链接账号密码curl_setopt($curl, CURLOPT_USERPWD, "root:123456") ;
    2. 超时时间curl_setopt($curl, CURLOPT_TIMEOUT, 300) ;
    3. 设置上传路径
    4. 打开本地将要上传的文件  ---资源句柄$fp = fopen($localfile, 'r') ;
    • 设置本地将要上传的出文件$localfile = 'data.txt' ;

 

    1.  关闭资源句柄fclose($fp) ;
    2. 执行上传 $rtn = curl_exec($curl) ;
    3. 设置上传文件大小curl_setopt($curl, CURLOPT_INFILESIZE, filesize($localfile)) ;
    4. 读取文件地址 (资源类型)curl_setopt($curl, CURLOPT_INFILE, $fp) ;
    5. 开启上传curl_setopt($curl, CURLOPT_UPLOAD, true) ;

<?php
	

	/*
	curl上传文件到ftp服务器
		设置本地将要上传的出文件$localfile = 'data.txt' ;
		打开本地将要上传的文件  ---资源句柄$fp = fopen($localfile, 'r') ;

		设置上传路径
		超时时间curl_setopt($curl, CURLOPT_TIMEOUT, 300) ;
		设置ftp链接账号密码curl_setopt($curl, CURLOPT_USERPWD, "root:123456") ;

		开启上传curl_setopt($curl, CURLOPT_UPLOAD, true) ;
		读取文件地址 (资源类型)curl_setopt($curl, CURLOPT_INFILE, $fp) ;
		设置上传文件大小curl_setopt($curl, CURLOPT_INFILESIZE, filesize($localfile)) ;
		执行上传 	$rtn = curl_exec($curl) ;
		关闭资源句柄fclose($fp) ;


	*/
	//初始化
	$curl = curl_init() ;

	//本地文件
	$localfile = 'data.txt' ;
	$fp = fopen($localfile, 'r') ;

	//设置上传文件的完整URL
	curl_setopt($curl, CURLOPT_URL, "ftp://192.168.1.100/a.txt") ;

	curl_setopt($curl, CURLOPT_HEADER, false);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1) ;
	//如果文件太大  中断传输   设置超时时间  单位/秒
	curl_setopt($curl, CURLOPT_TIMEOUT, 300) ;
	/*
		CURLOPT_USERPWD	传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。
	*/
	curl_setopt($curl, CURLOPT_USERPWD, "root:123456") ;//ftp登录密码

	/*
	CURLOPT_UPLOAD	启用后允许文件上传。
	*/
	curl_setopt($curl, CURLOPT_UPLOAD, true) ;
	/*
	CURLOPT_INFILE	在上传文件的时候需要读取的文件地址,值是一个资源类型。
	*/
	curl_setopt($curl, CURLOPT_INFILE, $fp) ;
	/*
		CURLOPT_INFILESIZE	设定上传文件的大小限制,字节(byte)为单位。
	*/
	curl_setopt($curl, CURLOPT_INFILESIZE, filesize($localfile)) ;



	$rtn = curl_exec($curl) ;

	//关闭资源句柄  防止资源泄露
	fclose($fp) ;
	if(!curl_errno($curl)) {
		echo "Upload successfully!";
	}else {
		echo 'Curl error: ' .curl_error($curl) ;
	}
 

 

 

 

 

 

 

 

 

  • 用cURL访问HTTPS资源
    1. 终止从服务端进行验证curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0) ;
    2. 设置超时时间  证书有时效性date_default_timezone_set("PRC") ;//时区
    3. 设置资源路径

<?php

	/*

		访问网络上HTTPS资源
			设置资源路径
			设置超时时间  证书有时效性date_default_timezone_set("PRC") ;//时区
			终止从服务端进行验证curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0) ;

	*/
	$curl = curl_init() ;

	//访问资源路径
	curl_setopt($curl, CURLOPT_URL, "https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=mukewang&oq=csdn&rsv_pq=fa82833d0004dff1&rsv_t=acb8Xzabi9QT%2FhDzKxewbLkrRu%2FfynlkjLIw8V2jTbvtRd4FdJ6Vr3D7Sxw&rqlang=cn&rsv_enter=1&inputT=7122&rsv_sug3=64&rsv_sug1=51&rsv_sug7=100&rsv_sug2=0&prefixsug=mukewang&rsp=0&rsv_sug4=7835") ;

	//执行之后 文件流传输
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true) ;

	//设置HTTPS支持   证书有时效性
	date_default_timezone_set("PRC") ;//时区
	/*
	CURLOPT_SSL_VERIFYPEER	禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。
	*/
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0) ;
	$output = curl_exec($curl) ;

	curl_close($curl) ;
	echo $output ;
	file_put_contents('data.html', $output) ;

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值