python爬蟲框架Scrapy基本應用學習教程
在正式編寫爬蟲案例前,先對 scrapy
進行一下系統(tǒng)的學習。
scrapy 安裝與簡單運行
使用命令 pip install scrapy
進行安裝,成功之后,還需要隨手收藏幾個網(wǎng)址,以便于后續(xù)學習使用。
scrapy 官網(wǎng):https://scrapy.org
scrapy 文檔:https://doc.scrapy.org/en/latest/intro/tutorial.html
scrapy 更新日志:https://docs.scrapy.org/en/latest/news.html
安裝完畢之后,在控制臺直接輸入 scrapy
,出現(xiàn)如下命令表示安裝成功。
> scrapy Scrapy 2.5.0 - no active project Usage: scrapy <command> [options] [args] Available commands:
上述截圖是 scrapy
的內(nèi)置命令列表,標準的格式的 scrapy <command> <options> <args>
,通過 scrapy <command> -h
可以查看指定命令的幫助手冊。
scrapy
中提供兩種類型的命令,一種是全局的,一種的項目中的,后者需要進入到 scrapy
目錄才可運行。
這些命令無需一開始就完全記住,隨時可查,有幾個比較常用,例如:
scrpy startproject <項目名>
該命令先依據(jù) 項目名 創(chuàng)建一個文件夾,然后再文件夾下創(chuàng)建于個 scrpy
項目,這一步是后續(xù)所有代碼的起點。
> scrapy startproject my_scrapy > New Scrapy project 'my_scrapy', using template directory 'e:\pythonproject\venv\lib\site-packages\scrapy\templates\project', created in: # 一個新的 scrapy 項目被創(chuàng)建了,使用的模板是 XXX,創(chuàng)建的位置是 XXX E:\pythonProject\滾雪球學Python第4輪\my_scrapy You can start your first spider with: # 開啟你的第一個爬蟲程序 cd my_scrapy# 進入文件夾 scrapy genspider example example.com # 使用項目命令創(chuàng)建爬蟲文件
上述內(nèi)容增加了一些注釋,可以比對著進行學習,默認生成的文件在 python 運行時目錄,如果想修改項目目錄,請使用如下格式命令:
scrapy startproject myproject [project_dir]
例如
scrapy startproject myproject d:/d1
命令依據(jù)模板創(chuàng)建出來的項目結構如下所示,其中紅色下劃線的是項目目錄,而綠色下劃線才是 scrapy
項目,如果想要運行項目命令,則必須先進入紅色下劃線 my_scrapy
文件夾,在項目目錄中才能控制項目。
下面生成一個爬蟲文件
使用命令 scrapy genspider [-t template] <name> <domain> 生成爬蟲文件,該方式是一種快捷操作,也可以完全手動創(chuàng)建。創(chuàng)建的爬蟲文件會出現(xiàn)在 當前目錄或者項目文件夾中的 spiders
文件夾中,name
是爬蟲名字,domain
用在爬蟲文件中的 alowed_domains
和 start_urls
數(shù)據(jù)中,[-t template]
表示可以選擇生成文件模板。
查看所有模板使用如下命令,默認模板是 basic
。
> scrapy genspider -l basic crawl csvfeed xmlfeed
創(chuàng)建第一個 scrapy
爬蟲文件,測試命令如下:
>scrapy genspider pm imspm.com Created spider 'pm' using template 'basic' in module: my_project.spiders.pm
此時在 spiders
文件夾中,出現(xiàn) pm.py
文件,該文件內(nèi)容如下所示:
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
是上文生成的爬蟲文件名,出現(xiàn)如下內(nèi)容,表示爬蟲正確加載。
>scrapy crawl pm 2021-10-02 21:34:34 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: my_project) [...]
scrapy 基本應用
scrapy
工作流程非常簡單:
采集第一頁網(wǎng)頁源碼;解析第一頁源碼,并獲取下一頁鏈接;請求下一頁網(wǎng)頁源碼;解析源碼,并獲取下一頁源碼;[…]過程當中,提取到目標數(shù)據(jù)之后,就進行保存。
接下來為大家演示 scrapy
一個完整的案例應用,作為 爬蟲 120 例 scrapy 部分的第一例。
> scrapy startproject my_project 爬蟲 > cd 爬蟲 > scrapy genspider pm imspm.com
獲得項目結構如下:
上圖中一些文件的簡單說明。
scrapy.cfg
:配置文件路徑與部署配置;
items.py
:目標數(shù)據(jù)的結構;
middlewares.py
:中間件文件;
pipelines.py
:管道文件;
settings.py
:配置信息。
使用 scrapy crawl pm
運行爬蟲之后,所有輸出內(nèi)容與說明如下所示:
上述代碼請求次數(shù)為 7 次,原因是在 pm.py
文件中默認沒有添加 www
,如果增加該內(nèi)容之后,請求次數(shù)變?yōu)?4。
現(xiàn)在的 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
中的地址,獲取響應之后的回調(diào)函數(shù),直接通過參數(shù) response
的 .text
屬性進行網(wǎng)頁源碼的輸出。
獲取到源碼之后,要對源碼進行解析與存儲
在存儲之前,需要手動定義一個數(shù)據(jù)結構,該內(nèi)容在 items.py
文件實現(xiàn),對代碼中的類名進行了修改,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
函數(shù),增加網(wǎng)頁解析相關操作,該操作類似 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
方法返回的是一個選擇器列表,可以迭代該列表,然后對其中的對象調(diào)用 css
方法。
item.css('.title::text')
,獲取標簽內(nèi)文本;
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
爬蟲,就會出現(xiàn)如下提示信息。
此時完成了一個單頁爬蟲
接下來對 parse
函數(shù)再次改造,使其在解析完第 1 頁之后,可以解析第 2 頁數(shù)據(jù)。
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
函數(shù)獲取鏈接,其中的 css
選擇器請重點學習。
yield scrapy.Request(url=next, callback=self.parse) 表示再次創(chuàng)建一個請求,并且該請求的回調(diào)函數(shù)是 parse
本身,代碼運行效果如下所示。
如果想要保存運行結果,運行下面的命令即可。
scrapy crawl pm -o pm.json
如果想要將每條數(shù)據(jù)存儲為單獨一行,使用如下命令即可 scrapy crawl pm -o pm.jl
。
生成的文件還支持 csv 、 xml、marchal、pickle ,可自行嘗試。
下面將數(shù)據(jù)管道利用起來
打開 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("異常數(shù)據(jù)")
該代碼用于移除標題中的左右空格。
編寫完畢,需要在 settings.py
文件中開啟 ITEM_PIPELINES
配置。
ITEM_PIPELINES = { 'my_project.pipelines.TitlePipeline': 300, }
300
是 PIPELINES
運行的優(yōu)先級順序,根據(jù)需要修改即可。再次運行爬蟲代碼,會發(fā)現(xiàn)標題的左右空格已經(jīng)被移除。
到此 scrapy 的一個基本爬蟲已經(jīng)編寫完畢。
以上就是python爬蟲框架Scrapy基本應用學習教程的詳細內(nèi)容,更多關于python爬蟲框架Scrapy的資料請關注本站其它相關文章!
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。