写在前面

根据我自己的学习经验,靠眼睛的学习永远没有靠手指来的快,理论和技巧靠看和背远没有自己动手来得实在,“干就完了”最应该是程序猿的座右铭。

本次目的

从实战的方式体验爬虫的流程。

开始

先来说一下本次实战预期达到的效果:爬取英雄联盟客户端最新版本号和更新时间,用以在版本更新时提醒自己更新。
OK,接下来就是实战部分了:

<?php
$url = "https://lol.qq.com/download.shtml";
$html = file_get_contents($url);
print_r($html);

然而到这里你会发现一个问题:乱码了!这也是我们在做爬虫的时候可能会经常遇到的问题,在做正则之前自己先检查一下是不是乱码了,知道问题所在就稍微完善一下,php自带utf-8和GB2312相互转换的函数iconv。

<?php
$url = "https://lol.qq.com/download.shtml";
$html = file_get_contents($url);
$html = iconv("gb2312","utf-8//IGNORE",$html);
print_r($html);

代码还是很简单的,当然实际上,获取网页的内容多数情况还是会选择运用PHP中的curl函数,后续遇到问题或者需要的时候我们在进行学习。

  • 接下来提取有用信息
    分析一下页面,定位到需要的数据,先按F12调出浏览器的开发者工具(Mac中是使用Option+Command+I),鼠标左键点击下图中序号1的小按钮,再点击序号2处自己有用信息的位置,就可以再右侧序号3的位置找到对应的代码。

定位数据
需要注意一下有的时候这种方式是有缺陷的,比如动态加载的数据,爬虫无法直接获取js加载上的内容,这就需要额外去爬取分析,我们在写爬虫的时候会常遇到这种情况,以后会有相关的案例。还有一种情况是部分浏览器会主动把有明显错误的代码给忽略,比如“<<div>”这种多一个“<”还有少些一个“</div>”的情况,在这里对那些不认真的程序员发起强烈谴责。
在这一步我们的核心就是正则表达式了,不过如果你不太擅长正则表达式也不要紧,后续我们用相应的类库就会方便的多。

<?php
preg_match('/当前版本:(.*?)\|/is', $html, $match);
$ver = trim($match[1]);
preg_match('/更新日期:(.*?)\|/is', $html, $match);
$updatetime = trim($match[1]);
echo $ver;
echo '<br>';
echo $updatetime;

这里就把有用的信息提取出来了。

  • 保存数据
<?php
$myfile = fopen("ver.txt", "w");
$txt = $ver.",".$updatetime;
fwrite($myfile, $txt);
fclose($myfile);

这里就没有什么好说的,把数据保存到本地用以后续的使用。

  • 结束爬虫

这里没有URL队列,不需要重复爬取,也可以免去终止条件,直接结束程序即可。

  • 完整代码
<?php
$url = "https://lol.qq.com/download.shtml";
$html = file_get_contents($url);
$html = iconv("gb2312","utf-8//IGNORE",$html);
//print_r($html);
preg_match('/当前版本:(.*?)\|/is', $html, $match);
$ver = trim($match[1]);
preg_match('/更新日期:(.*?)\|/is', $html, $match);
$updatetime = trim($match[1]);
//echo $ver;
//echo '<br>';
//echo $updatetime;
$myfile = fopen("ver.txt", "w");
$txt = $ver.",".$updatetime;
fwrite($myfile, $txt);
fclose($myfile);

小结

  1. 使用file_get_contents或者curl函数读取网页信息
  2. 使用正则提取有用信息
  3. 保存数据
  4. 循环条件
  5. 结束

写在后面

其实爬虫学习的内容到这里就已经完成了,但是对于整个项目显然还有需要完善的地方,我简单描述一下后续的改进和我的实际应用,设置定时任务定时访问程序,每次爬取时,在保存数据前,先读取已存储数据,用爬取的数据进行比较,若相同,则不做处理,若不同则进行更新保存,同时用phpmailer给自己发送邮件或者自己搭建微信消息接口用以提醒自己进行更新,由此即可实现每次游戏更新时的提醒,代码部分结束。使用智能插座并给电脑设置bios通电开机从而实现远程开机,搭架frp进行外网穿透实现远程控制电脑,至此整个完整项目结束。(其中提到的phpmailer、搭建微信消息接口、远程开机以及搭架frp感兴趣的朋友可以先自行研究,我也会在后续出相关的教程)