溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python爬蟲(chóng)的調(diào)度怎么利用scrapy進(jìn)行處理

發(fā)布時(shí)間:2020-11-24 14:57:52 來(lái)源:億速云 閱讀:163 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

python爬蟲(chóng)的調(diào)度怎么利用scrapy進(jìn)行處理?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

總的來(lái)說(shuō),需要使用代碼來(lái)爬一些數(shù)據(jù)的大概分為兩類(lèi)人:

非程序員,需要爬一些數(shù)據(jù)來(lái)做畢業(yè)設(shè)計(jì)、市場(chǎng)調(diào)研等等,他們可能連 Python 都不是很熟;

程序員,需要設(shè)計(jì)大規(guī)模、分布式、高穩(wěn)定性的爬蟲(chóng)系統(tǒng),對(duì)他們來(lái)說(shuō),語(yǔ)言都無(wú)所謂的,更別說(shuō)用不用框架了。

對(duì)于一個(gè)任何一個(gè)已經(jīng)入門(mén)的程序員來(lái)說(shuō),Python 都算不上一個(gè)很復(fù)雜的語(yǔ)言,除了不用大括號(hào)可能讓一些人感覺(jué)有些不適應(yīng)之外,基本上看看語(yǔ)法上手就能寫(xiě)了。但是恰恰是因?yàn)槲覀兌际抢纤緳C(jī)了,所以不能體會(huì)到使用一門(mén)編程語(yǔ)言對(duì)于外行來(lái)說(shuō)可能『比登天還難』。如果不用 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()

就寫(xiě)好了一個(gè)簡(jiǎn)單的爬蟲(chóng),而使用 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)

先不說(shuō)代碼增長(zhǎng)了一倍有余,初學(xué)者會(huì)問(wèn)到這些問(wèn)題:什么是 class?為什么類(lèi)還有參數(shù)?啊,什么是繼承?yield 又是什么鬼,那個(gè) scrapy.Request 又是啥?這些都是負(fù)擔(dān)。

既然要開(kāi)發(fā)大型爬蟲(chóng)系統(tǒng),那么其中很重要的一部分就是爬蟲(chóng)的調(diào)度了。一種比較簡(jiǎn)單的模式是 scheduler 作為 master,全局調(diào)度。另一種模式?jīng)]有 master,所有的爬蟲(chóng) worker 都是對(duì)等的。在實(shí)際生產(chǎn)中顯然是第一種用的更多。

顯然 scheduler 這部分是不能再用一個(gè)爬蟲(chóng)框架來(lái)實(shí)現(xiàn)的,連主循環(huán)都沒(méi)有咋寫(xiě)邏輯呢?我們可能還要實(shí)現(xiàn)增量爬取,或者消費(fèi)業(yè)務(wù)方發(fā)來(lái)的爬取請(qǐng)求等各種業(yè)務(wù),這塊顯然是在 scheduler 里面的,那么這個(gè)爬蟲(chóng)系統(tǒng)無(wú)非是 scheduler 分發(fā)任務(wù)給各個(gè) worker 來(lái)抓取。worker 還可以使用 scrapy 實(shí)現(xiàn),但是呢,這個(gè) worker 其實(shí)已經(jīng)弱化為一層薄薄的 downloader 了,那我要他干嘛呢?scrapy 的核心邏輯也不過(guò)是個(gè)深度或者廣度優(yōu)先的遍歷而已,少一個(gè)依賴(lài)不好么……

爬蟲(chóng)的工作量要么在反爬,要么在調(diào)度等業(yè)務(wù)邏輯,本身只是一個(gè) requests.get 而已,scrapy 提供的種種抽象對(duì)于初學(xué)者太復(fù)雜,大型系統(tǒng)又用不上,所以個(gè)人不推薦使用包括但不限于 scrapy 在內(nèi)的所有爬蟲(chóng)框架。

內(nèi)容擴(kuò)展:

Scrapy模塊

1、scheduler:用來(lái)存放url隊(duì)列

2、downloader:發(fā)送請(qǐng)求

3、spiders:提取數(shù)據(jù)和url

4、itemPipeline:數(shù)據(jù)保存

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
 
 
#在控制臺(tái)打印日志
configure_logging()
#CrawlerRunner獲取settings.py里的設(shè)置信息
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()

關(guān)于python爬蟲(chóng)的調(diào)度怎么利用scrapy進(jìn)行處理問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI