我有收藏的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. C#调用GDAL算法进度信息传递

    GDAL库中提供了很多的算法,同时也提供了进度条的参数.对于C++调用来说,应该没什么问题,但是对C#调用来说,在进度条这块需要写一个代理来进行传递.首先写一个简单的测试代码. 首先定义一个委托函数原 ...

  2. TCP状态转换

    最近笔试遇到一个题目:如果tcp建立连接时第三次握手失败,tcp会做何操作?该问题的本质是判断我们对tcp的状态转换是否能有比较深刻的理解.只要理解了下面的状态转换图,很容易回答上述问题. 在此,将& ...

  3. python发送post请求

    urllib2.urlopen() urlib2是使用各种协议完成打开url的一个扩展包.最简单的使用方式是调用urlopen方法,比如 def urlopen(url, data=None, tim ...

  4. 关于Android自定义view 你所需要知道的基本函数

    开始时之前想吐槽一句..iphone的闹钟,12小时制.我成功的把闹钟订到了下午5:00 导致错过一班飞机.心疼改签费. 候机ing,没有事做,来写一下学习自定义view必须掌握的基本函数.这里只挑一 ...

  5. cocos2d-x 读写 xml 文件

    cocos2d-x 读写 xml 文件 A product of cheungmine使用cocos2d-x开发2d游戏确实方便,但是对于一般的小游戏,经常需要的工作是UI布局设计和调整,代码改来改去 ...

  6. 如何调整DOS窗口的宽高

    运行->cmd->dos窗口上沿点右键->默认值所选字体字体: 新宋体大小: 13窗口大小宽度: 100高度: 40屏幕缓冲区大小宽度: 100高度: 300 在这里还可以设置依他常 ...

  7. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  8. 【LaTeX排版】LaTeX论文模版

    本文是对前面LaTeX论文排版文章的总结.前面的几篇文章是分别从论文的几个方面来讲述LaTeX的排版问题,这里综合了前面的内容,给出了论文排版的模版. 模版的使用: 1.首先建立一个main.tex文 ...

  9. 《万能数据库查询分析器》实现使用SQL语句直接高效地访问文本文件

    <万能数据库查询分析器>实现使用SQL语句直接高效地访问文本文件 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要    用SQL语句来直接访问文本文件?是在做梦吗? ...

  10. DB Query Analyzer has been downloaded more than 100,000 times

                           DB Query Analyzer has been downloaded more than 100,000 times Today I am very ...