使用VS Code调试开发Scrapy Cluster

最近在研究Scrapy Cluster框架,发现网上的用VS Code调试开发Scrapy Cluster教程很少。由于Scrapy Cluster是一个分布式的数据爬虫框架,所以本地单步调试比较困难。因此作此文详细记录本地配置及调试过程。如果之前没有接触过Scrapy Cluster,建议先参考《Scrapy Cluster新手教程》。如果读者朋友们是使用PyCharm作为开发工具的,可以参考《使用PyCharm调试开发Scrapy Cluster》。本文介绍的Scrapy Cluster版本为1.2.1,Python版本为2.7。下面,我将为大家介绍和演示如何使用VS Code调试开发Scrapy Cluster爬虫。

Scrapy Cluster本地开发配置

此部分内容基本上可以参考《Scrapy Cluster新手教程》。需要注意的是,在验证Kafka是否可以连接时,

python kafkadump.py list

可能会出现如下错误:

[kafkadump] ERROR: An exception ‘KafkaUnavailableError’ occured. Arguments:
(“All servers failed to process request: [(‘test’, 9092, 0)]”,)

这是由于系统中没有配置主机名test对应的IP地址。只需要配置系统的Hosts文件时加入对应的test主机的IP地址即可。

在VS Code中开发Scrapy Cluster爬虫

使用VS Code开发Scrapy Cluster爬虫项目,需要选对合适的工作目录。由于Scrapy Cluster项目由多个模块Kafka Monitor,Redis Monitor和Crawler构成。因此我们要使用Scrapy Cluster的根目录作为工作目录。

设置正确的工作目录

例如,在本地电脑上我们把Scrapy-Cluster解压安装在以下目录中:

D:\projects\scrapy-cluster

使用VS Code打开项目时,需要把根目录设置在以上路径中。在文件浏览窗口我们可以看到以下内容:
vs code file explorer

开发爬虫代码

在Scrapy Cluster中,爬虫程序代码是放在crawler文件夹中的。因此,如果你已经有现成的Crawler代码,或者要创建新的爬虫代码,都需要在crawler文件夹中开发。因为我们使用的Git版本管理系统,只上传我们自己创建的代码,不上传Scrapy Cluster的系统代码;所以,我们的做法是把代码库中的对应文件夹crawler, kafka-monitor和redis-monitor都拷贝过来。

注意:覆盖以后要确保对应三个文件夹中的localsettings.py配置为本地版本,否则可能会报以下错误:

Unhandled error in Deferred:
2019-07-05 16:27:58 [twisted] CRITICAL: Unhandled error in Deferred:
Unhandled Error
……
sys.exit(1)
exceptions.SystemExit: 1

创建Debug入口文件

Scrapy Cluster的Python文件不是直接启动的,是需要命令行启动的。因此,在VS Code中需要创建一个启动Scrapy Cluster爬虫的脚本,然后调试时需要通过这个脚本启动爬虫程序。首先,大家需要注意的是debug.py这个文件,必须创建在以下目录,如果目录错了,就会启动失败。

D:\projects\scrapy-cluster\crawler

以下是样例代码:

from scrapy.cmdline import execute
import os

os.environ["XDG_CONFIG_HOME"] = "D:\scrapy-cluster\crawler" #绝对路径

execute([
    'scrapy',
    'runspider', "crawling\spiders\my_spider.py"
])

以上代码在执行调试时会启动my_spider.py代码,我们就可以在该文件中设置断点调试了。执行以上代码,如果在终端显示以下信息则表示启动成功了:

2019-07-08 10:39:29,170 [sc-crawler] INFO: Changed Public IP: None -> b’43.254.105.235′

如果大家对Scrapy Cluster感兴趣,可以关注以下微信号与爱好者们一起讨论相关话题。

Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。