免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11705 | 回复: 2
打印 上一主题 下一主题

如何利用simple_html_dom【采集新浪天气】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-29 20:47 |只看该作者 |倒序浏览
本帖最后由 ljx2380000 于 2013-08-01 08:58 编辑

关于simple_html_dom使用,我的博客里讲的很清楚,Simple HTML DOM是一款非常强大的html Dom解析器,它能帮助我们php解析html文档对象包括不符合W3C标准的html文档,并且像jQuery那样操作DOM元素,通过元素的id,class,tag等等来查找定位。我们可以利用Simple HTML DOM来采集我们所需要的数据.

需求:我们需要采集新浪的【新浪天气】频道的所有城市的今、明、后3天的天气情况。
分析:根据要求我分析出,所有城市天气的List页(列表页)地址如下http://php.weather.sina.com.cn/search_sheng.php

第一步:
新建数据库及数据表
  1. CREATE database weather;
  2. CREATE TABLE `weather` (
  3. `city_name` varchar(50) NOT NULL DEFAULT ”,
  4. `detail_url` varchar(255) DEFAULT ”,
  5. `day_conditions` varchar(255) DEFAULT ”,
  6. `day_wind` varchar(255) DEFAULT ”,
  7. `day_highertemp` varchar(255) DEFAULT ”,
  8. `yesterday_conditions` varchar(255) DEFAULT ”,
  9. `yesterday_wind` varchar(255) DEFAULT ”,
  10. `yesterday_lowertemp` varchar(255) DEFAULT ”,
  11. `date` varchar(255) DEFAULT ”,
  12. PRIMARY KEY (`city_name`,`date`)
  13. ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=gb2312
复制代码
第二步:
编写PHP脚本getWeather.php(一个文件,需要在DOS命令行下运行)。
注意:在此php文件中需要引入simple_html_dom.php文件,可以来我的博客下载.
  1. require_once(“simple_html_dom.php”);
  2. ini_set(‘memory_limit’,’1000M’);
  3. ini_set(“max_execution_time”,0);
  4. header(“Content-type: text/html;charset=gb2312″);
  5. //起始时间
  6. $startS=utime();
  7. //——建立数据库连接—-实时更新抓取数据START——————-//
  8. $mysqli = mysqli_connect(“localhost”,”root”,”root”,”weather”)or die(“Failed to connect!”.mysqli_connect_error());
  9. mysqli_query($mysqli,”set names gb2312″);
  10. function select_one($conn,$sql){
  11. $res = mysqli_query($conn,$sql);
  12. $result = array();
  13. if(!empty($res)){
  14. $result = mysqli_fetch_assoc($res);
  15. }
  16. return $result;
  17. }
  18. //起始时间1
  19. $start1=utime();
  20. $urls = “http://php.weather.sina.com.cn/search_sheng.php”;
  21. $htmlCN = file_get_html($urls);
  22. $li = $htmlCN->find(“.city_nav ol li a”);
  23. $listUrl = array();
  24. //获取所有城市天气的链接
  25. foreach($li as $k => $v){
  26. $v->href = “http://php.weather.sina.com.cn”.$v->href;
  27. $listUrl[$k] = substr($v->href,0,strrpos($v->href,’&'));
  28. }
  29. unset($li);
  30. $htmlCN->clear(); // clean up memory
  31. unset($htmlCN);
  32. $now = date(“Y-m-d”);
  33. $tom = date(“Y-m-d”,strtotime(“+1 days”));
  34. $tom2 = date(“Y-m-d”,strtotime(“+2 days”));
  35. $allDay = array();
  36. //根据所有城市天气的链接拼凑明后两天的链接
  37. foreach($listUrl as $k => $v){
  38. $allDay[$k][$now] = $v.”&day=0&dpc=1″;
  39. $allDay[$k][$tom] = $v.”&day=1&dpc=1″;
  40. $allDay[$k][$tom2] = $v.”&day=2&dpc=1″;
  41. }
  42. unset($listUrl);
  43. //结束时间1
  44. $end1=utime();
  45. $run1=$end1-$start1;
  46. echo date(“Y-m-d H:i:s”).”__The first weather is going :”.substr($run1,0,5).” seconds \r\n”;
  47. foreach($allDay as $keys => $days){
  48. //起始时间2
  49. $start2=utime();
  50. foreach($days as $day => $value){
  51. //起始时间3
  52. $start3=utime();
  53. $htmlS = file_get_html($value);
  54. $city_a = $htmlS->find(“#tab_01_ctn tbody tr td a”);
  55. $newArr = array();
  56. foreach($city_a as $k => $v){
  57. if(trim($v->plaintext)==’详情’){
  58. continue;
  59. }
  60. $newArr[$k]['url'] = trim($v->href);
  61. }
  62. unset($city_a);
  63. $UrlDetail = array();
  64. foreach($newArr as $k => $v){
  65. $UrlDetail[] = $v['url'];
  66. }
  67. unset($newArr);
  68. $newArr2 = array();
  69. $city_td = $htmlS->find(“#tab_01_ctn tbody tr”);
  70. foreach($city_td as $k => $v){
  71. $newArr2[$k] = trim(preg_replace(‘/\s+/’,'@’,trim($v->plaintext)));
  72. }
  73. unset($newArr2[0]);
  74. unset($newArr2[1]);
  75. unset($city_td);
  76. $newArr3 = array();
  77. foreach($newArr2 as $k => $v){
  78. if(substr_count($v,”@”)==10){
  79. $newArr3[] = substr($v,strpos($v,’@')+1,strrpos($v,’@')-strpos($v,’@')-1);
  80. }else{
  81. $newArr3[] = substr($v,0,strrpos($v,’@'));
  82. }
  83. }
  84. unset($newArr2);
  85. $newArr4 = array();
  86. foreach($newArr3 as $k => $v){
  87. $newArr4[$k] = explode(‘@’,$v);
  88. }
  89. unset($newArr3);
  90. $weathers = array();
  91. foreach($newArr4 as $k => $v){
  92. $weathers[$k]['city_name'] = “‘”.removeQuot($v[0]).”‘”;
  93. $weathers[$k]['detail_url'] = “‘”.removeQuot($UrlDetail[$k]).”‘”;
  94. $weathers[$k]['day_conditions'] = “‘”.removeQuot($v[1]).”‘”;
  95. $weathers[$k]['day_wind'] = “‘”.removeQuot($v[2].$v[3]).”‘”;
  96. $weathers[$k]['day_highertemp'] = “‘”.removeQuot($v[4]).”‘”;
  97. $weathers[$k]['yesterday_conditions'] = “‘”.removeQuot($v[5]).”‘”;
  98. $weathers[$k]['yesterday_wind'] = “‘”.removeQuot($v[6].$v[7]).”‘”;
  99. $weathers[$k]['yesterday_lowertemp'] = “‘”.removeQuot($v[8]).”‘”;
  100. $weathers[$k]['date'] = “‘”.removeQuot($day).”‘”;
  101. }
  102. unset($newArr4);
  103. //下面数据–循环入库–//
  104. foreach($weathers as $k => $v){
  105. if(!empty($v)&&is_array($v)){
  106. $inserSql = “REPLACE INTO weather(“.implode(“,”,array_keys($v)).”) VALUES (“.implode(“,”,$v).”)”;
  107. mysqli_query($mysqli,$inserSql) or die(“Failed”.mysqli_error());
  108. }
  109. echo date(“Y-m-d H:i:s”).”__The insertSQL is going : -+- [".$k."] -+- \r\n”;
  110. }
  111. unset($weathers);
  112. //结束时间3
  113. $end3=utime();
  114. $run3=$end3-$start3;
  115. echo date(“Y-m-d H:i:s”).”__The three weather is going :”.substr($run3,0,5).”-+-”.$day.” seconds \r\n”;
  116. }
  117. //结束时间2
  118. $end2=utime();
  119. $run2=$end2-$start2;
  120. echo date(“Y-m-d H:i:s”).”__The second weather is going :”.substr($run2,0,5).”-+-”.$keys.” seconds \r\n”;
  121. }
  122. //————————一些功能函数-START———————-//
  123. //替换特殊字串函数
  124. function removeQuot($string){
  125. if(strstr($string, “‘”)){
  126. $string = str_replace(“‘”,”",$string);
  127. }
  128. return addslashes($string);
  129. }
  130. //获取脚本运行时间
  131. function utime(){
  132. $rtime=explode(” “,microtime());
  133. $usec =(double)$rtime[0];
  134. $sec =(double)$rtime[1];
  135. return $sec+$usec;
  136. }
  137. //————————–一些功能函数-ENDS———————-//
  138. echo date(“Y-m-d H:i:s”).”get date of sina_weather ok \r\n”;
  139. //结束时间
  140. $endAll=utime();
  141. $runAll=$endAll-$startS;
  142. echo date(“Y-m-d H:i:s”).”The All Weather is going :”.substr($runAll,0,5).” seconds \r\n”;
复制代码
第三步:
在命令行下运行(通常这种采集脚本数据量很大),确保你的当前环境能用命令行运行。
具体看情况而行,下面截图是我命令行的运行方式:




第四步:
如上图(2)脚本已经运行完毕,花费170.5秒。最终得到数据如下(只截一部分):




PS:
我的博客地址:http://jianxuns.com
Email:15071414515@163.com
本人QQ 389750060  有事可加我扣扣聊。

论坛徽章:
0
2 [报告]
发表于 2013-07-30 09:20 |只看该作者
需要显示的时候直接从sina获取,不存储在自定义数据库里。如果只是为了显示的话,我认为。

论坛徽章:
0
3 [报告]
发表于 2013-08-01 09:05 |只看该作者
回复 2# a.a

看个人需求吧!如果只是单纯从页面爬取显示到页面的话,依赖性太强而且很被动;如果存库的话,管理方便,显示方便,个人见解。:wink:
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP