我有收藏的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. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  2. 《java入门第一季》之tcp协议下的网络编程c/s实现通信交互

    需求:客户端向服务器发送数据,服务器端收到数据后向客户端返回数据: 还是使用两台电脑,一台客户端,一台服务器. 客户端代码: import java.io.IOException; import ja ...

  3. MySQL进阶(一)主外键讲解

    1.什么是外键: 作为外键的字段. REFERENCES:映射到主表的字段2. ON DELETE后面的四个参数:代表的是当删除主表的记录时,所做的约定. RESTRICT(限制):如果你想删除的那个 ...

  4. c++中各个数据类型的大小

    来哦金额各种数据类型有助于我们对这门语言的更好掌握,更好的利用之来编程,下面是一个简单的获得数据类型的大小的程序,虽然简单,但实用性却很高. #include <iostream> usi ...

  5. std::cout和printf

    禁止std::cout和printf混用,在多线程环境下可能导致coredump. 说明:printf和std::cout分别为标准c语言与c++中的函数,两者的缓冲区机制不同(printf无缓冲区, ...

  6. OS X 10.11 中的安全删除文件

    在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. ...

  7. 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)

    转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...

  8. Java 开源Wiki:XWiki

    XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台.之前只接触过MediaWiki,但是MediaWiki是用PHP写的,一直想找找看有没有熟悉的JAVA语言的Wiki系统. ...

  9. Python学习笔记 - 迭代器Iterator

    我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的genera ...

  10. Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)

    首次打开Dynamic CRM  2013会出现一个欢迎界面如下图,要想它不出现勾选图中的复选框就行,OK下回再打开就没有了. 但是当我们打开F12开发人员工具,清除域的缓存后再次打开CRM,这个欢迎 ...