文章目錄
- 摘要
- 1.scrapy安裝
- 2.相關命令介紹
- 2.1全域命令
- 2.2專案命令
- 3.scrapy框架介紹
- 4.Scrapy中資料流的流轉
- 5.第一個scrapy爬蟲
- 5.1創建專案
- 5.2創建爬蟲模塊
- 5.3定義item
- 5.4構建Item Pipeline
- 5.5 激活Item Pipeline
- 參考資料
摘要
七夜大佬的《python爬蟲開發與專案實戰》,買了好多年了,學習了好多東西,基本上爬蟲都是在這里面學的,后期的scrapy框架爬蟲一直不得門而入,前段時間補了下面向物件的知識,今天突然頓悟了!寫個筆記記錄下學習程序
1.scrapy安裝
# -i引數后跟清華鏡像源,加速下載,其他pip的包也可這么操作
pip install Scrapy -ihttps://pypi.tuna.tsinghua.edu.cn/simple
測驗如下圖表示安裝成功

其他參考方法:win7安裝scrapy
2.相關命令介紹
scrapy命令分為
- 全域命令:全域命令就是在哪都能用;
- 專案命令:專案命令就是只能依托你的專案;
2.1全域命令
全域命令就是上圖安裝測驗時主動跳出來的那些命令
startproject、genspider、settings、runspider、shell、fetch、view、version
比較常用的有三個:
scrapy startproject project_name # 創建專案
scrapy crawl spider_name # 運行名為spider_name的爬蟲專案
# 除錯網址為https://blog.csdn.net/qq_35866846的網站
scrapy shell "https://blog.csdn.net/qq_35866846"
全域命令就是不依托專案存在的,也就是不關你有木有專案都能運行,
比如:startproject它就是創建專案的命令,肯定是沒有專案也能運行;
詳細用法說明:
-
startproject
# 使用頻次最高,用于專案創建,eg:創建一個名為:cnblogSpider的專案 scrapy strartproject cnblogSpider -
genspider
# 用于創建爬蟲模板,example是spider名稱,生成檔案在spiders下面,也是后面寫爬蟲的地方 # 注意spider名稱不能和專案相同 scrapy genspider example example.com
詳情請參考scrapy命令:scrapy genspider詳解
-
settings
# 查看scray引數設定 scrapy settings --get DOWNLOAD_DELAY # 查看爬蟲的下載延遲 scrapy settings --get BOT_NAME # 爬蟲的名字 -
runspider
運行蜘蛛除了使用前面所說的scrapy crawl XX之外,我們還能用:runspider;
crawl是基于專案運行,runspide是基于檔案運行,
也就是說你按照scrapy的蜘蛛格式撰寫了一個py檔案,如果不想創建專案,就可以使用runspider,eg:撰寫了一個:test.py的蜘蛛,你要直接運行就是:scrapy runspider test.py -
shell
# 這個命令比較重要,主要是除錯用,里面還有很多細節的命令 # 最簡單常用的的就是除錯,查看我們的選擇器到底有木有正確選中某個元素 scrapy shell "https://www.cnblogs.com/qiyeboy/default.html?page=1" # 然后我們可以直接執行response命令, #比如我們要測驗我們獲取標題的選擇器正不正確: response.css("title").extract_first() # 以及測驗xpath路徑選擇是否正確 response.xpath("//*[@id='mainContent']/div/div/div[2]/a/span").extract()

-
fetch
這個命令其實也可以歸結為除錯命令的范疇!它的功效就是模擬我們的蜘蛛下載頁面,也就是說用這個命令下載的頁面就是我們蜘蛛運行時下載的頁面,這樣的好處就是能準確診斷出,我們的到的html結構到底是不是我們所看到的,然后能及時調整我們撰寫爬蟲的策略!舉個栗子,淘寶詳情頁,我們一般看得到,但你如果按常規的方法卻爬不到,為神馬?因為它使用了異步傳輸!因此但你發現獲取不到內容的時候,你就要有所警覺,感覺用fetch命令來吧它的html代碼拿下來看看,到底有木有我們想要的那個標簽節點,如果木有的話,你就要明白我們需要使用js渲染之類的技術!用法很簡單:scrapy fetch http://www.scrapyd.cn就這樣,如果你要把它下載的頁面保存到一個html檔案中進行分析,我們可以使用window或者linux的輸出命令,這里演示window下如下如何把下載的頁面保存:
scrapy fetch http://www.scrapyd.cn >d:/3.html
可以看到,經過這個命令,scrapy下載的html檔案已經被存盤,接下來你就全文找找,看有木有那個節點,木有的話,毫無懸念,使用了異步加載! -
view
# 和fetch類似都是查看spider看到的是否和你看到的一致,便于排錯
scrapy view https://blog.csdn.net/qq_35866846
- version
# 查看scrapy版本
scrapy version
2.2專案命令
專案命令比較簡單,感覺沒什么好說的,我也沒怎么詳細測驗,
直接參考這篇【scrapy 命令列:scrpay專案命令】
3.scrapy框架介紹
Scrapy 是一個用python寫的Crawler Framework,簡單輕巧,并且十分方便,使用Twisted這個一部網路庫來處理網路通信,架構清晰,并包含了各種中間件介面,可以靈活地完成各種需求,整體架構組成如下圖

- Scrapy引擎(Engine): 引擎負責控制資料流在系統的所有組件中流動,并在相應動作發生時觸發事件;
- 調度器(Scheduler): 調度器從引擎接收request 并將他們入隊,以便之后引擎請求request時提供引擎;
- 下載器(Downloader): 下載器負責獲取頁面資料并提供給引擎,而后提供給Spider;
- Spider: Spider是Scrapy用戶撰寫用于分析Response 并提取Item(即獲取到的Item)或額外跟進的URL的類,每個Spider負責處理一個特定(或一些)網站
- Item Pipeline: Item Pipeline 負責處理被Spider提取出來的Item .典型的處理有清理驗證及持久化(例如存盤到資料庫中);
- 下載器中間件(Downloader middlewares): 下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的Response,其提供了一個簡單的機制,通過插入自定義代碼來擴展Scrapy功能;
- Spider中間件(Spider middlwares): Spider中間件是在引擎及Spider之間的特定鉤子(specific hook), 處理Spider的輸入(response)和輸出(items 及request)其中提供了一個簡便的機制,通過插入自定義代碼來實作Scrapy功能,
4.Scrapy中資料流的流轉
-
引擎打開一個網站(open a domain),找到處理該網站的Spider 并向該Spider請求第一個要爬取的URL
-
引擎從Spider中獲取第一個要爬取的URL并通過調度器(Schedule)以Request進行調度
-
引擎向調度器請求下一個要爬取的URL
-
調度器回傳下一個要爬取的URL給引擎,引擎降URL通過下載中間件(請求(request)方向)轉發給下載器(Downloader)
-
一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過下載中間件(回傳(response)方向)發送給引擎
-
引擎從下載器中接收到Response并通過Spider中間件(輸入方向)發送給Spider處理
-
Spider處理Response并回傳爬取到的Item及(跟進的)新的Request給引擎
-
引擎將(Spider回傳的)爬取到的Item 給Item Pipeline,將(Spider回傳的)Request給調度器
-
(從第二步)重復直到調度器中沒有更多的Request,引擎關閉網站
5.第一個scrapy爬蟲
七夜大佬《》的案例專案,由于書買的比較早,里面用的還是python2
自己動手在python3的環境下實作一下
5.1創建專案
# 創建一個名為cnblogSpider 的Scrapy專案
scrapy startproject cnblogSpider

創建好專案之后,直接使用pycharm打開,繼續作業即可
結構性檔案自動生成,把框架填充起來即可

- scrapy.cfg: 專案部署檔案
- cnblogSpider/ : 給專案的python模塊,之后可以在此加入代碼
- cnblogSpider/items.py:專案中的Item檔案
- cnblogSpider/pipelines.py:專案中的Pipelines檔案
- cnblogSpider/settings.py:專案的組態檔
- cnblogSpider/spiders/:放置Spider代碼的目錄
5.2創建爬蟲模塊
from ..items import CnblogspiderItem
class CnblogsSpider(scrapy.Spider):
name = "cnblogs" # 爬蟲的名稱
allowed_domains = ["cnblogs.com"] # 允許的域名
start_urls = [
"https://www.cnblogs.com/qiyeboy/default.html?page=1"
]
def parse(self, response):
# 實作網頁決議
# 首先抽取所有文章
papers = response.xpath("//*[@class='day']")
# 從每篇文章中抽取資料
for paper in papers:
url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
title = paper.xpath(".//*[@class='postTitle']/a/span/text()").extract()[0]
time = paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
# print(url, title, time, content)
item = CnblogspiderItem(url=url, title=title, time=time, content=content)
yield item
next_page = Selector(response).re(u'<a href="(\S*)">下一頁</a>')
if next_page:
yield scrapy.Request(url=next_page[0], callback=self.parse)
5.3定義item
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class CnblogspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url = scrapy.Field()
time = scrapy.Field()
title = scrapy.Field()
content = scrapy.Field()
class newCnblogsItem(CnblogspiderItem):
body = scrapy.Field()
# title = scrapy.Field(CnblogspiderItem.Fields['title'], serializer = my_serializer)
5.4構建Item Pipeline
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import json
from scrapy.exceptions import DropItem
from .items import CnblogspiderItem
class CnblogspiderPipeline(object):
def __init__(self):
self.file = open('papers.json', 'w', encoding='UTF-8')
def process_item(self, item, spider):
if item['title']:
line = json.dumps(dict(item)) + '\n'
# print(type(line))
# self.file.write(line.encode())
# 注意open "wb" 寫入的是位元組流,“w”寫入的是str
# 使用decode 和 encode進行位元組流和str的相互轉化
self.file.write(line)
return item
else:
raise DropItem(f"Missing title in {item}")
5.5 激活Item Pipeline
定制完Item Pipeline ,它是無法作業的需要進行激活,要啟用一個Item Pipeline組件
必須將它的類添加到settings.py中的ITEM_PIPELINES 變數中
自動創建的Scrapy直接把settings.py中的該行取消注釋即可
TEM_PIPELINES 變數中可以配置很多個Item Pipeline組件,分配給每個類的整型值確定了他們的運行順序,item 按數字從低到高的順序通過Item Pipeline,取值范圍0 ~1000
ITEM_PIPELINES = {
'cnblogSpider.pipelines.CnblogspiderPipeline': 300,
}
激活完成后,將命令列切換到專案目錄下執行
scrapy crawl cnblogs

參考資料
【1】書《python爬蟲開發與專案實戰》和 隨書代碼
【2】scrapy1.5中文檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/66681.html
標籤:其他
