爬虫初探--PHP
我有收藏的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的更多相关文章
- Node.js 爬虫初探
前言 在学习慕课网视频和Cnode新手入门接触到爬虫,说是爬虫初探,其实并没有用到爬虫相关第三方类库,主要用了node.js基础模块http.网页分析工具cherrio. 使用http直接获取url路 ...
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- 爬虫初探(2)之requests
关于请求网络,requests这个库是爬虫经常用到的一个第三方库. import requests url = 'http://www.baidu.com' #这里用get方法用来请求网页,其他还有p ...
- c#网页爬虫初探
一个简单的网页爬虫例子! html代码: <head runat="server"> <title>c#爬网</title> </head ...
- python3爬虫初探(二)之requests
关于请求网页,不得不提requests这个库,这是爬虫经常用到的一个第三方库,用pip安装即可. requests用法很多,这里只写一些基础的,其他高级功能可参考官方文档. import reques ...
- python3爬虫初探(一)之urllib.request
---恢复内容开始--- #小白一个,在此写下自己的python爬虫初步的知识.如有错误,希望谅解并指出. #欢迎和大家交流python爬虫相关的问题 #2016/6/18 #----第一把武器--- ...
- 标准爬虫初探,来自Python之父的大餐!
首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...
- Python爬虫初探 - selenium+beautifulsoup4+chromedriver爬取需要登录的网页信息
目标 之前的自动答复机器人需要从一个内部网页上获取的消息用于回复一些问题,但是没有对应的查询api,于是想到了用脚本模拟浏览器访问网站爬取内容返回给用户.详细介绍了第一次探索python爬虫的坑. 准 ...
- 【网络爬虫】【python】网络爬虫(五):scrapy爬虫初探——爬取网页及选择器
在上一篇文章的末尾,我们创建了一个scrapy框架的爬虫项目test,现在来运行下一个简单的爬虫,看看scrapy爬取的过程是怎样的. 一.爬虫类编写(spider.py) from scrapy.s ...
随机推荐
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十四)
我们首先必须将Level中所有机器人保存在某个数组里,因为该数组会在不同地方被访问,我们将其放在LevelRestrict类中,按道理应该放到GameState类中,这里从简. 打开LevelRest ...
- 【一天一道LeetCode】#74. Search a 2D Matrix
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Write a ...
- awk字符串函数及其意义
awk字符串函数及其意义 awk提供了强大的内置字符串函数,用于实现文本的字符串替换.查找以及分隔等功能. awk字符串函数主要有:gsub.index.length.match.split.sub ...
- 华为机试题【13】-wave数组找字母游戏
题目描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你 ...
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
******************************************************************************** 用javah 导出类的头文件, 常见的 ...
- AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能
在AngularJS应用中集成百度地图实现定位功能 注:请点击此处进行充电! 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务. 添加第三方模块的步骤与 ...
- MySQL内存调优
原文链接: MySQL Memory Allocation -- by Rick James原文日期: Created 2010; Refreshed Oct, 2012, Jan, 2014 翻译人 ...
- iOS开发讲解SDWebImage,你真的会用吗?
SDWebImage作为目前最受欢迎的图片下载第三方框架,使用率很高.但是你真的会用吗?本文接下来将通过例子分析如何合理使用SDWebImage. 使用场景:自定义的UITableViewCell上有 ...
- iOS监听模式系列之NSNotificationCenter的简单使用
NSNotificationCenter 对于这个没必要多说,就是一个消息通知机制,类似广播.观察者只需要向消息中心注册感兴趣的东西,当有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象.这 ...
- HBase replication使用
hbase-0.90.0的一个重要改进是引入了replication机制,使它的数据完整性得到了进一步的保障.虽然这一功能还不太完善,但是今后必然会变得更加重要. hbase的replication机 ...