介紹一下scrapy 爬蟲框架 安裝方法 pip install scrapy 就可以實現安裝了。我自己用anaconda 命令為conda install scrapy。 1 Engine從Spider處獲得爬取請求(Request)2Engine將爬取請求轉發給Scheduler,用於調度 3 ...
介紹一下scrapy 爬蟲框架
安裝方法 pip install scrapy 就可以實現安裝了。我自己用anaconda 命令為conda install scrapy。
1 Engine從Spider處獲得爬取請求(Request)
2Engine將爬取請求轉發給Scheduler,用於調度
3 Engine從Scheduler處獲得下一個要爬取的請求
4 Engine將爬取請求通過中間件發送給Downloader
5 爬取網頁後,Downloader形成響應(Response)通過中間件發給Engine
6 Engine將收到的響應通過中間件發送給Spider處理Engine將爬取請求轉發給Scheduler,用於調度
7 Spider處理響應後產生爬取項(scraped Item)
和新的爬取請求(Requests)給Engine
8 Engine將爬取項發送給Item Pipeline(框架出口)
9 Engine將爬取請求發送給Scheduler
Engine控制各模塊數據流,不間斷從Scheduler處
獲得爬取請求,直至請求為空
框架入口:Spider的初始爬取請求
框架出口:Item Pipeline
Engine
(1) 控制所有模塊之間的數據流
(2) 根據條件觸發事件
不需要用戶修改
Downloader
根據請求下載網頁
不需要用戶修改
Scheduler
對所有爬取請求進行調度管理
不需要用戶修改
Downloader Middleware
目的:實施Engine、Scheduler和Downloader
之間進行用戶可配置的控制
功能:修改、丟棄、新增請求或響應
用戶可以編寫配置代碼
Spider
(1) 解析Downloader返回的響應(Response)
(2) 產生爬取項(scraped item)
(3) 產生額外的爬取請求(Request)
需要用戶編寫配置代碼
Item Pipelines
(1) 以流水線方式處理Spider產生的爬取項
(2) 由一組操作順序組成,類似流水線,每個操
作是一個Item Pipeline類型
(3) 可能操作包括:清理、檢驗和查重爬取項中
的HTML數據、將數據存儲到資料庫
需要用戶編寫配置代碼
瞭解了基本概念之後我們開始寫第一個scrapy爬蟲吧。
首先要新建一個爬蟲項目scrapy startproject xxx(項目名)
這個爬蟲就簡單的爬取一個小說網站的書名與作者吧。
我們現在創建了爬蟲項目book現在來編輯他的配置
二級book目錄下這些就是配置文件上面已經介紹過了,在修改這些之前
我們現在一級book目錄下創建一個start.py 來用於scrapy爬蟲能在IDE里
面運行。文件裡面寫下如下代碼。
前兩個參數是固定的,第三個參數是你spider的名字
接下來我們就在items裡面填寫欄位:
然後在spider中創建爬蟲主程式book.py
我們要爬取的網站為http://book.km.com/
通過點擊網站不同種類小說會發現網站地址是http://book.km.com/+小說種類拼音.html
通過這個我們來寫讀取網頁的內容
得到這個之後我們通過parse 函數來解析所獲取的網頁並提取所需信息。
網頁分析提取數據是通過BeautifulSoup庫來的,這裡就略了。自己分析2333~
程式寫好我們要存儲所爬取的信息就要編輯Pipelines.py 了
這裡提供兩個保存方式
1保存為txt文本
2 存入資料庫
要讓這個成功運行我們還需要在setting.py中配置
ITEM_PIPELINES = { 'book.pipelines.xxx': 300,}
xxx為存儲方法的類名,想用什麼方法存儲就改成那個名字就好運行結果沒什麼看頭就略了
第一個爬蟲框架就這樣啦期末忙沒時間繼續完善這個爬蟲之後有時間將這個爬蟲完善成把小說內容等一起爬下來的程式再來分享一波。
附一個book的完整代碼:
import scrapy from bs4 import BeautifulSoup from book.items import BookItem class Bookspider(scrapy.Spider): name = 'book' #名字 allowed_domains = ['book.km.com'] #包含了spider允許爬取的功能變數名稱(domain)列表(list) zurl='http://book.km.com/' def start_requests(self): D=['jushi','xuanhuan'] #數組裡麵包含了小說種類這裡列舉兩個有需要可以自己添加 for i in D: #通過迴圈遍歷 url=self.zurl+i+'.html' yield scrapy.Request(url, callback=self.parse) def parse(self, response): imf=BeautifulSoup(response.text,'lxml') b=imf.find_all('dl',class_='info') for i in b: bookname=i.a.string author = i.dd.span.string item = BookItem() item['name'] = bookname item['author'] = author yield item