Python爬蟲day7—Scrapy框架入門
Scrapy爬蟲框架入門
概述
Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。
組件
- Scrapy引擎(Engine):Scrapy引擎是用來控制整個系統的數據處理流程。
- 調度器(Scheduler):調度器從Scrapy引擎接受請求并排序列入隊列,并在Scrapy引擎發出請求后返還給它們。
- 下載器(Downloader):下載器的主要職責是抓取網頁并將網頁內容返還給蜘蛛(Spiders)。
- 蜘蛛(Spiders):蜘蛛是有Scrapy用戶自定義的用來解析網頁并抓取特定URL返回的內容的類,每個蜘蛛都能處理一個域名或一組域名,簡單的說就是用來定義特定網站的抓取和解析規則。
- 條目管道(Item Pipeline):條目管道的主要責任是負責處理有蜘蛛從網頁中抽取的數據條目,它的主要任務是清理、驗證和存儲數據。當頁面被蜘蛛解析后,將被發送到條目管道,并經過幾個特定的次序處理數據。每個條目管道組件都是一個Python類,它們獲取了數據條目并執行對數據條目進行處理的方法,同時還需要確定是否需要在條目管道中繼續執行下一步或是直接丟棄掉不處理。條目管道通常執行的任務有:清理HTML數據、驗證解析到的數據(檢查條目是否包含必要的字段)、檢查是不是重復數據(如果重復就丟棄)、將解析到的數據存儲到數據庫(關系型數據庫或NoSQL數據庫)中。
- 中間件(Middlewares):中間件是介于Scrapy引擎和其他組件之間的一個鉤子框架,主要是為了提供自定義的代碼來拓展Scrapy的功能,包括下載器中間件和蜘蛛中間件。
數據處理流程
引擎詢問蜘蛛需要處理哪個網站,并讓蜘蛛將第一個需要處理的URL交給它。
引擎讓調度器將需要處理的URL放在隊列中。
引擎從調度那獲取接下來進行爬取的頁面。
調度將下一個爬取的URL返回給引擎,引擎將它通過下載中間件發送到下載器。
當網頁被下載器下載完成以后,響應內容通過下載中間件被發送到引擎;如果下載失敗了,引擎會通知調度器記錄這個URL,待會再重新下載。
引擎收到下載器的響應并將它通過蜘蛛中間件發送到蜘蛛進行處理。
蜘蛛處理響應并返回爬取到的數據條目,此外還要將需要跟進的新的URL發送給引擎。
引擎將抓取到的數據條目送入條目管道,把新的URL發送給調度器放入隊列中。
上述操作中的2-8步會一直重復直到調度器中沒有需要請求的URL,爬蟲停止工作。
安裝及使用Scrapy
- 新建虛擬環境存放文件夾和項目存放文件夾
- 在命令提示符下,cd到虛擬環境存放文件夾
- python -m venv venv —— 創建虛擬環境
- 安裝流程:
- cd到項目存放文件夾
- scrapy startproject <項目名> . —— 加’ . ‘表示在當前路徑下創建
- scrapy genspider <爬蟲名> <網頁域名> —— 創建爬蟲
使用scrapy框架爬豆瓣網top250
- 在items.py中
import scrapy
class MovieItem(scrapy.Item):
title = scrapy.Field()
score= scrapy.Field()
motto= scrapy.Field()
- 在movie.py中
import scrapy
from douban.items import MovieItem
class MOvieSpider(scrapy.Spider):
name = 'movie'
allow_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
# 解析網頁
def parse(self, response):
li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
for li in li_list:
item = MovieItem()
item['title'] = li.xpath('div/div[2]/div[1]/a/span[1]/text()').extract_first()
item['score'] = li.xpath('div/div[2]/div[2]/div/span[2]/text()').extract_first()
item['motto'] = li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract_first()
yield item
# 獲取翻頁超鏈接
href_list = response.css('a[href]::attr("href")').re('\?start=.*')
for href in href_list:
url = response.urljoin(href)
yield scrapy.Request(url=url, callback=self.parse)
- 在pipelines.py中(數據持久化)
import pymongo
from scrapy import log
from scrapy.conf import settings
from scrapy.exceptions import DropItem
class DoubanPipeline(object):
def __init__(self):
connection = pymongo.MongoClient(setting['MONGODB_SERVER'], setting['MONGODB_PORT'])
db = connection[setting['MONGODB_DB']]
self.collection = db[setting['MONGODB_COLLECTION']]
def process_item(self, item, spider):
valid = True
for data in item:
if not data:
valid = False
raise DroItem("Missing %s of blogpost from %s" % (data, item['url']))
if valid:
new_movie = [{
'title': item['title'],
'motto': item['motto'],
'score': item['score'],
}]
self.collection.insert(new_movie)
log.msg("Item wrote to MongoDB database %s/%s" %
(settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
level=log.DEBUG, spider=spider)
return item
智能推薦
scrapy框架入門
scrapy框架 Scrapy是用純Python實現一個為了爬取網站數據、提取結構性數據而編寫的應用框架,用途非常廣泛。 框架的力量,用戶只需要定制開發幾個模塊就可以輕松的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便。 Scrapy 使用了 Twisted’tw?st?d異步網絡框架來處理網絡通訊,可以加快我們的下載速度,不用自己去實現異步框架,并且包含了各種中間件接口,可以...
scrapy框架入門
最近在學習爬蟲,這里是MOOC北理嵩天老師的課程筆記,適合小白入門。 如果想自己寫一個scrapy框架出來,建議自己鉆研幾個實例,理解每一行語句的作用,應該三天左右就可以上手。 當然,我們還需要掌握re, xpath, BeautifulSoup 等基礎知識。 歡迎大佬指正~ 數據,包括用戶提供的網絡爬蟲請求,以及從網絡上獲取的相關內容,在這些結構直接相互流動形成了數據流。 路徑1:請求通過SPI...
Scrapy框架入門
1. 創建爬蟲 cmd 或 powershell 或 bash 創建爬蟲命令: cmd打開方式:win + R ,輸入cmd,回車。 powershell:win + S,輸入powershell,回車。 bash:Linux下,ctrl + alt + T。 2. 核心類Spider 以爬取Scrapy百度百科為例。 首先在setting中關閉網頁爬蟲檢查: 然后在spiders目錄下創建Spi...
Scrapy框架入門
第一,認識Scrapy Scrapy 是用 Python 實現的一個為了爬取網站數據、提取結構性數據而編寫的應用框架。 Scrapy架構圖(綠線是數據流向) Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。 Scheduler(調度器): 它負責接受引擎發送過來的Request請求,并按照一定的...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...