爬虫之批量下载Admin5源码

项目介绍

Admin5 提供了各种语言的开源项目,包括asp php .net jsp等。最近开始玩代码审计,到处找项目很麻烦,所以打算写一个爬虫,借助Admin5批量下载各类开源项目。

分析页面

首先,分析下Admin5的页面。

截图-1

可以看到,页面数据直接在html中显示的,并不是JS渲染上去的,这就比较好爬了。在响应的请求中,页面用的是gb2312编码,打印的时候需要注意一下,不然会乱码。建议设置编码为gbk,因为gb2312的支持的字没有gbk多,像打印的时候,就会抛异常。

首页的地址是http://down.admin5.com/php/,往后翻页,再看看首页的地址。

截图-2

变成了http://down.admin5.com/php/list_30_1.html

那么就可以得出页面的地址规则 php/list_30_页码.html

截图-3

这里使用XPATH表达式可以很方便的获取页面数据,//div[@class="lists_bigimg_right"]/a,获取当前页所有项目详情的 a 标签,即详情页的地址。

随便进入一个项目的详情,找到下载地址。

截图-4

使用 XPATH : //ul[@class="down-anniu"]//li/a/@href,获取下载地址,这条XPATH是获取所有的下载点地址,实际用不到这么多,可以修改下 //ul[@class="down-anniu"]/li[1]/a/@href,只获取1条。

当然,这个页面还包含了其它的数据,同样可以用 XPATH 采集,就不详细写了,后面在代码中会有。

运行流程

下面梳理下我们爬虫的运行流程。

  1. 访问http://down.admin5.com/php/asp,.net等语言项目的页面其实是一样的,改下路径就行,这里以php的为例。

  2. 获取后续页面的地址,即下一页。由于Admin5的页面比较简单,可以直接获取总页数,然后用for循环,遍历http://down.admin5.com/php/list_30_页码.html

  3. 获取每个项目的详细页地址,并跟进。

  4. 提取项目的详细参数,获取下载地址,加入下载队列。

  5. 下载模块不断取出队列的任务,下载项目,直到队列为空。

具体实现

这个项目比较简单,所以没有用scrapy等很重的框架去做。就用最简单的requests库去实现,下面设计一下具体的业务模型。

模型

  1. ProjectItem
    • name
    • size
    • update_date
    • official_url
    • download_url

这个模型包含每个项目的属性,包括项目名称,大小,更新日期,官方地址,下载地址。

  1. Downloader
    • download_queue
    • cache_path
    • save_path
    • add_task(projcet_item)
    • print_progress()
    • save_cache()

下载器,这个模型负责下载项目,维护下载队列,监控下载进度,并对下载过的项目地址做缓存,防止重复下载。

代码

已上传到 Github, 具体实现请查看代码,注释已经写的比较清楚了。

效果

截图-5

已经实现了自动保存下载进度,可以随时Ctrl+C退出程序,下次执行时会跳过已下载的项目。

文章目录
  1. 1. 项目介绍
  2. 2. 分析页面
  3. 3. 运行流程
  4. 4. 具体实现
    1. 4.1. 模型
      1. 4.1.1. 代码
      2. 4.1.2. 效果
|