Scrapy入門使用
阿新 • • 發佈:2022-12-10
1.scrapy入門使用
學習目標:
- 掌握 scrapy的安裝
- 應用 建立scrapy的專案
- 應用 建立scrapy爬蟲
- 應用 執行scrapy爬蟲
- 應用 scrapy定位以及提取資料或屬性值的方法
- 掌握 response響應物件的常用屬性
1 安裝scrapy
命令:
sudo apt-get install scrapy
或者:
pip/pip3 install scrapy
2 scrapy專案開發流程
- 建立專案:
scrapy startproject mySpider
- 生成一個爬蟲:
scrapy genspider itcast itcast.cn
- 提取資料: 根據網站結構在
spider
- 儲存資料:使用
pipeline
進行資料後續處理和儲存
3. 建立專案
通過命令將scrapy專案的的檔案生成出來,後續步驟都是在專案檔案中進行相關操作,下面以抓取傳智師資庫來學習scrapy的入門使用:http://www.itcast.cn/channel/teacher.shtml
建立scrapy專案的命令:
scrapy startproject <專案名字>
示例:
scrapy startproject myspider
生成的目錄和檔案結果如下:
4. 建立爬蟲
通過命令創建出爬蟲檔案,爬蟲檔案為主要的程式碼作業檔案,通常一個網站的爬取動作都會在爬蟲檔案中進行編寫。
命令:
在專案路徑下執行:scrapy genspider <爬蟲名字> <允許爬取的域名>
爬蟲名字: 作為爬蟲執行時的引數
允許爬取的域名: 為對於爬蟲設定的爬取範圍,設定之後用於過濾要爬取的url,如果爬取的url與允許的域不通則被過濾掉。
示例:
cd myspider
scrapy genspider itcast itcast.cn
生成的目錄和檔案結果如下:
5. 完善爬蟲
在上一步生成出來的爬蟲檔案中編寫指定網站的資料採集操作,實現資料提取
5.1 在/myspider/myspider/spiders/itcast.py中修改內容如下:
import scrapy
class ItcastSpider(scrapy.Spider): # 繼承scrapy.spider
# 爬蟲名字
name = 'itcast'
# 允許爬取的範圍
allowed_domains = ['itcast.cn']
# 開始爬取的url地址
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
# 資料提取的方法,接受下載中介軟體傳過來的response
def parse(self, response):
# scrapy的response物件可以直接進行xpath
names = response.xpath('//div[@class="tea_con"]//li/div/h3/text()')
print(names)
# 獲取具體資料文字的方式如下
# 分組
li_list = response.xpath('//div[@class="tea_con"]//li')
for li in li_list:
# 建立一個數據字典
item = {}
# 利用scrapy封裝好的xpath選擇器定位元素,並通過extract()或extract_first()來獲取結果
item['name'] = li.xpath('.//h3/text()').extract_first() # 老師的名字
item['level'] = li.xpath('.//h4/text()').extract_first() # 老師的級別
item['text'] = li.xpath('.//p/text()').extract_first() # 老師的介紹
print(item)
注意:
-
scrapy.Spider
爬蟲類中必須有名為parse
的解析 - 如果網站結構層次比較複雜,也可以自定義其他解析函式
- 在解析函式中提取的
url
地址如果要傳送請求,則必須屬於allowed_domains
範圍內,但是start_urls
中的url
地址不受這個限制,我們會在後續的課程中學習如何在解析函式中構造傳送請求 - 啟動爬蟲的時候注意啟動的位置,是在專案路徑下啟動
-
parse()
函式中使用yield
返回資料,注意:解析函式中的yield能夠傳遞的物件只能是:BaseItem, Request, dict, None
5.2 定位元素以及提取資料、屬性值的方法
解析並獲取scrapy爬蟲中的資料: 利用xpath規則字串進行定位和提取
- response.xpath方法的返回結果是一個類似list的型別,其中包含的是selector物件,操作和列表一樣,但是有一些額外的方法
- 額外方法extract():返回一個包含有字串的列表
- 額外方法extract_first():返回列表中的第一個字串,列表為空沒有返回None
5.3 response響應物件的常用屬性
- response.url:當前響應的url地址
- response.request.url:當前響應對應的請求的url地址
- response.headers:響應頭
- response.requests.headers:當前響應的請求頭
- response.body:響應體,也就是html程式碼,byte型別
- response.status:響應狀態碼
6 儲存資料
利用管道pipeline來處理(儲存)資料
6.1 在pipelines.py檔案中定義對資料的操作
-
定義一個管道類
-
重寫管道類的process_item方法
-
process_item方法處理完item之後必須返回給引擎
import json
class ItcastPipeline():
# 爬蟲檔案中提取資料的方法每yield一次item,就會執行一次
# 該方法為固定名稱函式
def process_item(self, item, spider):
print(item)
return item
6.2 在settings.py配置啟用管道
ITEM_PIPELINES = {
'myspider.pipelines.ItcastPipeline': 400
}
配置項中鍵為使用的管道類,管道類使用.進行分割,第一個為專案目錄,第二個為檔案,第三個為定義的管道類。
配置項中值為管道的使用順序,設定的數值約小越優先執行,該值一般設定為1000以內。
7. 執行scrapy
命令:在專案目錄下執行scrapy crawl <爬蟲名字>
示例:scrapy crawl itcast
小結
- scrapy的安裝:
pip install scrapy
- 建立scrapy的專案:
scrapy startproject myspider
- 建立scrapy爬蟲:在專案目錄下執行
scrapy genspider itcast itcast.cn
- 執行scrapy爬蟲:在專案目錄下執行
- 解析並獲取scrapy爬蟲中的資料:
-
response.xpath
方法的返回結果是一個類似list的型別,其中包含的是selector
物件,操作和列表一樣,但是有一些額外的方法 -
extract()
返回一個包含有字串的列表 -
extract_first()
返回列表中的第一個字串,列表為空沒有返回None
-
- scrapy管道的基本使用:
- 完善
pipelines.py
中的process_item
函式 - 在
settings.py
中設定開啟pipeline
- 完善
- response響應物件的常用屬性
- response.url:當前響應的url地址
- response.request.url:當前響應對應的請求的url地址
- response.headers:響應頭
- response.requests.headers:當前響應的請求頭
- response.body:響應體,也就是html程式碼,byte型別
- response.status:響應狀態碼