Windows 上使用 scrapy 抓取网页

过去一周,我在尝试在 Windows 上面使用 python,我会在这一篇文章中总结一下这一次体验的经验,代码已经发布到GitHub上面。

安装 python

本身 python 的版本就比较混乱,Windows 又提供了商店版,而且 WSL 下面也可以安装 Linux 的 python,我都体验了一下。

pyenv

介于 python 大版本兼容性,个人认为要安装一个版本管理器。因为习惯于 JavaScript 工作环境,我肯定会寻找类似于 nvm 的映射就是 pyenv,在 Windows 下面可以通过 chocolatey 安装。

sudo choco install pyenv-win

下面几个命令是最常用的。

win10 上了一个新功能,控制台会引导 python 到应用商店,在“设置>应用和功能>应用执行名”中可以勾掉这个功能

virtualenv

python 的包管理其实很差,都是放到 global 下面,这就导致多个项目可能都用同一个依赖。那么如何实现每个项目都有自己的依赖呢?这就靠 virtualenv。

pip install virtualenv

如下命令最常用

scrapy

scrapy 是一个 python 的爬虫框架,使用 pip 可以安装 scrapy。

pip install scrapy

下面是 scrapy 用的比较多的几个命令

scrapy 的概念比较多,包括 spider、pipeline、middleware 等等,但个人看来基本上看完tutorial就可以上手了。

scrapy shell

执行scrapy shell [url]可以以命令形式使用 scrapy。

发起 Xmlhttp 请求

使用Scrapy.FormRequest发起请求,接收到结果可以使用[response.body_as_unicode()]解析 JSON 为字典。

splash

截至目前,scrapy 都只能渲染非 JavaScript 运行的页面,但是借助 splash 就可以解析 JavaScript 了。我们使用 docker 可以尝试一下 splash。

docker pull scrapinghub/splash
docker run -p 8050:8050 scrapinghub/splash

访问 localhost:8050 即可访问 splash。通过安装scrapy-splash可以在 scrapy 中使用 splash,具体安装步骤官网已经很详细在此不做赘述。

Scrapinghub

Scrapinghub 是一个基于 scrapy 的云服务,可以将自己的爬虫部署到该平台。这里有个工具可以帮助部署(当然通过链接 GitHub 可以做到 master 部署)。

pip install shub

解决依赖

爬虫上传到 Scrapinghub 之后,会部署失败,可能源于以下两点。

以上两点可以通过修改 scrapinghub.yml 完成

projects:
  default: 427692
stacks:
  default: scrapy:1.8-py3
requirements:
  file: requirements.txt

通过pip freeze能够列举出目前环境下的所有包,需要挑出可能缺少的依赖写在 requirements.txt 里面(没错这一步只能人工完成,不要妄想把所有包都写进去)。

beautifulsoup4==4.8.2
feedparser===5.2.1
scrapy-splash==0.7.2

单元测试

使用 python 自带的 unittest 模块以及 pytest 可以对代码进行单元测试。可以参考我代码中的测试

执行 pytest 的时候会出现找不到模块的问题,可以按照如下方式重置根地址位置。

python -m pytest [file path]

代码优化和格式化

这里比较爽了,如果用的是 vscode,在第一次格式化代码的时候,vscode 就会安装格式化工具。

pre-commit

pre-commit 是一个 git 钩子工具,简单说,当本地代码不满足要求的时候,利用这个工具自动格式化代码或者阻止用户提交代码。可以参考官网配置

包健康检查

目前没在 python 找到一个类似于 yarn audit 的东西,到那时找到了一个SNYK是一个跨语言的包健康检查工具,但是貌似还有 bug,暂时先裸奔好了。

持续集成

目前我是用 Travis 做集成,配置文件可参考此文件

兼容性处理

另外还找到一个 python 版本兼容测试工具,考虑到使用 python 命令的人自己的 python 版本并不确定,tox则是用来测试 py 是否兼容某些 python 的版本。