自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一日一技:為什么 Scrapy 啟動(dòng) A 爬蟲(chóng),B 爬蟲(chóng)會(huì)自動(dòng)啟動(dòng)?

開(kāi)發(fā) 項(xiàng)目管理
他在一個(gè) Scrapy 項(xiàng)目里面,有兩個(gè)爬蟲(chóng) A 和 B,他使用命令scrapy crawl B想啟動(dòng) B 爬蟲(chóng),但是發(fā)現(xiàn) A 爬蟲(chóng)也自動(dòng)運(yùn)行了。

[[425562]]

昨天有位同學(xué)在公眾號(hào)俱樂(lè)部群?jiǎn)柫诉@樣一個(gè)問(wèn)題:

他在一個(gè) Scrapy 項(xiàng)目里面,有兩個(gè)爬蟲(chóng) A 和 B,他使用命令scrapy crawl B想啟動(dòng) B 爬蟲(chóng),但是發(fā)現(xiàn) A 爬蟲(chóng)也自動(dòng)運(yùn)行了。

然后,這個(gè)同學(xué)貼上來(lái)他的爬蟲(chóng)代碼:

看到這個(gè)代碼,我就知道是怎么回事了。要解釋這個(gè)現(xiàn)象,我們需要掌握兩個(gè)知識(shí)點(diǎn):

Scrapy 是怎么加載爬蟲(chóng)的?

Python 的類變量與實(shí)例變量的區(qū)別。

Scrapy 是怎么加載爬蟲(chóng)的?

我們知道,Scrapy 的 spiders 文件夾里面,可以定義很多個(gè)爬蟲(chóng)文件。只要每個(gè)爬蟲(chóng)文件的 name 的值不一樣,那么,我們就可以使用scrapy crawl name 的值來(lái)啟動(dòng)特定的爬蟲(chóng)。

那么,Scrapy 它是怎么根據(jù)這個(gè)名字找到對(duì)應(yīng)的類的呢?

實(shí)際上,在我們執(zhí)行scrapy crawl xxx的時(shí)候,Scrapy 有幾個(gè)主要的步驟:

  • 首先遍歷spiders 文件夾下面的所有文件,在這些文件里面,尋找繼承了scrapy.Spider的類
  • 獲取每個(gè)爬蟲(chóng)類的name屬性的值
  • 添加到一個(gè)公共的字典里面{'name1': 爬蟲(chóng)類1, 'name2': '爬蟲(chóng)類2'}
  • 獲取scrapy crawl xxx具體要啟動(dòng)的那個(gè)爬蟲(chóng)的名字,從公共字典里面,找到這個(gè)名字對(duì)應(yīng)的爬蟲(chóng)類
  • 執(zhí)行這個(gè)爬蟲(chóng)類,得到一個(gè)爬蟲(chóng)對(duì)象。然后調(diào)用爬蟲(chóng)對(duì)象的start_requests()方法

從這個(gè)過(guò)程我們可以知道,spiders 文件夾下面,每一個(gè)爬蟲(chóng)類都會(huì)被加載。

Python 的類屬性和實(shí)例屬性

在我們定義Python 類的時(shí)候,我們其實(shí)可以在類里面,所有方法的外面寫代碼,例如:

  1. class Test: 
  2.     a = 1 + 1 
  3.     b = 2 + 2 
  4.     if a + b == 6: 
  5.         right = True  
  6.     else
  7.         right = False 
  8.     def __init__(self): 
  9.         self.age = 100 
  10.         self.address = '上海' 

大家注意這幾行代碼:

  1. a = 1 + 1 
  2. b = 2 + 2 
  3. if a + b == 6: 
  4.     right = True  
  5. else
  6.     right = False 

他們不在任何方法里面的,這里面初始化的變量,叫做類變量或者類屬性。而在__init__里面,初始化的self.age和self.address叫做實(shí)例屬性。

實(shí)例屬性只有在類被執(zhí)行的時(shí)候,獲得實(shí)例對(duì)象的時(shí)候,才會(huì)執(zhí)行。而類屬性,是在類被 Python 加載的時(shí)候,就會(huì)執(zhí)行。大家注意下面這段代碼:

Python 只是加載了這個(gè)類,并沒(méi)有初始化它,但里面的 print語(yǔ)句已經(jīng)執(zhí)行了。

而當(dāng)我們初始化它以后,實(shí)例屬性才會(huì)執(zhí)行:

什么情況叫做Python 加載了一個(gè)類呢?

例如,當(dāng)你from xxx import yyy的時(shí)候,yyy這個(gè)類就被加載了。又比如你可能是使用imortlib.import_module的時(shí)候。

所以,回到這個(gè)同學(xué)的問(wèn)題。之所以他其中一個(gè)爬蟲(chóng)的代碼始終會(huì)運(yùn)行,原因就在下面紅色圓圈中的代碼:

他把這段代碼寫在了所有方法之外,讓他處于了類屬性的區(qū)域。在這個(gè)區(qū)域里面的代碼,在爬蟲(chóng)類被加載的時(shí)候,就會(huì)執(zhí)行。

如果要解決這個(gè)問(wèn)題,只需要把這段代碼,放到start_requests()方法里面就可以了。

本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 未聞Code
相關(guān)推薦

2021-06-08 21:36:24

PyCharm爬蟲(chóng)Scrapy

2024-10-16 21:47:15

2023-10-28 12:14:35

爬蟲(chóng)JavaScriptObject

2022-01-26 07:35:10

爬蟲(chóng)Requestsgzip

2024-05-24 09:07:06

JSONprint字符串

2021-10-03 20:08:29

HTTP2Scrapy

2020-12-04 06:39:25

爬蟲(chóng)網(wǎng)頁(yè)

2021-12-15 22:04:11

瀏覽器重復(fù)登錄

2022-01-08 21:27:02

URL爬蟲(chóng)地址

2022-01-26 00:19:17

反爬蟲(chóng)爬蟲(chóng)服務(wù)器

2024-11-11 00:38:13

Mypy靜態(tài)類型

2020-12-17 06:22:57

交互模式代碼

2021-10-15 21:08:31

PandasExcel對(duì)象

2021-04-27 22:15:02

Selenium瀏覽器爬蟲(chóng)

2024-09-05 12:11:25

大模型抓取列表頁(yè)

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-04-05 14:47:55

Python多線程事件監(jiān)控
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)