用Python爬取WordPress官网全部插件

转自 丘壑博客 转载注明出处

前言

只要是用WordPress的人或多或少都会装几个插件,能够用来丰富扩展WordPress的各类功能。围绕WordPress平台的插件和主题已经创建了一个独特的经济生态圈和开发者社区,养活了众多的WordPress相关的开发公司和开发者。各类强大的WordPress插件也层出不穷,有的甚至能够作出功能完善的网站,好比招聘网站、分类信息网站、电商网站、点评网站、培训网站等等,令我赞叹不已。html

最近一直沉迷于研究 WordPress,仿佛事隔多年与初恋情人再续前缘通常陷入热恋。这几天突发奇想把WordPress上这么多眼花缭乱的插件都爬下来,看看能不能分析出一点有意思的东西来。python

整体思路

官网插件的页面 wordpress.org/plugins/ 上列出了一共有 54,520 个插件。记得之前在官网上能够按各类分类浏览的,如今只有推荐的插件、收藏的插件、流行的插件几大类显示出来,其余的好像只能靠人肉搜索了。其实挺不方便的。mongodb

那么首先第一步咱们要知道取哪里能够找到全部的WordPress插件列表,搜了一圈发现WordPress的svn上有这个完整的列表, plugins.svn.wordpress.org/ (这个网页比较大,5M多,慎点),比官网上的还要齐全,一共7万多个。有了完整列表就好办了。json

接下来就是要获取的是插件的各类信息,好比做者、下载量、评分等等。这个能够去哪里获取呢?固然最傻的办法就是根据上面列表中的插件地址,把每一个插件的网页down下来再提取,这也就是爬虫干的事。不过 WordPress.org 网站自身的 WordPress.org API 已经给开发者提供了很是方便强大的接口,能够获取到几乎全部 wordprss.org 上的主题、插件、新闻等相关的信息,也支持各类参数和查询。注意,这个和WordPress的REST API是两回事。基本上你能够理解成 Apple.com 的 API 和 iOS 的 API 之间的区别(虽然apple.com并无什么API。。。)api

好比本次须要插件的一些数据,那就可使用关于插件描述的 API, https://api.wordpress.org/plugins/info/1.0/{slug}.json,slug也就是每一个插件惟一的地址,这个在刚才svn上已经能够获取到了。用这个 API 能够返回关于插件的 json 格式的各类详细信息,很全面,以下:bash

kvg8vF.png

有了列表,有了返回格式,接下来就是要把这些信息给扒下来,其实就是重复遍历一遍就能够了,要么用著名 Python 的 Requests库 循环一圈,要么使用 Python 的爬虫框架 Scrapy, 都是能够的 。在存储爬取数据存储方面,原本打算用scrapy而且存入 mongodb 的,可是遇到的一个坑是API返回的json对象里version有的key是带小数点的,好比”0.1″这种是没法直接存入mongodb的,会报错说key不能包含点.app

"versions": {
    "0.1": "https://downloads.wordpress.org/plugin/0-errors.0.1.zip",
    "0.2": "https://downloads.wordpress.org/plugin/0-errors.0.2.zip",
    "trunk": "https://downloads.wordpress.org/plugin/0-errors.zip"
  },
复制代码

InvalidDocument: key must not contain ‘.’框架

不用就不用呗。。。改key才蛋疼了。因此这能够祭出另一个厉害的python库 jsonline了, 它能够以jsonl文件的形式一行存储一条json,读写速度也很快。最后爬完全部数据的这个文件有341M之大。。。dom

最后,有了数据就能够作一些有意思的数据分析了,这一步主要会用到的就是一些常见的 Python 的数据分析工具和图表工具,pandas、numpy、seaborn等。根据上面的返回信息能够看出,可以分析的维度也是不少的,好比哪些做者开发的插件最多、哪些插件的下载量最多、哪些类别的插件最多、哪些国家的开发者最多、每一年的插件增加量等等,甚至更进一步能够把全部插件的zip文件下载下来用AI作一些深刻的代码分析等等,想一想仍是挺有意思的,本文的目标也就是提供一种思路和方法,但愿能抛砖引玉。scrapy

下面进开始进入代码的世界吧

爬取数据

准备工做

要爬数据通常第一步是要确认爬虫的入口网页,也就是从哪里开始爬,沿着入口网页找到下一个URL,找-爬-找,不断循环重复直到结束。通常来讲入口网页的分析均可以在scrapy内部进行处理,若是事先就已经能够明确知道全部要请求的网页地址,那么也能够直接把url列表扔进scrpay里,让它顺着列表一直爬爬爬就好了。

本次为了说的清晰一点,爬虫部分不用再次解释,因此分步进行,先把要爬的全部url准备好等下能够直接使用。以前说过了,WordPress全部的插件名称列表在这里能够找到 http://plugins.svn.wordpress.org/ ,这网页是一个很是简单的静态网页,就是一个巨大的ul列表,每个li就是一个插件名字:

plugins.svn.wordpress.org的网页源代码

这里的href就是插件的slug,是wordpress.org用来肯定插件的惟一标示。解析这种html对Python来讲简直是小菜一碟,好比最经常使用的 BeautifulSoup 或者 lxmp,此次决定尝试一个比较新的库,Requests-HTML: HTML Parsing for Humans ,这也是开发出Requests库的大神kennethreitz的又一力做,用于解析 HTML 文档的简直不要太爽了。

slug获得后,按照API的url格式地址组合起来,所有写入一个文件中就能够了。

python库requests_html的用法

做为对比,能够看下用 BeautifulSoup 的方法:

python库BeautifulSoup的用法

就这么一个简单对比仍是比较明显的,简单明了。最终,这一步的输出结果就是这个all_plugins_urls.txt文件了,总共有79223个插件

有了这个列表,其实下面的Scrapy步骤其实彻底能够不用,直接拿wget均可以所有简单粗暴的怼下来7万个json文件:

wget -i all_plugins_urls.txt复制代码

或者用requests简单的遍历请求一下就完事了,就能够获得全部插件的数据,进而能够直接进入数据分析阶段了。为了做为演示吧,也算做是一个简单的scrapy的介绍,对于没有接触过scrapy的朋友来讲,能够是一个很初步的入门介绍。

安装 scrapy

这一步最简单的方式就是pip安装

pip install Scrapy
scarpy -V # 验证一下复制代码

新建项目 (Project):新建一个新的爬虫项目

scrapy 提供了完善的命令工具能够方便的进行各类爬虫相关的操做。通常来讲,使用 scrapy 的第一件事就是建立你的Scrapy项目。个人习惯是首先新建一个文件夹(用要爬的网站来命名,这样能够方便的区分不一样网站的爬虫项目)做为总的工做区, 而后进入这个文件夹里新建一个 scrapy 的项目,项目的名字叫作 scrap_wp_plugins,能够改为你想要的名字

mkdir ~/workplace/wordpress.org-spider
cd ~/workplace/wordpress.org-spider
scrapy startproject  scrap_wp_plugins复制代码

这样就会自动建立好相似以下的文件结构:

├── scrap_wp_plugins
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 7 files
复制代码

对咱们这个需求来讲,除了settings.py须要作一点点修改,其他文件都先不用管它,在这个简单的不能再简单的项目里都用不到。

目前只是一个空架子,啥也干不了,由于尚未爬虫文件,你能够彻底纯手写,也能够用模板来生成一个。咱们就用scrapy的命令行自动生成一个爬虫,语法格式是这样:

Syntax: scrapy genspider [-t template] <name> <domain>

template 是要使用的爬虫的模板,默认的就是用最基本的一个。

name 就是爬虫的名字,这个能够随便取,等下要开始爬的时候会用到这个名字。比如给你的小蜘蛛取名叫“春十三”,那么在召唤它的时候你就能够大喊一声:“上吧!个人春十三!”

domain 是爬虫运行时容许的域名,比如说:“上吧!个人春十三!只沿着这条路线上!”

因此执行以下命令便可:

cd scrap_wp_plugins
scrapy genspider plugins_spider wordpress.org复制代码

这样就会在spiders文件夹下生出一个叫plugins_spider.py的爬虫文件,也就是在这里面能够填充一些爬取逻辑和内容解析。

制做爬虫(Spider):制做爬虫开始爬取网页

首先咱们打开scrap_wp_plugins/plugins_spider.py看下里面的内容:

Created spider ‘plugins_spider’ using template ‘basic’ in module: scrap_wp_plugins.spiders.plugins_spider

能够看出这就是一个最简单scrapy的Spider的类而已,自动填入了上一步用来建立爬虫时的一些参数。

name:爬虫的识别名,它必须是惟一的,在不一样的爬虫中你必须定义不一样的名字,就是上一步的命令行里写的plugins_spider.

start_urls:爬虫开始爬的一个URL列表。爬虫从这里开始抓取数据,因此,第一次下载的数据将会从这些URLS开始。其余URL将会从这些起始URL中继承性生成。具体来讲,在准备工做那一部分,咱们已经获得了一个urls的列表文件all_plugins_urls.txt,如今只须要把这个文件读取进来就行了。

parse():爬虫的方法,调用时候传入从每个URL传回的Response对象做为参数,response将会是parse方法的惟一的一个参数,
这个方法负责解析返回的数据、匹配抓取的数据(解析为item)并跟踪更多的URL。在本项目中,由于返回的是json,不须要解析任何html,这里为了省事我就直接把json整个存储起来已备后面数据分析的时候再选择须要的字段,固然你也能够根据须要选择过滤掉不须要的json字段。

因此,咱们的第一个爬虫就呼之欲出了!请看代码,麻雀虽小五脏俱全

a simple spider will crawl all plugins from wordpress.org

运行爬虫

改完上面的爬虫代码,如今就可让爬虫跑起来了,“上吧!比卡丘!”

scrapy crawl plugins_spider复制代码

哦嚯。。。

kv7Xgs.png
Forbidden by robots.txt

意外发生了。。。啥也没爬下来??

Don’t Panic
!别慌,仔细看下报错信息,原来是 api.wordpress.org/robots.txt 规定了不容许爬虫,而scrapy默认设置里是遵照robot协议的,因此简单绕过就好了,打开 setttings.py, 找到下面这行,把True改成False,意思是:“爱咋咋地,老子不屌你的robots.txt ”

# Obey robots.txt rules
ROBOTSTXT_OBEY = True复制代码

再次运行如今就能够愉快的爬取了。还有一点舒适提示,若是爬取网址数量比较多,不想中途由于断网或者其余什么鬼知道的意外中断,致使下次又要从新来过,能够加上scrapy的执行日志来保存爬虫状态,下次就会从中断处开始继续爬取

scrapy crawl plugins_spider -s JOBDIR=spiderlog   --logfile  log.out  &复制代码

这样就能够安心的去睡个觉,一早起来就能看到热呼呼新鲜出路的WordPress全部的插件信息了。

未完待续

本想放在一篇写的,没想到光爬信息这点东西写了这么多写到这么晚。。。。可能东拉西扯废话太多了,下一篇继续再写关于数据分析的科普文吧。

bestscreenshot.com/scrap-all-p…

相关文章
相关标签/搜索