这篇文章主要介绍了PHP 爬取网页的主要方法,主要是获取整个网页,然后正则匹配,需要的朋友可以参考下

主要流程就是获取整个网页,然后正则匹配(关键的)。
PHP抓取页面的主要方法,有几种方法是网上前辈的经验,现在还没有用到的,先存下来以后试试。
1.file()函数
2.file_get_contents()函数
3.fopen()->fread()->fclose()模式
4.curl方式 (本人主要用这个)
5.fsockopen()函数 socket模式
6.插件(如:http://sourceforge.net/projects/snoopy/)
7.file()函数

  1. <?php
  2. //定义url
  3. $url='[http://t.qq.com](http://t.qq.com/)';//fiel函数读取内容数组
  4. $lines_array=file($url);//拆分数组为字符串
  5. $lines_string=implode('',$lines_array);//输出内容
  6. echo $lines_string;

.使用file_get_contents方法实现,比较简单。
使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件

  1. $url="[http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru6951143.shtml](http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru6951143.shtml)";
  2. $html=file_get_contents($url);
  3. //如果出现中文乱码使用下面代码`
  4. //$getcontent = iconv("gb2312", "utf-8",$html);
  5. echo"<textarea style='width:800px;height:600px;'>".$html."</textarea>";

fopen()->fread()->fclose()模式 ,目前还没用过,看到了就先记下了

  1. <?php
  2. //定义url
  3. $url='[http://t.qq.com](http://t.qq.com/)';//fopen以二进制方式打开
  4. $handle=fopen($url,"rb");//变量初始化
  5. $lines_string="";//循环读取数据
  6. do{
  7. $data=fread($handle,1024);
  8. if(strlen($data)==0) {`
  9. break;
  10. }
  11. $lines_string.=$data;
  12. }while(true);//关闭fopen句柄,释放资源
  13. fclose($handle);//输出内容
  14. echo $lines_string;

.使用curl实现(本人一般使用这个)。
使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。

  1. <?php
  2. header("Content-Type: text/html;charset=utf-8");
  3. date_default_timezone_set('PRC');
  4. $url = "https://***********ycare";//要爬取的网址
  5. $res = curl_get_contents($url);//curl封装方法
  6. preg_match_all('/<script>(.*?)<\/script>/',$res,$arr_all);//这个网页中数据通过js包过来,所以直接抓js就可以
  7. preg_match_all('/"id"\:"(.*?)",/',$arr_all[1][1],$arr1);//从js块中匹配要的数据
  8. $list = array_unique($arr1[1]);//(可省)保证不重复
  9. //以下则是同理,循环则可
  10. for($i=0;$i<=6;$i=$i+2){
  11. $detail_url = 'ht*****em/'.$list[$i];
  12. $detail_res = curl_get_contents($detail_url);
  13. preg_match_all('/<script>(.*?)<\/script>/',$detail_res,$arr_detail);
  14. preg_match('/"desc"\:"(.*?)",/',$arr_detail[1][1],$arr_content);
  15. ***
  16. ***
  17. ***
  18. $ret=curl_post('http://**********cms.php',$result);//此脚本未放在服务器上,原因大家懂就好哈。
  19. }
  20. function curl_get_contents($url,$cookie='',$referer='',$timeout=300,$ishead=0) {
  21. $curl = curl_init();
  22. curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
  23. curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
  24. curl_setopt($curl, CURLOPT_URL,$url);
  25. curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
  26. curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
  27. if($cookie)
  28. {
  29. curl_setopt( $curl, CURLOPT_COOKIE,$cookie);
  30. }
  31. if($referer)
  32. {
  33. curl_setopt ($curl,CURLOPT_REFERER,$referer);
  34. }
  35. $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE;
  36. if ($ssl)
  37. {
  38. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  39. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  40. }
  41. $res = curl_exec($curl);
  42. return $res;
  43. curl_close($curl);
  44. }
  45. //curl post数据到服务器
  46. function curl_post($url,$data){
  47. $ch = curl_init();
  48. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  49. //curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
  50. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  51. curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
  52. curl_setopt($ch,CURLOPT_URL,$url);
  53. curl_setopt($ch,CURLOPT_POST,true);
  54. curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
  55. $output = curl_exec($ch);
  56. curl_close($ch);
  57. return $output;
  58. }
  59. ?>

fsockopen()函数 socket模式(没用过,以后可以试试)
socket模式能否正确执行,也跟服务器的设置有关系,具体可以通过phpinfo查看服务器开启了哪些通信协议

  1. <?php
  2. $fp = fsockopen("t.qq.com", 80, $errno, $errstr, 30);
  3. if (!$fp) {
  4. echo "$errstr ($errno)<br />\n";
  5. } else {
  6. $out = "GET / HTTP/1.1\r\n";
  7. $out .= "Host: t.qq.com\r\n";
  8. $out .= "Connection: Close\r\n\r\n";
  9. fwrite($fp, $out);
  10. while (!feof($fp)) {
  11. echo fgets($fp, 128);
  12. }
  13. fclose($fp);
  14. }

snoopy插件,最新版本是Snoopy-1.2.4.zip Last Update: 2013-05-30,推荐大家使用
使用网上非常流行的snoopy来进行采集,这是一个非常强大的采集插件,并且它的使用非常方便,你也可以在里面设置agent来模拟浏览器信息。
说明:设置agent是在 Snoopy.class.php 文件的第45行,请在该文件中搜索 “var 公式输入有误_SERVER[‘HTTP_USER_AGENT’]; 可以得到浏览器信息,将echo出来的内容复制到agent里面就可以了

  1. <?php
  2. //引入snoopy的类文件
  3. require('Snoopy.class.php');
  4. //初始化snoopy类
  5. $snoopy=new Snoopy;
  6. $url="[http://t.qq.com](http://t.qq.com/)";
  7. //开始采集内容`
  8. $snoopy->fetch($url);
  9. //保存采集内容到$lines_string
  10. $lines_string=$snoopy->results;
  11. //输出内容,嘿嘿,大家也可以保存在自己的服务器上
  12. echo $lines_string;

更多相关文章

  1. Android中Http请求
  2. android Retrofit 简单使用
  3. Android(安卓)studio 下的svn配置使用
  4. Android(安卓)Java和JavaScript代码相互调用
  5. android中使用Intent在activity之间传递数据
  6. Android(安卓)WebView与Javascript交互
  7. Android(安卓)字体修改
  8. Android手动创建和解析Json
  9. Android(安卓)Studio SVN 使用方法

随机推荐

  1. golang如何写http请求
  2. go语言结构体组合函数介绍
  3. golang错误抛出的方法
  4. golang测试是否能ping通
  5. golang怎样读取json数据
  6. golang怎么判断channel是否关闭
  7. Go Modules使用详解
  8. golang怎么编译
  9. golang怎么判断map是否为空
  10. go build和go install的区别