1. 程式人生 > 程式設計 >scrapy處理python爬蟲排程詳解

scrapy處理python爬蟲排程詳解

學習了簡單的知識點,就會想要向有難度的問題挑戰,這裡必須要誇一誇小夥伴們。不過我們今天不需要做什麼程式的測試,只用簡單的兩個程式碼對比,小夥伴們就能在其中體會兩者的不同和難易程度。scrapy能否適合處理python爬蟲排程的問題,小編直接說出答案小夥伴們也不能馬上信服,下面就讓我們在示例中找尋答案吧。

總的來說,需要使用程式碼來爬一些資料的大概分為兩類人:

非程式設計師,需要爬一些資料來做畢業設計、市場調研等等,他們可能連 Python 都不是很熟;

程式設計師,需要設計大規模、分散式、高穩定性的爬蟲系統,對他們來說,語言都無所謂的,更別說用不用框架了。

對於一個任何一個已經入門的程式設計師來說,Python 都算不上一個很複雜的語言,除了不用大括號可能讓一些人感覺有些不適應之外,基本上看看語法上手就能寫了。但是恰恰是因為我們都是老司機了,所以不能體會到使用一門程式語言對於外行來說可能『比登天還難』。如果不用 scrapy,可能我只需要這樣:

import requests
def main():
  for i in range(100):
    rsp = requests.get(f"http://www.example.com/{i}.html")
    with open("example-{i}.txt","w") as f:
      f.write(rsp.text)
if __name__ == "__main__":
  main()

就寫好了一個簡單的爬蟲,而使用 scrapy 呢,大概需要這樣吧:

import scrapy
class QuotesSpider(scrapy.Spider):
  name = 'quotes'
  def start_requests(self):
    urls = [
      'http://quotes.toscrape.com/page/1/','http://quotes.toscrape.com/page/2/'
    ]
    for url in urls:
      yield scrapy.Request(url=url,callback=self.parse)
  def parse(self,response):
    page = response.url.split('/')[-2]
    filename = 'quotes-%s.html' % page
    with open(filename,'wb') as f:
      f.write(response.body)
    self.log('Save file %s' % filename)

先不說程式碼增長了一倍有餘,初學者會問到這些問題:什麼是 class?為什麼類還有引數?啊,什麼是繼承?yield 又是什麼鬼,那個 scrapy.Request 又是啥?這些都是負擔。

既然要開發大型爬蟲系統,那麼其中很重要的一部分就是爬蟲的排程了。一種比較簡單的模式是 scheduler 作為 master,全域性排程。另一種模式沒有 master,所有的爬蟲 worker 都是對等的。在實際生產中顯然是第一種用的更多。

顯然 scheduler 這部分是不能再用一個爬蟲框架來實現的,連主迴圈都沒有咋寫邏輯呢?我們可能還要實現增量爬取,或者消費業務方發來的爬取請求等各種業務,這塊顯然是在 scheduler 裡面的,那麼這個爬蟲系統無非是 scheduler 分發任務給各個 worker 來抓取。worker 還可以使用 scrapy 實現,但是呢,這個 worker 其實已經弱化為一層薄薄的 downloader 了,那我要他幹嘛呢?scrapy 的核心邏輯也不過是個深度或者廣度優先的遍歷而已,少一個依賴不好麼……

爬蟲的工作量要麼在反爬,要麼在排程等業務邏輯,本身只是一個 requests.get 而已,scrapy 提供的種種抽象對於初學者太複雜,大型系統又用不上,所以個人不推薦使用包括但不限於 scrapy 在內的所有爬蟲框架。

內容擴充套件:

Scrapy模組

1、scheduler:用來存放url佇列

2、downloader:傳送請求

3、spiders:提取資料和url

4、itemPipeline:資料儲存

from twisted.internet import reactor,defer
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
import time
import logging
from scrapy.utils.project import get_project_settings
 
 
#在控制檯列印日誌
configure_logging()
#CrawlerRunner獲取settings.py裡的設定資訊
runner = CrawlerRunner(get_project_settings())
 
@defer.inlineCallbacks
def crawl():
 while True:
  logging.info("new cycle starting")
  yield runner.crawl("xxxxx")
  #1s跑一次
  time.sleep(1)
 reactor.stop()
 
crawl()
reactor.run()

到此這篇關於scrapy處理python爬蟲排程詳解的文章就介紹到這了,更多相關scrapy適合處理python爬蟲排程嗎內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!