目錄
1.選取目标站點
目标站點分析
2.流程架構
3.爬蟲實戰
建立項目
建立spider
輸出調試資訊
4.抓取:
1.分析源代碼
2.爬取中的存儲(資料結構)
3.定義解析的方法
3.指令行互動模式
4.指派
5.翻頁
6.儲存
1.選取目标站點
目标站點分析
http://quotes.toscrape.com/:scrapy官方提供的抓取網站
顯示名人名言,作者,标簽等資訊
翻頁為最簡單的GET請求,通過改變URL的名稱進行翻頁
網頁結構簡單,沒有任何的反爬蟲措施
2.流程架構
抓取第一頁
請求第一頁的URL并得到源代碼,進行下一步的分析
擷取内容和下一頁連結
分析源代碼,提取首頁内容,擷取下一頁連結等待進一步擷取
翻頁提取
請求下一頁資訊,分析内容并請求再下一頁連結
儲存爬取結果
将爬取結果儲存為特定格式如文本,資料庫
3.爬蟲實戰
在指令行中輸入scrapy會輸出提示
建立項目
scrapy startproject quotetutorial
會在目前目錄生成項目檔案
cd quotetutorial 進入項目檔案夾
scrapy.cfg:配置檔案,定義scrapy一些相關的部署資訊
建立spider
scrapy genspider quotes quotes.toscrape.com
quotes:spider名稱
quotes.toscrape.com:需要爬取網站的域名
scrapy.cfg
items.py:儲存資料的資料結構
middlewares.py:在爬取過程中定義的中間件,用來處理request,response和exceptions等操作,可以在其中修改request,response和exceptions的相關配置
pipelines.py:項目管道,用來輸出一些items
settings.py:定義配置資訊
主要運作代碼在spiders檔案夾中
解析的操作在parse函數中
scrapy crawl quotes:執行spider
輸出調試資訊
info:提示資訊
scrapy.utils.log:顯示已啟動
2019-06-01 19:34:39 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: firstscrapy)
scrapy.crawler:settings
Overridden settings: {'BOT_NAME': 'firstscrapy', 'NEWSPIDER_MODULE': 'firstscrapy.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['firstscrapy.spiders']}
scrapy.middleware:中間件(下載下傳中間件:downloadermiddlewares;爬蟲中間件:spidermiddlewares)
INFO: Spider opened:調用spider,開始抓取
2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2019-06-01 19:34:41 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)
首先尋找robots.txt,沒有傳回狀态碼404,随後通路首頁正常為200
statscollectors:輸出爬取資訊
quotes.py
改寫代碼:parse:請求完成後預設調用的方法/預設回調
eg:
def parse(self, response):
print(response.text)
請求成功後将response的内容列印出來
4.抓取:
1.分析源代碼
内容:text
作者:author
标簽:tags(tags數量不固定,有幾個抓幾個)
2.爬取中的存儲(資料結構)
items.py
定義field變量指派,作為一個整體生成
3.定義解析的方法
quotes.py
11:定義選擇每個區塊
之後周遊每個區塊,進一步篩選
13:聲明對象
::text:選擇标簽内的文本内容
extract_first():拿到裡面的文本内容
extract():把所有結果都找出來,類似于find和findall
3.指令行互動模式
scrapy shell quotes.toscrape.com
進入到互動模式下,可以進行一些相關的調試
爬取到的quotes為list格式,每一項為selector選擇器
同為list
同為list,data類型為str
傳回清單,内容為文本
傳回第一個值
若為tags,就需要用extract()擷取所有的标簽
4.指派
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item#将item生成出來
再次運作,即可完成單頁索引資訊的爬取
5.翻頁
1.可通過改變URL來完成翻頁
2.在next中對應着下一頁的超連結,從網頁代碼中擷取
提取:
next = response.css('.pager .next a::attr(href)').extract_first()
attr():擷取屬性的内容
補全為完整的URL:
url = response.urljoin(next)
urljoin():補全URL
生成request,實作翻頁循環:
url = response.urljoin(next)
callback:回調函數,定義response請求之後誰來處理
6.儲存
儲存為json格式
scrapy crawl quotes -o quotes.json
生成json檔案并儲存在項目目錄下
儲存為jl格式
scrapy crawl quotes -o quotes.jl
将結果儲存為一行一行的格式,一行為一個item
儲存為csv格式
scrapy crawl quotes -o quotes.csv
儲存為xml格式
scrapy crawl quotes -o quotes.xml
其他格式同改字尾即可,如pickle,marshal等
儲存至FTP伺服器
scrapy crawl quotes -o ftp://user:[email protected]/path/quotes.csv
pipelines
在儲存前需要做item的處理,如在解析完後有些item不是我們想要的,如要将item儲存到資料庫裡需要借助pipelines工具。
eg:限制名言的長度,如果大于50将後面的變為省略号
pipelines.py
class TextPipeline(object):
def __init__(self):
self.limit = 50
def process_item(self, item, spider):
if item['text']:
if len(item['text']) > self.limit:
item['text'] = item['text'][0:self.limit].rstrip() + '. . .'
else:
return DropItem('Missing Text')
儲存至MongoDB資料庫
pipelines中:
class MongoPipeline(object):
def __init__(self):
self.mongo_uri = 'localhost'
self.mongo_db = 'quotestutorial'
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self, item, spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self, spider):
self.client.close()
settings.py中:
ITEM_PIPELINES = {
'firstscrapy.pipelines.TextPipeline': 300,
'firstscrapy.pipelines.MongoPipeline': 400,
}
儲存結果