在正式撰寫爬蟲案例前,先對 scrapy 進行一下系統的學習,
scrapy 安裝與簡單運行
使用命令 pip install scrapy 進行安裝,成功之后,還需要隨手收藏幾個網址,以便于后續學習使用,
- scrapy 官網:https://scrapy.org;
- scrapy 檔案:https://doc.scrapy.org/en/latest/intro/tutorial.html;
- scrapy 更新日志:https://docs.scrapy.org/en/latest/news.html,
安裝完畢之后,在控制臺直接輸入 scrapy,出現如下命令表示安裝成功,
> scrapy
Scrapy 2.5.0 - no active project
Usage:
scrapy <command> [options] [args]
Available commands:

上述截圖是 scrapy 的內置命令串列,標準的格式的 scrapy <command> <options> <args>,通過 scrapy <command> -h 可以查看指定命令的幫助手冊,
scrapy 中提供兩種型別的命令,一種是全域的,一種的專案中的,后者需要進入到 scrapy 目錄才可運行,
這些命令無需一開始就完全記住,隨時可查,有幾個比較常用,例如:
**scrpy startproject <專案名> **
該命令先依據 專案名 創建一個檔案夾,然后再檔案夾下創建于個 scrpy 專案,這一步是后續所有代碼的起點,
> scrapy startproject my_scrapy
> New Scrapy project 'my_scrapy', using template directory 'e:\pythonproject\venv\lib\site-packages\scrapy\templates\project', created in: # 一個新的 scrapy 專案被創建了,使用的模板是 XXX,創建的位置是 XXX
E:\pythonProject\滾雪球學Python第4輪\my_scrapy
You can start your first spider with: # 開啟你的第一個爬蟲程式
cd my_scrapy # 進入檔案夾
scrapy genspider example example.com # 使用專案命令創建爬蟲檔案
上述內容增加了一些注釋,可以比對著進行學習,默認生成的檔案在 python 運行時目錄,如果想修改專案目錄,請使用如下格式命令:
scrapy startproject myproject [project_dir]
例如
scrapy startproject myproject d:/d1
命令依據模板創建出來的專案結構如下所示,其中紅色下劃線的是專案目錄,而綠色下劃線才是 scrapy 專案,如果想要運行專案命令,則必須先進入紅色下劃線 my_scrapy 檔案夾,在專案目錄中才能控制專案,

下面生成一個爬蟲檔案
使用命令 scrapy genspider [-t template] <name> <domain> 生成爬蟲檔案,該方式是一種快捷操作,也可以完全手動創建,創建的爬蟲檔案會出現在 當前目錄或者專案檔案夾中的 spiders 檔案夾中,name 是爬蟲名字,domain 用在爬蟲檔案中的 alowed_domains 和 start_urls 資料中,[-t template] 表示可以選擇生成檔案模板,
查看所有模板使用如下命令,默認模板是 basic,
> scrapy genspider -l
basic
crawl
csvfeed
xmlfeed
創建第一個 scrapy 爬蟲檔案,測驗命令如下:
>scrapy genspider pm imspm.com
Created spider 'pm' using template 'basic' in module:
my_project.spiders.pm
此時在 spiders 檔案夾中,出現 pm.py 檔案,該檔案內容如下所示:
import scrapy
class PmSpider(scrapy.Spider):
name = 'pm'
allowed_domains = ['imspm.com']
start_urls = ['http://imspm.com/']
def parse(self, response):
pass
測驗 scrapy 爬蟲運行
使用命令 scrapy crawl <spider>,spider 是上文生成的爬蟲檔案名,出現如下內容,表示爬蟲正確加載,
>scrapy crawl pm
2021-10-02 21:34:34 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: my_project)
[...]
scrapy 基本應用
scrapy 作業流程非常簡單:
- 采集第一頁網頁原始碼;
- 決議第一頁原始碼,并獲取下一頁鏈接;
- 請求下一頁網頁原始碼;
- 決議原始碼,并獲取下一頁原始碼;
- […]
- 程序當中,提取到目標資料之后,就進行保存,
接下來為大家演示 scrapy 一個完整的案例應用,作為 爬蟲 120 例 scrapy 部分的第一例,
> scrapy startproject my_project 爬蟲
> cd 爬蟲
> scrapy genspider pm imspm.com
獲得專案結構如下:

上圖中一些檔案的簡單說明,
scrapy.cfg:組態檔路徑與部署配置;items.py:目標資料的結構;middlewares.py:中間件檔案;pipelines.py:管道檔案;settings.py:配置資訊,
使用 scrapy crawl pm 運行爬蟲之后,所有輸出內容與說明如下所示:

上述代碼請求次數為 7 次,原因是在 pm.py 檔案中默認沒有添加 www,如果增加該內容之后,請求次數變為 4,

現在的 pm.py 檔案代碼如下所示:
import scrapy
class PmSpider(scrapy.Spider):
name = 'pm'
allowed_domains = ['www.imspm.com']
start_urls = ['http://www.imspm.com/']
def parse(self, response):
print(response.text)
其中的 parse 表示請求 start_urls 中的地址,獲取回應之后的回呼函式,直接通過引數 response 的 .text 屬性進行網頁原始碼的輸出,

獲取到原始碼之后,要對原始碼進行決議與存盤
在存盤之前,需要手動定義一個資料結構,該內容在 items.py 檔案實作,對代碼中的類名進行了修改,MyProjectItem → ArticleItem,
import scrapy
class ArticleItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 文章標題
url = scrapy.Field() # 文章地址
author = scrapy.Field() # 作者
修改 pm.py 檔案中的 parse 函式,增加網頁決議相關操作,該操作類似 pyquery 知識點,直接觀察代碼即可掌握,
def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for item in list_item:
title = item.css('.title::text').extract_first() # 直接獲取文本
url = item.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = item.css('.author::text').extract_first() # 直接獲取文本
print(title, url, author)
其中 response.css 方法回傳的是一個選擇器串列,可以迭代該串列,然后對其中的物件呼叫 css 方法,
item.css('.title::text'),獲取標簽內文本;item.css('.a_block::attr(href)'),獲取標簽屬性值;extract_first():決議串列第一項;extract():獲取串列,
在 pm.py 中匯入 items.py 中的 ArticleItem 類,然后按照下述代碼進行修改:
def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for i in list_item:
item = ArticleItem()
title = i.css('.title::text').extract_first() # 直接獲取文本
url = i.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = i.css('.author::text').extract_first() # 直接獲取文本
# print(title, url, author)
# 對 item 進行賦值
item['title'] = title
item['url'] = url
item['author'] = author
yield item
此時在運行 scrapy 爬蟲,就會出現如下提示資訊,

此時完成了一個單頁爬蟲
接下來對 parse 函式再次改造,使其在決議完第 1 頁之后,可以決議第 2 頁資料,
def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for i in list_item:
item = ArticleItem()
title = i.css('.title::text').extract_first() # 直接獲取文本
url = i.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = i.css('.author::text').extract_first() # 直接獲取文本
# print(title, url, author)
# 對 item 進行賦值
item['title'] = title
item['url'] = url
item['author'] = author
yield item
next = response.css('.nav a:nth-last-child(2)::attr(href)').extract_first() # 獲取下一頁鏈接
# print(next)
# 再次生成一個請求
yield scrapy.Request(url=next, callback=self.parse)
上述代碼中,變數 next 表示下一頁地址,通過 response.css 函式獲取鏈接,其中的 css 選擇器請重點學習,
yield scrapy.Request(url=next, callback=self.parse) 表示再次創建一個請求,并且該請求的回呼函式是 parse 本身,代碼運行效果如下所示,

如果想要保存運行結果,運行下面的命令即可,
scrapy crawl pm -o pm.json

如果想要將每條資料存盤為單獨一行,使用如下命令即可 scrapy crawl pm -o pm.jl ,

生成的檔案還支持 csv 、 xml、marchal、pickle ,可自行嘗試,
下面將資料管道利用起來
打開 pipelines.py 檔案,修改類名 MyProjectPipeline → TitlePipeline,然后編入如下代碼:
class TitlePipeline:
def process_item(self, item, spider): # 移除標題中的空格
if item["title"]:
item["title"] = item["title"].strip()
return item
else:
return DropItem("例外資料")
該代碼用于移除標題中的左右空格,
撰寫完畢,需要在 settings.py 檔案中開啟 ITEM_PIPELINES 配置,
ITEM_PIPELINES = {
'my_project.pipelines.TitlePipeline': 300,
}
300 是 PIPELINES 運行的優先級順序,根據需要修改即可,再次運行爬蟲代碼,會發現標題的左右空格已經被移除,
到此 scrapy 的一個基本爬蟲已經撰寫完畢,
scrapy imspm.com 超級產品經理頻道爬蟲
寫在后面
今天是持續寫作的第 245 / 365 天,
期待 關注,點贊、評論、收藏,
更多精彩
《爬蟲 100 例,專欄銷售中,買完就能學會系列專欄》

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/332098.html
標籤:python
