当前位置: 首页 > 科技观察

每日一技能:为什么Scrapy会自动启动爬虫A和爬虫B?

时间:2023-03-22 12:48:16 科技观察

昨天在公众号社群里有个同学问了这个问题:他在一个Scrapy项目中有两个爬虫A和B。他使用命令scrapycrawlB启动爬虫B,却发现爬虫A也自动运行了。然后,这位同学贴出了他的爬虫代码:看到这段代码,我就知道是怎么回事了。要解释这个现象,我们需要掌握两个知识点:Scrapy是如何加载爬虫的?Python类变量和实例变量的区别。Scrapy是如何加载爬虫的?我们知道在Scrapy的spiders文件夹中,可以定义很多爬虫文件。只要每个爬虫文件的name值不同,那么我们就可以使用scrapycrawlname的值来启动特定的爬虫。那么,Scrapy是如何根据这个名字找到对应的类的呢?其实我们在执行scrapycrawlxxx的时候,Scrapy主要有几个步骤:首先,遍历spiders文件夹下的所有文件,在这些文件中,寻找继承scrapy.Spider的类,得到各个爬虫的name属性的值以及添加到公共字典{'name1':crawler1,'name2':'crawler2'}getscrapycrawlxxxspecific对于要启动的爬虫名字,从公共字典中找到名字对应的爬虫类并执行爬虫类,获取爬虫对象。然后调用爬虫对象的start_requests()方法。从这个过程我们可以知道,在spiders文件夹下,会加载各个爬虫。Python的类属性和实例属性当我们定义一个Python类的时候,我们其实可以在类的内部和所有方法的外部写代码,例如:classTest:a=1+1b=2+2ifa+b==6:right=Trueelse:right=Falsedef__init__(self):self.age=100self.address='Shanghai'大家注意这几行代码:a=1+1b=2+2ifa+b==6:right=Trueelse:right=False他们这里初始化的不在任何方法中的变量称为类变量或类属性。在__init__中,初始化的self.age和self.address被称为实例属性。实例属性只有在类被执行并获得实例对象时才会被执行。class属性在Python加载类时执行。请注意下面这段代码:Python只是加载了类,没有初始化,但是里面的print语句已经执行了。而当我们初始化它的时候,会执行instance属性:什么叫Python加载一个类?例如,当您从xxximportyyy时,类yyy被加载。另一个例子是当你可以使用imortlib.import_module时。那么,回到这位同学的问题。他的一个爬虫的代码之所以会一直跑,就是下图红圈里的代码:他把这段代码写在所有方法外面,把他放在类属性的区域。该区域的代码将在爬虫加载时执行。如果要解决这个问题,只需要将这段代码放在start_requests()方法中即可。本文转载自微信公众号“闻所未闻的密码”,可通过以下二维码关注。转载本文请联系Code公众号。