用PHP爬虫抓美女图库一开始我是拒绝的

详情页

详情

缘起

Chrome浏览器主页被替换成了域名高仿百度入口,搜索中间就给我打美女广告。所以顺手点开了,好吧这很美女,我的内心非常平静,甚至还想写一个爬虫...

于是正正经经的开始写爬虫。首先需要分析一下网站的HTML结构和URL路径规则,然后通过PHP自带的DOMDocument对象加载返回的HTML字符串获取DOM结构,这就可以快速方便获取栏目分类和图片下载关键属性src。例如:

如果你熟悉原生JavaScript的DOM解析,会感觉和PHP的DOMDocument对象的用法简直一模一样。我们的目标就是遍历所有目录,合理解析图片的下载路径,然后下载保存到本地文件夹。PHP自带多种下载图片方法,这里我们用file_get_contents和file_put_contents两个函数:

这几行代码就能在下载一张bg.jpg图片到本地了。

下面继续分析目标站点

详情页

提取重要的显示元素和HTML结构。一个详情页只有一张需要的图片,通过页码总数可以知道这系列图共有8张。

➀图片

➁图片总数

注:此处id=657并没有什么暖用,因为一个页面id=657存在十几,违背了id唯一的原则,属于建站人员滥用id 。

主页

主页分为三部分,导航、图片展示窗体、分页。。导航主要是获取子栏目路径,如果手动填写就可以省去解析这一步。每个栏目有n页,每一页有多个模特,每个模特进去又有多张图片。我们提取了HTML结构部分的关键代码,用作获取元素节点参考。

➀导航菜单

➁图片展示窗体

➂分页页码

执行演示

网站上的图片src:

注意到这个站存放文件src结尾是多余一个空格的,并且是以20170316这样的日期目录分文件夹的,所以很多图片是混在了一起,应该是靠数据库表映射图片路径的,在代码中我们根据页面编号对每个模特重新建立文件夹,所以很容易和原站对比结果。

做这个比较是要说明,全站抓取趋近于100%,难度会越来越大。这里的一个原因是网站HTML不能被PHP解析成DOMDocument 结构,可能是异常日文字符的问题,尝试转码也没能解决,返回的dom是NULL。单独用正则表达式提取,结果是186(占98.41%)。好了好了,到这里就可以,对个骗流量的美女图站这么较劲让我怎么继续深入。下面进入FAQ自问自答环节。

FAQ

Q:如果不能用JavaScript发起AJAX请求写爬虫,那为什么PHP可以,同样是HTTP请求。

A:JavaScript发起AJAX请求有同源跨域限制,除非服务器端允许跨域,几乎是条死路。PHP和JavaScript的最大差异是PHP是工作在服务器端,JavaScript是客户端,最常见的场景就是浏览器。Node.js工作在服务器端也可以像PHP一样写爬虫,虽然是JavaScript语法,但不是我们通常说JavaScript。

Q:这个爬虫项目编码大概用了多久,为什么是美女图站而不是其他?

A: 大概用了10小时编码和测试。正如开头所说,这个站不用登录验证,遍历HTML结构,相对来说容易一些。另外是第一次写图片爬虫,也是练手,美女的话可能关注会多一点,编程的话是非常缺乏交流啊,希望多一些反馈。

Q:项目最大的收获是什么?

A:在DOM结构不行的时候,还是正则厉害,讲正则最好的博客作者是学C语言的。最近有整理代码强迫症,把过程式写法都整进面向对象了,所以代码就两个200多行的对象,现在感觉用过程四重循环也能搞定!下个站准备试试。

下载地址

https://github.com/nasaplayer/-PHP-

- END -

codenight改变世界的每一天

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180520G0AIRH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券