今天被安排做一个抓取。
一、 什么是php采集程序?
二、 为什么要采集?
三、 采集些什么?
四、 如何采集?
五、 采集思路
六、 采集范例程序
七、 采集心得
什么是php采集程序?
php采集程序,也叫php小偷,主要是用于自动搜集网络上web页里特定内容,用php语言写的web程序,运行于支持php的平台上。谈到”自动搜集”,你可能联想到百度goole,联想到搜索引擎所做的事情。php采集程序,正是做类似的工作。
为什么要采集?
互联网正以飞快的速度在发展,web数据每天以几何级数据量递增,面对这庞大的数据,作为一个网站管理员的你,该如何搜集自己所需要的信息呢?特别对某个 或某几个同类网站,你需要它们的大量信息,来充实你的网站内容,难道就只能复制粘贴的过日子吗?一个网站管理员,你真的就得花大量时间去搞原创内容,而与整个互联网信息量的发展速度脱节吗?这些问题的解决方法只有一个:采集。如果有那么一个程序,你帮你的网站自动或半自动的采集你所需要的特定内容,即时更 新你网站的信息,是否是你梦寐以求的呢?这就是采集程序出现的原因所在。
采集些什么?
这要看你做的什么类型的网站了。如果你做图片站,就采集图片;做音乐站,就采集mp3,做新闻站,就采集新闻等等。一切根据你网站的内容架构需要而定。确定你要采集的东西,才好写出相应的采集程序。
如何采集?
通常采集程序,都是有的放矢的。也就是需要有目标网站,搜集一些你需要的采集内容的网站,分别对其html代码进行分析,找出规律性的东西,依据你要采集 的特定内容,写出php代码。采集到你要的东西以后,你可以选择自己需要的存放方式。比如直接生成html页面,或是放进数据库,作进一步处理或是存放成 特定的形式,以备后用。
采集思路
采集程序的思路很简单大体可以分为以下几个步骤:
1. 获取远程文件源代码( file _get_contents或用fopen).
2.分析代码得到自己想要的内容(这里用正则匹配,一般是得到分页)。
3.跟根得到的内容进行下载入库等操作。
在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。
[html]
1.
2. /****获取远程文件源代码常用三种方法***/
3. /***方法一、 fopen(),stream_context_create()方法****/
4. $opts = array(
5. ‘http’= > array(
6. ‘method’= > “GET”,
7. ‘ header ‘= > “Accept-language: en\r\n” .
8. “Cookie: foo=bar\r\n”
9. )
10. );
11. $context = stream_context_create($opts);
12. $ fp = fopen(‘ ‘r’, false, $context);
13. fpassthru($fp);
14. fclose ($fp); /******方法二、 socket*******/
15. function get_content_by_socket($url, $host){
16. $fp = fsockopen($host, 80) or die(“Open “. $url .” failed”);
17. $header = “GET /”.$url .” HTTP/1.1\r\n”;
18. $header .= “Accept: */*\r\n”;
19. $header .= “Accept-Language: zh-cn\r\n”;
20. $header .= “Accept-Encoding: gzip, deflate\r\n”;
21. $header .= “User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n”;
22. $header .= “Host: “. $host .”\r\n”;
23. $header .= “Connection: Keep-Alive\r\n”;
24. //$header .= “Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n”;
25. $header .= “Connection: Close\r\n\r\n”;
26. fwrite($fp, $header);
27. while (!feof($fp)) {
28. $contents .= fgets($fp, 8192);
29. }
30. fclose($fp);
31. return $contents;
32. }
33.
34. /******方法三、file_get_contents (),stream_context_create() 方法三********/
35. $opts = array(
36. ‘http’= > array(
37. ‘method’= > “GET”,
38. ‘header’= > “Content-Type: text/html; charset=utf-8”
39. )
40. );
41. $context = stream_cont ext _create($opts);
42. $file = file_get_contents(‘ false, $context);
43.
44. /******方法四、 PHP的cURL
45. $ch = curl_init();
46. // 2. 设置选项,包括URL
47. curl_setopt($ch, CURLOPT_URL, “”);
48. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
49. curl_setopt($ch, CURLOPT_HEADER, 0);
50. curl_setopt($ch,CURLOPT_HTTPHEADER,array (“Content-Type: text/xml; charset=utf-8″,”Expect: 100-continue”));
51. // 3. 执行并获取HTML文档内容
52. $output = curl_exec($ch);
53. var_dump($output);
54. // 4. 释放curl句柄
55. curl_close($ch);
56.
57. /*注意
58. 1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
59. 2. 使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl. dll 前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:/WINDOWS/system32下;Linux下要安装curl扩展。
60. */
61. ?>
采集范例程序
[html]
1. /*一个图片下载函数*/
2. function getimg($url,$filename){
3. /*判断图片的url是否为空,如果为空停止函数*/
4. if($url==””){
5. return false;
6. }
7. /*取得图片的扩展名,存入变量$ext中*/
8. $ext=strrchr($url,”.”);
9. /*判断是否是合法的图片文件*/
10. if($ext!=”.gif” && $ext!=”.jpg”){
11. return false;
12. }
13. /*读取图片*/
14. $img=file_get_contents($url);
15. /*打开指定的文件*/
16. $fp=@fopen($filename.$ext,”a”);
17. /*写入图片到指点的文件*/
18. fwrite($fp,$img);
19. /*关闭文件*/
20. fclose($fp);
21. /*返回图片的新文件名*/
22. return $filename.$ext;
23. }
采集图片php程序
[html]
1. 复制代码
2.
3. /**
4. * 采集图片php程序
5. *
6. * Copyright(c) 2008 by 小超(ccxxcc) All rights reserved
7. *
8. * To contact the author write to {@link mailto:ucitmc@163.com}
9. *
10. * @author ccxxcc
11. * @version $Id: {filename},v 1.0 {time} $
12. * @package system
13. */
14.
15. set_time_limit(0);
16. /**
17. * 写文件
18. * @param string $file 文件路径
19. * @param string $str 写入内容
20. * @param char $mode 写入模式
21. */
22. function wfile($file,$str,$mode=’w’)
23. {
24. $oldmask = @ umask (0);
25. $fp = @fopen($file,$mode);
26. @flock($fp, 3);
27. if(!$fp)
28. {
29. Return false;
30. }
31. else
32. {
33. @fwrite($fp,$str);
34. @fclose($fp);
35. @umask($oldmask);
36. Return true;
37. }
38. }
39.
40. function savetofile($path_get,$path_save)
41. {
42. @$hdl_read = fopen($path_get,’rb’);
43. if($hdl_read == false)
44. {
45. echo(” style=’color:red’ > $path_get can not get “);
46. Return ;
47. }
48. if($hdl_read)
49. {
50. @$hdl_write = fopen($path_save,’wb’);
51. if($hdl_write)
52. {
53. while(!feof($hdl_read))
54. {
55. fwrite($hdl_write,fread($hdl_read,8192));
56. }
57. fclose($hdl_write);
58. fclose($hdl_read);
59. return 1;
60. }
61. else
62. return 0;
63. }
64. else
65. return -1;
66. }
67.
68. function getExt($path)
69. {
70. $path = pathinfo($path);
71. return strtolower($path[‘extension’]);
72. }
73.
74. /**
75. * 按指定路径生成目录
76. *
77. * @param string $path 路径
78. */
79. function mkDirs($path)
80. {
81. $adir = explode(‘/’,$path);
82. $dirlist = ”;
83. $rootdir = array_shift($adir);
84. if(($rootdir!=’.’||$rootdir!=’..’)&&!file_exists($rootdir))
85. {
86. @mkdir($rootdir);
87. }
88. foreach($adir as $key= > $val)
89. {
90. if($val!=’.’&&$val!=’..’)
91. {
92. $dirlist .= “/”.$val;
93. $dirpath = $rootdir.$dirlist;
94. if(!file_exists($dirpath))
95. {
96. @mkdir($dirpath);
97. @chmod($dirpath,0777);
98. }
99. }
100. }
101. }
102.
103. /**
104. * 从文本中取得一维数组
105. *
106. * @param string $file_path 文本路径
107. */
108. function getFileListData($file_path)
109. {
110. $arr = @file($file_path);
111. $data = array();
112. if(is_array($arr) && !empty($arr))
113. {
114. foreach($arr as $val)
115. {
116. $item = trim($val);
117. if(!empty($item))
118. {
119. $data[] = $item;
120. }
121. }
122. }
123. Return $data;
124. }
125.
126. //采集开始
127.
128. //传入自己的需要采集的图片url列表文本文件 每个图片url写一行
129. $url_file = isset($_GET[‘file’])&&!empty($_GET[‘file’])?$_GET[‘file’]:null;
130. $txt_url = “txt/”.$url_file;
131.
132. $urls = array_unique(getFileListData($txt_url));
133. if(empty($urls))
134. {
135. echo(‘
136. die();
137. }
138. $save_url = “images/”.date(“y_m_d”,time()).”/”;
139. mkDirs($save_url); //按日期建立文件夹
140. $i = 1;
141. if(is_array($urls)&&count($urls))
142. {
143. foreach($urls as $val)
144. {
145. savetofile($val,$save_url.date(“His”,time()).”_”.$i.”.”.getExt($val));
146. echo($i.”.”.getExt($val).” got\n”);
147. $i++;
148. }
149. }
150.
151. echo(‘
152.
153. ?>
采集心得
共享一下个人的采集心德:
1.不采那些作防盗链了的站,其实可以作假来路但是这样的站采集成本太高
2.采集尽量快的站,最好在本地进行采集
3.采集时有很多时候可以先把一部分数据存入数据库,等以后进行下一步的处理。
4.采集的时候一定要作好出错处理,我一般都是如果采集三次没有成功就跳过。以前经常就因为一条内容不能采就卡在那里一直的采。
5.入库前一定要作好判断,检查内容的合法,过滤不必要的字符串。
后记:对于大部分转行的人来说,找机会把自己的基础知识补齐,边工作边补基础知识,真心很重要。
“我们相信人人都可以成为一个IT大神,现在开始,选择一条阳光大道,助你入门,学习的路上不再迷茫。这里是北京尚学堂,初学者转行到IT行业的聚集地。”
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~