1. Scrapy介紹
1.1. Scrapy框架
Scrapy是用純Python實現一個為了爬取網站資料、提取結構性資料而編寫的應用框架,用途非常廣泛。
-
Scrapy Engine
(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,訊號、資料傳遞等。 -
Scheduler
(排程器): 它負責接受引擎傳送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。 -
Downloader
(下載器):負責下載Scrapy Engine(引擎)傳送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理, -
Spider
(爬蟲):它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,並將需要跟進的URL提交給引擎,再次進入Scheduler(排程器), -
Item Pipeline
(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、儲存等)的地方. -
Downloader Middlewares
(下載中介軟體):你可以當作是一個可以自定義擴充套件下載功能的元件。 -
Spider Middlewares
(Spider中介軟體):你可以理解為是一個可以自定擴充套件和操作引擎和Spider中間通訊的功能元件(比如進入Spider的Responses;和從Spider出去的Requests)
1.2. Scrapy執行流程
-
引擎:Hi!Spider, 你要處理哪一個網站?
-
Spider:老大要我處理
xxxx.com
。 -
引擎:你把第一個需要處理的URL給我吧。
-
Spider:給你,第一個URL是
xxxxxxx.com
。 -
引擎:Hi!排程器,我這有request請求你幫我排序入隊一下。
-
排程器:好的,正在處理你等一下。
-
引擎:Hi!排程器,把你處理好的request請求給我。
-
排程器:給你,這是我處理好的request
-
引擎:Hi!下載器,你按照老大的下載中介軟體的設定幫我下載一下這個request請求
-
下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後引擎告訴排程器,這個request下載失敗了,你記錄一下,我們待會兒再下載)
-
引擎:Hi!Spider,這是下載好的東西,並且已經按照老大的下載中介軟體處理過了,你自己處理一下(注意!這兒responses預設是交給def parse()這個函式處理的)
-
Spider:(處理完畢資料之後對於需要跟進的URL),Hi!引擎,我這裡有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item資料。
-
引擎:Hi !管道 我這兒有個item你幫我處理一下!排程器!這是需要跟進URL你幫我處理下。然後從第四步開始迴圈,直到獲取完老大需要全部資訊。
-
管道“排程器:好的,現在就做!
1.3. 製作Srapy爬蟲的四部曲
- 新建專案 (scrapy startproject xxx):新建一個新的爬蟲專案
- 明確目標 (編寫items.py):明確你想要抓取的目標
- 製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁
- 儲存內容 (pipelines.py):設計管道儲存爬取內容
1.4. 檔案目錄
插入scrapy01.png
- scrapy.cfg :專案的配置檔案
[settings]
default = mySpider.settings
[deploy]
#url = http://localhost:6800/
project = mySpider
- mySpider/ :專案的Python模組,將會從這裡引用程式碼
__init__
: 必須的檔案- mySpider/items.py :專案的目標檔案
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# age = scrapy.Field()
pass
- mySpider/Middlewares.py :
- mySpider/pipelines.py :專案的管道檔案
class MyspiderPipeline(object):
def process_item(self, item, spider):
return item
- mySpider/settings.py :專案的設定檔案
# 你的爬蟲名字
BOT_NAME = `mySpider`
# 你的爬蟲的位置
SPIDER_MODULES = [`mySpider.spiders`]
NEWSPIDER_MODULE = `mySpider.spiders`
# 是否遵循robust協議
ROBOTSTXT_OBEY = True
# 爬蟲併發量
#CONCURRENT_REQUESTS = 32
# 下載延遲
#DOWNLOAD_DELAY = 3
# 下載延遲的額外設定:一般不用設定
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# 是否使用cookie
#COOKIES_ENABLED = False
# 訪問電話線設定
#TELNETCONSOLE_ENABLED = False
# 設定預設請求報頭
#DEFAULT_REQUEST_HEADERS = {
# `User-Agent`: ``
# `Accept`: `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`,
# `Accept-Language`: `en`,
#}
# 爬蟲中間鍵:一般不設定
#SPIDER_MIDDLEWARES = {
# `mySpider.middlewares.MyspiderSpiderMiddleware`: 543,
#}
# 下載中間鍵: 後面的值是優先順序,越小越高
#DOWNLOADER_MIDDLEWARES = {
# `mySpider.middlewares.MyspiderDownloaderMiddleware`: 543,
#}
# 延展,沒什麼用
#EXTENSIONS = {
# `scrapy.extensions.telnet.TelnetConsole`: None,
#}
# 管道檔案---經常使用的,用於指定優先順序
#
#ITEM_PIPELINES = {
# `mySpider.pipelines.MyspiderPipeline`: 300,
#}
2. Scrapy全部流程
我們打算抓取:http://www.itcast.cn/channel/teacher.shtml 網站裡的所有講師的姓名、職稱和個人資訊。
- 建立專案
- 編寫items.py檔案:設定需要儲存的資料欄位
- 建立爬蟲模板
- 在spiders/資料夾下面執行
scrapy genspider spidername "startURL"
- 在spiders/資料夾下面執行
- 進入xxx/spiders: 編寫爬蟲檔案,檔案裡的name就是爬蟲名
- 寫管道檔案
- 設定檔案儲存的形式和寫入檔案
- 在setting中設定優先順序(預設自動設定)
- 新增User-Agent到setting中
- 執行:
–scrapy crawl itcast
scrapy crawl itcast -o json/csv/xml/
- 資料處理
- 資料:交給管道檔案處理
yield item
- 請求:重新傳送給排程器入、出佇列,交給下載器下載
yield scrapy.Request(url, callback = self.parse)
- 資料:交給管道檔案處理
3. 寫爬蟲主要檔案
要建立一個Spider
, 你必須用scrapy.Spider
類建立一個子類,並確定了三個強制的屬性 和 一個方法。
-
name = ""
:這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。 -
allow_domains = []
是搜尋的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。 -
start_urls = ()
:爬取的URL元祖/列表。爬蟲從這裡開始抓取資料,所以,第一次下載的資料將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。 -
parse(self, response)
:解析的方法,每個初始URL完成下載後將被呼叫,呼叫的時候傳入從每一個URL傳回的Response
物件來作為唯一引數,主要作用如下:- 負責解析返回的網頁資料
(response.body)
,提取結構化資料(生成item) - 生成需要下一頁的URL請求。
- 負責解析返回的網頁資料