爬虫的一般思路如下:
  1. 分析目标源所有url
  2. 抓取URL
  3. 分析内容
  4. 入库
现在以抓取一个图片为主的网站为例,爬取其中的图片。 网站名称:堆糖网
域名: https://www.duitang/
需抓取的分类/频道:时尚穿搭、美妆造型、婚礼婚纱


1.分析目标源所有url





此处发现,

频道的url

图片详情页的url

注意,此网站频道详情页运用异步无限加载方式加载所有blog,随着scrollbar的滚动,会通过api继续请求文章,返回的是json文件。

异步加载blogapi


2.抓取url

一般的抓取url的思路是通过分析页面的html结构,找到特定结构位置上的链接,通过get请求访问该链接,进入到详情页,再获取内容。

但是这个网站就不需要如此麻烦的操作,原因有如下几点:

  • 网站文章详情页内容和频道列表内容完全一致,都是图片+一段描述

  • 网站虽然有翻页按钮,但是无限加载的json文件可以不需要出发翻页就能请求到所有数据

  • 异步请求返回的json文件内有我们需要的所有内容,包括图片描述与图片地址

所以只需要不停的请求异步api就能够爬取到图片。下面我们来分析一下api


由于其中有json_encode()的中文符号,我们把这段url放到浏览器里看一下



放大url部分


我们可以看到很多参数,再和其他url对比后发现,

影响获取到的json文件内容的参数有:

  • filter_id=时尚搭配_搭配达人//按照<大分类>_<小分类>的格式经过json_encode()后得到
  • start=24//这是分页数目,一页有25条记录
  • _=1518201178347//这是大概是一个时间戳,且末尾的数字随api请求词数递增,每次加1。并且没有这个参数也能请求到数据。但是还是带上比较好,防止请求过期和被网站限制请求次数

3.分析内容

也就是说,我们可以通过更改以上三个参数,获取到json文件封装好的所有数据!我们把其中一个json文件取出来看一下它的结构:


可以看到,limit参数表示了jsonitem的数目,

object_list下的msg是我们需要的图片描述信息,

object_list下的photo中的path是我们需要的图片地址,

至此我们需要爬取的图片信息全部获取到。

4.整理入库

其实整个爬虫过程中,最需要时间的是嗅探url和整理入库这两步。

整理入库需要根据表结构在提取出有用的信息,再统一封装好存入数据库,这是一个很繁琐的过程。不过本次图片爬取先不细究改进入库和统一入库标准的操作,只研究到获取到文件为止。

我们已经有了图片的地址,那么如何将图片批量下载到本地呢?

php中,只需调用file_get_contents()方法和file_put_contents()方法就可以了。

前者将文件读入到一个字符串中,地址可以填写网络地址;后者将字符串写进文件。

$img = file_get_contents($path);

file_put_contents(‘文件名’,$img);

用这两个核心语句就可以下载图片到本地了~!



更多推荐

php爬虫——以爬取图片为例