PHP版本:5.5.30

服务器:apche

抓取网站地址:http://nc.mofcom.gov.cn/channel/gxdj/jghq/jg_list.shtml

抓取目标:获取当日的价格数据

一、准备工作:

1.打开php.ini配置文件,开启curl功能扩展

  extension=php_curl.dll

  如果开启之后(记得重启apache服务),仍然不能使用curl的扩展方法,请检查环境变量是否设置。

二、分析所要抓取的页面,数据结构

  查看http://nc.mofcom.gov.cn/channel/gxdj/jghq/jg_list.shtml源码。

  看到所有数据都在<tbody>和</tbody>标签之中。

三、思路

  1.获取当前网页数据,截取到<tbody>和</tbody>。(其中数据为多行组成:<tr><td></td></tr>)

  2.在<tbody>和</tbody>中,逐个读取行,和列的值即可获得数据。

  3.当日的数据,可能在第一页,第二页等多页。因此,进行翻页读取,直到页面中找不到当日的数据,停止程序运行!

  总共就是三个循环:页循环-->行循环-->列循环

四、代码实现

//定义要抓取的页面地址

$url='http://nc.mofcom.gov.cn/channel/gxdj/jghq/jg_list.shtml';//?page=1

//初始化curl连接
$curl=curl_init();
// 设置header
curl_setopt($curl, CURLOPT_HEADER, 0);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$flag="start";    //页循环执行标志,start:表示继续执行。 end:标志终止执行(本页面找不到包含当天日期的数据)。

//开始页循环
$i=1;      //$i作为page的值,控制翻页
$myResultSet=[];//定义数组,用于存放所有行的数据
while ($i>0)//循环停止条件为 :本页面找不到包含当天日期的数据
{
    if($flag=="end"){
        //停止页循环
        break;
    }
    //设置所要抓取的网页地址,及页数
    curl_setopt($curl, CURLOPT_URL,$url."?page=".$i);    
    
    // 运行cURL,请求网页
    $data = curl_exec($curl);
    
    //通过substr和strpos函数,获取<tbody>和</tbody>之间的数据
    $mycontent=substr($data, strpos($data, "<tbody>"),strpos($data, "</tbody>")-strpos($data, "<tbody>"));        
    
    //<table>行循环读取(<tr>)
    while(strpos($mycontent, "<tr>")!==false){//如果行存在strpos($mycontent, "<tr>")  
         $myResultTr=[];                      //定义局部行数组。用于存放一行的数据,每次行循环重新定义,以清空数组中上一行的数据
         //获取行
         $mytr=substr($mycontent, strpos($mycontent, "<tr>"),strpos($mycontent, "</tr>")-strpos($mycontent, "<tr>"));
         //如果不是当前日期的数据、设置程序终止标志、退出循环
         if(strpos($mytr, date("Y-m-d"))===false){             //本页面找不到包含当天日期的数据,
             $flag="end";                                                    //设置标志为end。
             break;
         }
         //列循环 获取前四列
         $j=0;      //列标识
         //&&strpos($mytr, date("Y-m-d"))!==false
         while(strpos($mytr, "<td>")!==false){
             if($j>=4){   //第4列后的数据是不需要的。
                 break;
             }
             //获取列
             $mytd=substr($mytr, strpos($mytr, "<td>"),strpos($mytr, "</td>")-strpos($mytr, "<td>"));
              
             $pre=array(" "," ","\t","\n","\r");
             //str_replace将值中包含的空格、制表符、换行符、回车去除。  strip_tags去除html标签
             //echo str_replace($pre, '', strip_tags($mytd));
             
             //将列数据,压入行结果中
             array_push($myResultTr, str_replace($pre, '', strip_tags($mytd)));
              
             $mytr=substr($mytr, strpos($mytr, "</td>")+5);
             $j++;            
         }
         
         //将行结果,压入到总结果集中
         array_push($myResultSet, $myResultTr);
         
         //改变$mycontent (截取掉第一行数据,保留剩下数据
         $mycontent=substr($mycontent, strpos($mycontent, "</tr>")+5);
     }               
    
    $i++;
}
var_dump($myResultSet);   //打印出抓取到的所有数据
echo "application stop in page".--$i;
// 关闭URL请求
curl_close($curl);

五、测试结果:

  抓取到127条数据, 网页执行到第10页的时候停止下来。

  

  

转载于:https://www.cnblogs.com/ahguSH/p/5687653.html

PHP curl扩展实现数据抓取相关推荐

  1. 有哪些好用的互联网数据抓取,数据采集,页面解析工具?

    1. 互联网刚兴起的时候,数据索引是个大问题,当时Yahoo的分类页面着实火了一阵子. 2.随着互联网数据量越来越大,Google,百度等搜索引擎火了起来.这个阶段,几乎没有比搜索引擎更火的技术了,连 ...

  2. vba抓取网页数据到excel_R语言网页数据抓取XML数据包

    有些网络上的数据无法复制粘贴,一个一个录入有点费时费力,此时用这种数据抓取方法,短短几句,简单实用.XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用 ...

  3. python table数据抓取_Python爬虫:数据抓取工具及类库详解

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: ncepu_Chen PS:如有需要Python学习资料的小伙伴可以 ...

  4. 10-穿墙代理的设置 | 01.数据抓取 | Python

    10-穿墙代理的设置 郑昀 201005 隶属于<01.数据抓取>小节 我们访问 Twitter 等被封掉的网站时,需要设置 Proxy . 1.使用HTTP Proxy 下面是普通HTT ...

  5. Golang实现web api接口调用及web数据抓取[get post模式]

    前沿: 继续扩展我的golang服务端,这边有些数据库是没有权限的,对方给了我webservices的接口,针对异常的数据,我要去抓数据,再次分析,golang貌似没有python那么多的模拟浏览器访 ...

  6. net.conn read 判断数据读取完毕_单方验方|如何应对千万级工商数据抓取(一)

    最近主要在处理有关企业信用的工商数据库,朋友列出的名单在200万家上下,字段共有13个维度,数据规模粗略计算好几千万了.起初自己懵懵懂懂的爬了200万,经过不断调试改进,发现大规模抓取数据门门道道还真 ...

  7. 1.3 网页数据抓取

    1.3 网页数据抓取 李沐 B站:https://space.bilibili.com/1567748478/channel/collectiondetail?sid=28144 课程主页:https ...

  8. 查询数据 抓取 网站数据_有了数据,我就学会了如何在几个小时内抓取网站,您也可以...

    查询数据 抓取 网站数据 I had a shameful secret. It is one that affects a surprising number of people in the da ...

  9. R语言网络数据抓取的又一个难题,终于攻破了!

    本文作者:杜雨,EasyCharts团队成员,R语言中文社区专栏作者. 兴趣方向:Excel商务图表,R语言数据可视化,地理信息数据可视化. 个人公众号:数据小魔方(微信ID:datamofang)  ...

最新文章

  1. 20个使用 Java CompletableFuture的例子
  2. flex4实现图片的动态切换
  3. AI发现人类肾细胞有一半结构未知,UCSD最新研究登上Nature,算法已开源
  4. 【LeetCode 剑指offer刷题】字符串题6:67 把字符串转成整数
  5. 百度地图2.1获取密钥配置的Android签名证书的sha1值
  6. Redis 的机制为什么不会产生 ABA 问题
  7. controller接收json数据_SpringBoot实战(二):SpringMvc接收xml请求
  8. matlab 叠加 area,[转载]matlab学习——area填色图
  9. php include无效,php 两次include后,第一个include里的变量无效了
  10. Java的finally理解
  11. 2019量子计算机上市公司,2019年第一炮:量子计算机终于来了!
  12. Scrum电子看板工具
  13. WPF界面设计的模式
  14. 机器学习:弱监督学习简介
  15. 计算机视觉——Harris角点检测(课堂实验)
  16. Mybatis中使用左连接查询
  17. 产品可靠性测试 - 学习笔记(1)
  18. C++读入用逗号隔开的数据
  19. vue3兄弟之间传值兄弟之间方法怎么调用?保姆级讲解
  20. Chaya虚拟机学习 —— 启用Docker遇到的Bug

热门文章

  1. Eclipse 格式化代码时不换行与自动换行WordWrap插件
  2. 10个受欢迎的英文名
  3. python怎么做情感分析_如何用python进行情感分析
  4. [短评] 关于顺丰快递大战阿里菜鸟物流事件的一点吐槽
  5. 使用GDAL对HDF数据进行校正
  6. influxdb 统计 每天 指定时间段_抖音短视频什么时间段发布?容易上热门!
  7. js打印服务器文件,用Electron / Node.js编写的打印服务器
  8. Spring集成CXF发布WebService并在客户端调用
  9. Kerberos的基本命令操作
  10. 剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)