中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python爬蟲的調度怎么利用scrapy進行處理

發布時間:2020-11-24 14:57:52 來源:億速云 閱讀:164 作者:Leah 欄目:開發技術

python爬蟲的調度怎么利用scrapy進行處理?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

總的來說,需要使用代碼來爬一些數據的大概分為兩類人:

非程序員,需要爬一些數據來做畢業設計、市場調研等等,他們可能連 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()

關于python爬蟲的調度怎么利用scrapy進行處理問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明星| 淮安市| 措勤县| 巴林左旗| 克山县| 浑源县| 福贡县| 新竹市| 北海市| 江山市| 江口县| 通化市| 钟山县| 铜川市| 西乌珠穆沁旗| 秀山| 高尔夫| 洛宁县| 麻栗坡县| 洪泽县| 巢湖市| 方城县| 古浪县| 黔南| 报价| 故城县| 闻喜县| 漳浦县| 安阳市| 铁力市| 喀什市| 澄城县| 荣昌县| 泗水县| 余姚市| 秀山| 封开县| 苍南县| 特克斯县| 蕲春县| 武功县|