python爬蟲(chóng)框架Scrapy基本應(yīng)用學(xué)習(xí)教程
在正式編寫(xiě)爬蟲(chóng)案例前,先對(duì) scrapy
進(jìn)行一下系統(tǒng)的學(xué)習(xí)。
scrapy 安裝與簡(jiǎn)單運(yùn)行
使用命令 pip install scrapy
進(jìn)行安裝,成功之后,還需要隨手收藏幾個(gè)網(wǎng)址,以便于后續(xù)學(xué)習(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
安裝完畢之后,在控制臺(tái)直接輸入 scrapy
,出現(xiàn)如下命令表示安裝成功。
> scrapy Scrapy 2.5.0 - no active project Usage: scrapy <command> [options] [args] Available commands:
上述截圖是 scrapy
的內(nèi)置命令列表,標(biāo)準(zhǔn)的格式的 scrapy <command> <options> <args>
,通過(guò) scrapy <command> -h
可以查看指定命令的幫助手冊(cè)。
scrapy
中提供兩種類(lèi)型的命令,一種是全局的,一種的項(xiàng)目中的,后者需要進(jìn)入到 scrapy
目錄才可運(yùn)行。
這些命令無(wú)需一開(kāi)始就完全記住,隨時(shí)可查,有幾個(gè)比較常用,例如:
scrpy startproject <項(xiàng)目名>
該命令先依據(jù) 項(xiàng)目名 創(chuàng)建一個(gè)文件夾,然后再文件夾下創(chuàng)建于個(gè) scrpy
項(xiàng)目,這一步是后續(xù)所有代碼的起點(diǎn)。
> scrapy startproject my_scrapy > New Scrapy project 'my_scrapy', using template directory 'e:\pythonproject\venv\lib\site-packages\scrapy\templates\project', created in: # 一個(gè)新的 scrapy 項(xiàng)目被創(chuàng)建了,使用的模板是 XXX,創(chuàng)建的位置是 XXX E:\pythonProject\滾雪球?qū)WPython第4輪\my_scrapy You can start your first spider with: # 開(kāi)啟你的第一個(gè)爬蟲(chóng)程序 cd my_scrapy # 進(jìn)入文件夾 scrapy genspider example example.com # 使用項(xiàng)目命令創(chuàng)建爬蟲(chóng)文件
上述內(nèi)容增加了一些注釋?zhuān)梢员葘?duì)著進(jìn)行學(xué)習(xí),默認(rèn)生成的文件在 python 運(yùn)行時(shí)目錄,如果想修改項(xiàng)目目錄,請(qǐng)使用如下格式命令:
scrapy startproject myproject [project_dir]
例如
scrapy startproject myproject d:/d1
命令依據(jù)模板創(chuàng)建出來(lái)的項(xiàng)目結(jié)構(gòu)如下所示,其中紅色下劃線的是項(xiàng)目目錄,而綠色下劃線才是 scrapy
項(xiàng)目,如果想要運(yùn)行項(xiàng)目命令,則必須先進(jìn)入紅色下劃線 my_scrapy
文件夾,在項(xiàng)目目錄中才能控制項(xiàng)目。
下面生成一個(gè)爬蟲(chóng)文件
使用命令 scrapy genspider [-t template] <name> <domain> 生成爬蟲(chóng)文件,該方式是一種快捷操作,也可以完全手動(dòng)創(chuàng)建。創(chuàng)建的爬蟲(chóng)文件會(huì)出現(xiàn)在 當(dāng)前目錄或者項(xiàng)目文件夾中的 spiders
文件夾中,name
是爬蟲(chóng)名字,domain
用在爬蟲(chóng)文件中的 alowed_domains
和 start_urls
數(shù)據(jù)中,[-t template]
表示可以選擇生成文件模板。
查看所有模板使用如下命令,默認(rèn)模板是 basic
。
> scrapy genspider -l basic crawl csvfeed xmlfeed
創(chuàng)建第一個(gè) scrapy
爬蟲(chóng)文件,測(cè)試命令如下:
>scrapy genspider pm imspm.com Created spider 'pm' using template 'basic' in module: my_project.spiders.pm
此時(shí)在 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
測(cè)試 scrapy 爬蟲(chóng)運(yùn)行
使用命令 scrapy crawl <spider>
,spider
是上文生成的爬蟲(chóng)文件名,出現(xiàn)如下內(nèi)容,表示爬蟲(chóng)正確加載。
>scrapy crawl pm 2021-10-02 21:34:34 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: my_project) [...]
scrapy 基本應(yīng)用
scrapy
工作流程非常簡(jiǎn)單:
采集第一頁(yè)網(wǎng)頁(yè)源碼;解析第一頁(yè)源碼,并獲取下一頁(yè)鏈接;請(qǐng)求下一頁(yè)網(wǎng)頁(yè)源碼;解析源碼,并獲取下一頁(yè)源碼;[…]過(guò)程當(dāng)中,提取到目標(biāo)數(shù)據(jù)之后,就進(jìn)行保存。
接下來(lái)為大家演示 scrapy
一個(gè)完整的案例應(yīng)用,作為 爬蟲(chóng) 120 例 scrapy 部分的第一例。
> scrapy startproject my_project 爬蟲(chóng) > cd 爬蟲(chóng) > scrapy genspider pm imspm.com
獲得項(xiàng)目結(jié)構(gòu)如下:
上圖中一些文件的簡(jiǎn)單說(shuō)明。
scrapy.cfg
:配置文件路徑與部署配置;
items.py
:目標(biāo)數(shù)據(jù)的結(jié)構(gòu);
middlewares.py
:中間件文件;
pipelines.py
:管道文件;
settings.py
:配置信息。
使用 scrapy crawl pm
運(yùn)行爬蟲(chóng)之后,所有輸出內(nèi)容與說(shuō)明如下所示:
上述代碼請(qǐng)求次數(shù)為 7 次,原因是在 pm.py
文件中默認(rèn)沒(méi)有添加 www
,如果增加該內(nèi)容之后,請(qǐng)求次數(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
表示請(qǐng)求 start_urls
中的地址,獲取響應(yīng)之后的回調(diào)函數(shù),直接通過(guò)參數(shù) response
的 .text
屬性進(jìn)行網(wǎng)頁(yè)源碼的輸出。
獲取到源碼之后,要對(duì)源碼進(jìn)行解析與存儲(chǔ)
在存儲(chǔ)之前,需要手動(dòng)定義一個(gè)數(shù)據(jù)結(jié)構(gòu),該內(nèi)容在 items.py
文件實(shí)現(xiàn),對(duì)代碼中的類(lèi)名進(jìn)行了修改,MyProjectItem
→ ArticleItem
。
import scrapy class ArticleItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() # 文章標(biāo)題 url = scrapy.Field() # 文章地址 author = scrapy.Field() # 作者
修改 pm.py
文件中的 parse
函數(shù),增加網(wǎng)頁(yè)解析相關(guān)操作,該操作類(lèi)似 pyquery
知識(shí)點(diǎn),直接觀察代碼即可掌握。
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
方法返回的是一個(gè)選擇器列表,可以迭代該列表,然后對(duì)其中的對(duì)象調(diào)用 css
方法。
item.css('.title::text')
,獲取標(biāo)簽內(nèi)文本;
item.css('.a_block::attr(href)')
,獲取標(biāo)簽屬性值;
extract_first()
:解析列表第一項(xiàng);extract()
:獲取列表。
在 pm.py
中導(dǎo)入 items.py
中的 ArticleItem
類(lèi),然后按照下述代碼進(jìn)行修改:
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) # 對(duì) item 進(jìn)行賦值 item['title'] = title item['url'] = url item['author'] = author yield item
此時(shí)在運(yùn)行 scrapy
爬蟲(chóng),就會(huì)出現(xiàn)如下提示信息。
此時(shí)完成了一個(gè)單頁(yè)爬蟲(chóng)
接下來(lái)對(duì) parse
函數(shù)再次改造,使其在解析完第 1 頁(yè)之后,可以解析第 2 頁(yè)數(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) # 對(duì) item 進(jìn)行賦值 item['title'] = title item['url'] = url item['author'] = author yield item next = response.css('.nav a:nth-last-child(2)::attr(href)').extract_first() # 獲取下一頁(yè)鏈接 # print(next) # 再次生成一個(gè)請(qǐng)求 yield scrapy.Request(url=next, callback=self.parse)
上述代碼中,變量 next
表示下一頁(yè)地址,通過(guò) response.css
函數(shù)獲取鏈接,其中的 css
選擇器請(qǐng)重點(diǎn)學(xué)習(xí)。
yield scrapy.Request(url=next, callback=self.parse) 表示再次創(chuàng)建一個(gè)請(qǐng)求,并且該請(qǐng)求的回調(diào)函數(shù)是 parse
本身,代碼運(yùn)行效果如下所示。
如果想要保存運(yùn)行結(jié)果,運(yùn)行下面的命令即可。
scrapy crawl pm -o pm.json
如果想要將每條數(shù)據(jù)存儲(chǔ)為單獨(dú)一行,使用如下命令即可 scrapy crawl pm -o pm.jl
。
生成的文件還支持 csv 、 xml、marchal、pickle ,可自行嘗試。
下面將數(shù)據(jù)管道利用起來(lái)
打開(kāi) pipelines.py
文件,修改類(lèi)名 MyProjectPipeline
→ TitlePipeline
,然后編入如下代碼:
class TitlePipeline: def process_item(self, item, spider): # 移除標(biāo)題中的空格 if item["title"]: item["title"] = item["title"].strip() return item else: return DropItem("異常數(shù)據(jù)")
該代碼用于移除標(biāo)題中的左右空格。
編寫(xiě)完畢,需要在 settings.py
文件中開(kāi)啟 ITEM_PIPELINES
配置。
ITEM_PIPELINES = { 'my_project.pipelines.TitlePipeline': 300, }
300
是 PIPELINES
運(yùn)行的優(yōu)先級(jí)順序,根據(jù)需要修改即可。再次運(yùn)行爬蟲(chóng)代碼,會(huì)發(fā)現(xiàn)標(biāo)題的左右空格已經(jīng)被移除。
到此 scrapy 的一個(gè)基本爬蟲(chóng)已經(jīng)編寫(xiě)完畢。
以上就是python爬蟲(chóng)框架Scrapy基本應(yīng)用學(xué)習(xí)教程的詳細(xì)內(nèi)容,更多關(guān)于python爬蟲(chóng)框架Scrapy的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 提升Python Scrapy庫(kù)數(shù)據(jù)采集速度實(shí)現(xiàn)高效爬蟲(chóng)
- 詳解如何優(yōu)化和調(diào)整Python中Scrapy的性能
- python爬蟲(chóng)框架scrapy代理中間件掌握學(xué)習(xí)教程
- python scrapy拆解查看Spider類(lèi)爬取優(yōu)設(shè)網(wǎng)極細(xì)講解
- python實(shí)戰(zhàn)項(xiàng)目scrapy管道學(xué)習(xí)爬取在行高手?jǐn)?shù)據(jù)
- python實(shí)戰(zhàn)scrapy操作cookie爬取博客涉及browsercookie
- python編程scrapy簡(jiǎn)單代碼實(shí)現(xiàn)搜狗圖片下載器
- Python爬蟲(chóng)進(jìn)階Scrapy框架精文講解
- Scrapy基于Python構(gòu)建強(qiáng)大網(wǎng)絡(luò)爬蟲(chóng)框架實(shí)例探究
相關(guān)文章
Django Admin實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼(省市區(qū))
多級(jí)菜單在很多上面都有應(yīng)用,這篇文章主要介紹了Django Admin實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)(省市區(qū)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python中WatchDog的使用經(jīng)驗(yàn)總結(jié)
在?python?中文件監(jiān)視主要有兩個(gè)庫(kù),一個(gè)是?pyinotify,一個(gè)是?watchdog,本文主要為大家詳細(xì)介紹一下Python中WatchDog的使用相關(guān)經(jīng)驗(yàn),感興趣的小伙伴可以了解下2023-12-12使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤(pán)輸入監(jiān)聽(tīng)功能
這篇文章主要介紹了使用Python實(shí)現(xiàn)全攝像頭拍照與鍵盤(pán)輸入監(jiān)聽(tīng)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08解決pycharm中的run和debug失效無(wú)法點(diǎn)擊運(yùn)行
這篇文章主要介紹了解決pycharm中的run和debug失效無(wú)法點(diǎn)擊運(yùn)行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Pytorch學(xué)習(xí)之torch用法----比較操作(Comparison Ops)
這篇文章主要介紹了Pytorch學(xué)習(xí)之torch用法----比較操作(Comparison Ops),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
這篇文章主要介紹了Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化,Matplotlib?是?Python?中常用的?2D?繪圖庫(kù),它能輕松地將數(shù)據(jù)進(jìn)行可視化,作出精美的圖表2022-08-08Python如何讀寫(xiě)字節(jié)數(shù)據(jù)
這篇文章主要介紹了Python如何讀寫(xiě)字節(jié)數(shù)據(jù),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08Django中針對(duì)基于類(lèi)的視圖添加csrf_exempt實(shí)例代碼
這篇文章主要介紹了Django中針對(duì)基于類(lèi)的視圖添加csrf_exempt實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Pycharm連接遠(yuǎn)程服務(wù)器并遠(yuǎn)程調(diào)試的全過(guò)程
PyCharm 是 JetBrains 開(kāi)發(fā)的一款 Python 跨平臺(tái)編輯器,下面這篇文章主要介紹了Pycharm連接遠(yuǎn)程服務(wù)器并遠(yuǎn)程調(diào)試的全過(guò)程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-06-06