说盗版其实应该也不算是了,严谨的说是抓取一个网络小说的内容,过滤掉不需要的内容(比如广告和统计代码什么的),然后再把干净的内容呈现出来。
这段时间在追一部叫《劫天运》的连载小说,原名《养鬼为祸》,好像因为河蟹问题所以改名了,最早是在黑岩网追的付费的,2毛多一章追了几十块钱,但是后来作者经常耍猴(作者每天凌晨更新,有时候一更都没有也不提前告知,n多次白等到凌晨1点)就放弃付费了,但是一直还在追,更换了无数的小说站,最后终于稳定在顶点中文网。
这个站的盗版工作已经做完,所以这次就换了另外一个网站来做盗版演示,这个站长也是牛X居然域名就是
yangguiweihuo.com
工作环境
我现在用的虚拟主机是 php
的,所以这次盗版工作也是用的 php
作为服务端语言
准备工作
安装软件
为了本地调试需要安装 phpStudy,自行配置好 phpStudy
后在浏览器地址栏输入 localhost
并回车,如果正常会显示一个网页,之后在 phpStudy
建立的WWW目录下新建几个文件(夹)
1 2 3 4 5 |
├─ css ├─ js │ index.php │ home.php //小说首页 │ article.php //章节 |
获取小说地址
小说当然是在手机上看的,用pc浏览器需要模拟手机访问以获取手机版地址
- 用
猎豹浏览器
(也可以是其它浏览器,几乎所有浏览器都支持开发功能)打开小说首页 - 按
F12
打开开发面板 - 启用模拟手机,选择手机型号
- 最后刷新一下页面就成了
图中从上到下依次包括了
- 小说首页地址
- 设备型号和屏幕尺寸
- 小说首页布局展示以及后边需要去掉的广告
上面说的方法只适用于带有 wap 页面的站点,用上面的方法获取的网址会直接输出一个 wap 风格的页面,但是现在这个站虽然给出了 wap 风格的页面,但是网址不变,这样我们用代码获取小说内容的时候取得的还是 pc 样式的,无法在手机上阅读,怎么办呢?
其实在用浏览器正常访问这个站的时候,在最下边有一个 移动版
的链接,点它就好了,得到了 http://www.yangguiweihuo.com/?am_force_theme_layout=mobile
这个带参数的网址
下载样式表和脚本文件
在浏览器页面上按右键点 查看源代码
,会打开一个新的页面,在里面找到这几行
1 2 3 4 5 6 7 |
<link rel="stylesheet" href="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/style.css" type="text/css" media="screen" /> <script src="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/js/zepto.min.js"></script> <script src="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/js/kfx.swipeslide.js"></script> <script src="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/js/kfx.touchapp.js"></script> <script src="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/js/kfx.template.js"></script> <script src="http://www.yangguiweihuo.com/wp-content/themes/Novel-Mobile/js/kfx.scrolllist.js"></script> |
href 和 src 后边的链接是可以点的,直接点右键把它们保存到对应的文件夹里
额。。。。当然这一步也是可以忽略的,因为这个源文件里引用用的都是绝对地址,我们可以不用管它了。。。。。
开始过滤
准备工作做完之后就可以开始进入正题了
index.php
index.php 是在安装 phpStudy
之后建立的文件,内容如下
1 2 3 |
<?php include "home.php"; ?> |
home.php
home.php 是用来过滤和显示小说首页的,首先是获取网页内容
1 2 3 4 5 6 7 |
<?php $param = "?am_force_theme_layout=mobile"; $url = "http://yangguiweihuo.com/" . $param; $output = file_get_contents($url); echo $output; ?> |
恩,浏览器测试正常,而且发现页面里根本没有广告(哈哈),不过在 查看源代码
里边还是可以找到下边的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<script src='http://www.billionfocus.com/sina.php?id=1190'></script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- 移动广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-2383141013716021" data-ad-slot="3142463590" data-ad-format="auto"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> |
既然都写到这里了,那还是过滤一下吧(哈哈)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 过滤<script src='http://www.billionfocus.com/sina.php?id=1190'></script> // 因为这个代码有2行而且id后面的数字不一样,所以用到了正则表达式 $output = preg_replace("/<script src='http:\/\/www.billionfocus.com\/sina.php\?id=.*?'><\/script>/", "<!-- 替换广告 -->", $output); // 过滤<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> // 这个代码有3行,直接替换即可 $output = str_replace("<script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>", "<!-- 替换广告 -->", $output); // 过滤<ins></ins>之间的内容 // 这是一个多行的代码块出现了3次,要用正则表达式替换 $output = preg_replace("/<ins[\s\S]*?<\/ins>/", "<!-- 替换广告 -->", $output); // 过滤<script>(adsbygoogle = window.adsbygoogle || []).push({});</script> // 出现3次而且是多行代码块,还是用正则表达式 $output = preg_replace("/<script>\n\(adsbygoogle.*\n<\/script>/", "<!-- 替换广告 -->", $output); |
继续看网页源代码,最下边有个 footer
标签,里边有统计代码和桌面版的链接,不如也去掉好了
1 2 3 |
// 过滤<footer></footer>之间的内容 // 多行代码块还是要用正则表达式,不过还是要保留一些内容的 $output = preg_replace("/<footer[\s\S]*?<\/footer>/", "<!-- 替换统计 -->\n<footer class='ui-bottom-bar'><p>Copyright © <a href='./'>劫天运</a></p></footer>", $output); |
再继续看源代码,最上边 header 后边还有菜单,我也用不上,也去掉吧
1 2 3 4 |
// 菜单分两部分,菜单按钮和菜单项 // 菜单按钮直接替换掉,菜单项分多行需要用正则表达式 $output = str_replace("<div class=\"ui-menu-trigger js-menubtn-top\"></div>", "<!-- 替换菜单按钮 -->", $output); $output = preg_replace("/<div class=\"ui-cateandsearch js-category-search[\s\S]*?<\/div><br \/>/", "<!-- 替换菜单项 --><br />", $output); |
菜单再网上还有一个主页按钮,地址是人家的,也替换一下
1 2 |
// 替换主页链接 $output = str_replace("<a href=\"http://www.yangguiweihuo.com\" class=\"ui-gohomepage\"></a>", "<!-- 替换主页链接 -->\n<a href='./' class='ui-gohomepage'></a>", $output); |
页面修整告一段落,下边就是改小说内容的链接和翻页链接了,先把最下边的翻页链接http://www.yangguiweihuo.com/page/2?am_force_theme_layout=mobile
改为我们自己的 home.php
1 2 3 4 5 6 |
// 替换翻页链接为本页面,用到正则表达式 $output = preg_replace("/http:\/\/www.yangguiweihuo.com\/page\//", "./home.php?page=", $output); // 去掉多余的参数 $output = str_replace("?am_force_theme_layout=mobile", "", $output); // 替换上一页和第一页链接 $output = str_replace("<a href='http://www.yangguiweihuo.com/' class=", "<a href='./' class=", $output); |
上面把翻页替换为 home.php 了,那么 home.php 还要再修改一下以接收参数
1 2 3 4 5 6 7 8 |
if (!isset($_GET["page"])) { $page = ""; } else { $page = "page/" . $_GET["page"]; } $param = "?am_force_theme_layout=mobile"; $url = "http://www.yangguiweihuo.com/" .$page . $param; |
还没完事。。。。。主页中的文章链接也要重定向到 article.php 里边去
1 2 3 |
// 替换文章链接到自己的article.php里边 // 直接替换即可 $output = str_replace("<a href=\"http://www.yangguiweihuo.com/", "<a href=\"./article.php?id=", $output); |
至此,小说首页分析和过滤就结束了,下面开始搞文章正文内容
article.php
和 home.php 的流程一样,首先是获取文章内容
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php if (!isset($_GET["id"])) { header ('location: ./'); } else { $id = $_GET["id"]; } $param = "?am_force_theme_layout=mobile"; $url = "http://yangguiweihuo.com/" . $id . $param; $output = file_get_contents($url); echo $output; ?> |
测试文章显示没问题后,点右键选 查看源文件
,看看有没有广告之类的东西吧
呵呵,好像和主页是一样的,那我就先粘为敬了(哈哈哈)
恩。。。。有两个不同的地方,之前过滤菜单的时候把它上一层也过滤掉了,但是在文章阅读页面有几个控制按钮需要保留,所以替换菜单项那里需要改一下
1 2 3 4 |
// 菜单分两部分,菜单按钮和菜单项 // 菜单按钮直接替换掉,菜单项分多行需要用正则表达式 $output = str_replace("<div class=\"ui-menu-trigger js-menubtn-top\"></div>", "<!-- 替换菜单按钮 -->", $output); $output = preg_replace("/<menu class=\"ui-categorys js-category-panel js-hidden[\s\S]*?<\/menu>/", "<!-- 替换菜单项 -->", $output); |
还有一个地方,文章阅读页面没有翻页功能,所以替换翻页那部分也不要粘了
再来看看还有什么不一样的地方吧
恩,最显眼的也就是这些乱78遭的东西了,一个一个去掉吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 去除底部文字广告 // 多行文字要用正则表达式 $output = preg_replace("/<div style=\"color:red[\s\S]*?<\/div>/", "<!-- 替换文字广告 -->", $output); // 去除畅言评论模块代码 $output = str_replace("<a name=\"comments\"></a>", "", $output); $output = preg_replace("/<div id=\"SOHUCS[\s\S]*?<\/div>/", "<!-- 替换畅言评论 -->", $output); $output = preg_replace("/<script>\(function\(\)[\s\S]*?<\/script>/", "<!-- 替换畅言评论代码 -->", $output); $output = preg_replace("/<div id=\"ds-ssr[\s\S]*?<\/div>/", "<!-- 替换畅言评论列表 -->", $output); // 去除点赞按钮 // 多行代码块要用正则表达式 $output = preg_replace("/<div align=\"center[\s\S]*?<\/div><\/div>/", "<!-- 替换点赞按钮 -->", $output); // 去除点赞代码 $output = str_replace("<script id=\"bdlike_shell\"></script>", "", $output); $output = preg_replace("/<script>[\s\S]*?<\/script>/", "<!-- 替换点赞代码 -->", $output); |
盗版完成
到这一步,过滤工作算是全部完成了,效果如下
最后只要把所有 php 文件上传到虚拟主机就可以了,盗版工作到此结束