我有收藏的cms网站,偶尔会下载一些资源,老司机都懂的:-D。然后有一次好几天没上,堆了好些没弄,心想:cao,这好麻烦啊,能不能写个脚本自动帮我搞?然后忽然就想到,这是不是就是所谓的爬虫呢?心中一阵激动。

  因为本人还是小白,只会用PHP,所以只能将就一下吧。网站主页就是罗列各个资源的小图标以及入口,我用自己封装的curl函数get请求过去,获取所有详情页的入口链接,然后看有没有上次请求的锚点记录链接,如果没有,就继续请求下一页的的链接,如果有就停止。然后再遍历这个记录链接的数组,依次请求。详情页内有成对的大图与小图,我只要大图,过滤掉小图,然后就是PHP强大的file_get_contents了和file_put_contents函数了,well,talk is cheap,show my code now。

   1 <?php
2
3 // 加载封装好的curl请求函数
4 require "../curl_request.php";
5
6 class grab{
7
8 // 网站主页
9 public $url = "/portal.php";
10 // 图片详情页的匹配规则
11 private $content_preg = "/\/content-\d{4}-1-1\.html/i";
12 // 下一页url
13 private $page = "https://www.xibixibi.com/portal.php?page=";
14 // 大图匹配规则
15 private $bigPic_preg = "/\/data\/attachment\/forum\/20\d{2}[01]\d{1}\/[0123]\d{1}\/[a-zA-Z0-9]{22}\.(jpg|png)/";
16 // 上一次保存的详情url
17 public $lastSave = "";
18 // 图片保存根目录
19 public $root = "E:/root/";
20 // 保存grabDetailSites方法的调用次数
21 private $count = 0;
22 // 图片详情的集合数组
23 public $gallery = array();
24
25 /**
26 * 构造函数
27 *
28 */
29 public function __construct(){
30 set_time_limit(0);
31 }
32 /**
33 * 抓取网站所有详情页链接的方法
34 * @param @url 网站url
35 */
36 public function grabDetailSites($url = ""){
37 // 发送请求
38 $result = getRequest($url);
39 // 匹配详情页url
40 preg_match_all($this->content_preg, $result, $matches, PREG_PATTERN_ORDER);
41 // 去重
42 $matches = array_unique($matches[0]);
43 // 去掉网站最后一个联系方式的连接
44 if (count($matches) > 12) {
45 $matches = array_slice($matches, 0, 12);
46 }
47 // 看是否已经找到上一次最新的详情页地址
48 $offset = array_search($this->lastSave, $matches);
49 // 保存此次最新的详情页连接
50 if ($this->count == 0) {
51 file_put_contents("./lastsave.txt", $matches[0]);
52 }
53 ++$this->count;
54 // 如果找到上次抓取的最新详情url,则保存url并停止
55 if ($offset !== FALSE) {
56 $matches = array_slice($matches, 0, $offset);
57 $this->gallery = array_merge($this->gallery, $matches);
58 return TRUE;
59 }else{
60 // 否则递归下一页查找
61 $this->gallery = array_merge($this->gallery, $matches);
62 $this->grabDetailSites($this->page . ($this->count + 1));
63 return TRUE;
64 }
65 }
66
67 /**
68 * 根据gallery的详情url获取其内部大图
69 *
70 */
71 public function grabBigPic(){
72 // 循环gallery详情数组
73 foreach ($this->gallery as $key => $value) {
74 // 获取大图的url
75 $result = getRequest($value);
76 preg_match_all($this->bigPic_preg, $result, $matches);
77 $matches = array_unique($matches[0]);
78 // 循环获取大图的数据
79 foreach ($matches as $key1 => $value1) {
80 $pic = getRequest($value1);
81 $month = date("Y/m/");
82 if (!is_dir($this->root . $month)) {
83 mkdir($this->root . $month, 777, TRUE);
84 }
85 // 保存图片数据
86 file_put_contents($this->root . $month . basename($value1), $pic);
87 }
88 }
89 }
90
91 /**
92 * 整理旧的图片文件
93 *
94 */
95 public function sortPic(){
96 $allPics = scandir($this->root);
97 // 删除.和..
98 unset($allPics[0]);
99 unset($allPics[1]);
100 foreach ($allPics as $key => $value) {
101 $time = date("Y/m/", filemtime($this->root . $value));
102 if (!is_dir($this->root . $time)) {
103 mkdir($this->root . $time, 777, TRUE);
104 }
105 // 移动文件
106 rename($this->root . $value, $this->root . $time . $value);
107 }
108 }
109
110 public function __set($key, $value){
111 $this->$key = $value;
112 }
113 }

  因为网站不是很复杂,所以这个类写的还算比较简单吧,本来想做个定时任务的,不过还是等以后我的老爷机换了Ubuntu吧。

爬虫初探--PHP的更多相关文章

  1. Node.js 爬虫初探

    前言 在学习慕课网视频和Cnode新手入门接触到爬虫,说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherrio. 使用http直接获取url路 ...

  2. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  3. 爬虫初探(2)之requests

    关于请求网络,requests这个库是爬虫经常用到的一个第三方库. import requests url = 'http://www.baidu.com' #这里用get方法用来请求网页,其他还有p ...

  4. c#网页爬虫初探

    一个简单的网页爬虫例子! html代码: <head runat="server"> <title>c#爬网</title> </head ...

  5. python3爬虫初探(二)之requests

    关于请求网页,不得不提requests这个库,这是爬虫经常用到的一个第三方库,用pip安装即可. requests用法很多,这里只写一些基础的,其他高级功能可参考官方文档. import reques ...

  6. python3爬虫初探(一)之urllib.request

    ---恢复内容开始--- #小白一个,在此写下自己的python爬虫初步的知识.如有错误,希望谅解并指出. #欢迎和大家交流python爬虫相关的问题 #2016/6/18 #----第一把武器--- ...

  7. 标准爬虫初探,来自Python之父的大餐!

    首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...

  8. Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息

    目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...

  9. 【网络爬虫】【python】网络爬虫(五):scrapy爬虫初探——爬取网页及选择器

    在上一篇文章的末尾,我们创建了一个scrapy框架的爬虫项目test,现在来运行下一个简单的爬虫,看看scrapy爬取的过程是怎样的. 一.爬虫类编写(spider.py) from scrapy.s ...

随机推荐

  1. 如何通过rsync+sersync 实现同步备份

    3.rsync+sersync更快更节约资源实现web数据同步4.unison+inotify实现web数据双向同步 一:为什么要实现同步备份 服务器上有些重要文件或数据时,可以把他们多备份一份到其他 ...

  2. Django介绍、安装配置、基本使用、Django用户注册例子

    Django介绍     Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站     DjangoMTV的思想         没有controller ...

  3. JSP连接access数据库

    一个用jsp连接Access数据库的代码. 要正确的使用这段代码,你需要首先在Access数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数 ...

  4. CSS引入

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. hadoop学习要点

    一.HDFS (一)HDFS 概念 (二)HDFS命令行接口 (三)Java 接口 (四)文件读取和文件写入,一致性 (五)集群数据的均衡 (六)存档 (七)NameNode 单点故障问题 (八)大量 ...

  6. Win8 HTML5与JS编程学习笔记(一)

    微软的Visual Studio提供了多种构成win8应用的方式,其中最让我感到激动的是基于网页设计语言的开发模式,它提供了结合HTML5与Javascript来开发应用的方法,通过这种方法进行开发, ...

  7. Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

    Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...

  8. android decorView详解

    摘要 一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子元素为LinearLayout.代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域. ...

  9. 关于Html5发展和应用前景

    现在的HTML5就像当年崭露头角时的Ajax,有人在做,但不知道叫它什么.最近,苹果在 HTML5上大做文章,而著名的Web设计师Eric Meyer则提出了Web Stacks的概念.Alex Ke ...

  10. Windows平台安装及配置Hadoop(不借助cygwin)

    由于项目需要,我在VMware上装了几个虚拟机Windows server 2012 R2,并要搭建Hadoop集群.刚刚入门hadoop,一头雾水,然后开始搜各种教程,首先是选用cygwin进行安装 ...