廢話不多說妄均,爬取妹子圖片
使用scrapy深度爬取,抓取妹子圖全站圖片
1.首先確認開發(fā)環(huán)境
使用scrapy框架徽千,Python3.6
創(chuàng)建scrapy項目meizitu-scrapy
spiders文件夾里為自己創(chuàng)建的爬蟲文件
run.py為定義的啟動scrapy 命令文件
2. 開發(fā)爬蟲
首先定義item 缸匪,確定自己爬取的數(shù)據(jù)類型
開始開發(fā)爬蟲
由于我們要抓取全站圖片褒纲,所以使用深度爬取准夷,爬蟲繼承的類為crawlspider
這主要是確定爬蟲的爬取起始網(wǎng)址和界限爬取的網(wǎng)址莺掠,
定義鏈接提取規(guī)則衫嵌,scrapy封裝的函數(shù)會將提取的鏈接加入爬取隊列。解析篩選數(shù)據(jù)由callback調(diào)用的parse_item處理彻秆,此處不能使用parse楔绞,重點說明!4蕉摇>贫洹!不能parse函數(shù)T健蔫耽!這是CrawlSpider進行匹配調(diào)用的函數(shù),你要是使用了留夜!rules就沒法進行匹配啦3渍 !
這是妹子圖的單獨一頁碍粥,每頁都有一個列表鳖眼,單獨一個圖集里含有圖集所有圖片,之前鏈接提取的就是下面分頁的鏈接嚼摩。
接下來做的就是將得到的頁面解析钦讳,得到圖集的名稱和圖集的鏈接,也就是parse_item的主要任務(wù)低斋。
此處通過xpath得到列表,在for循環(huán)得到每個圖集的數(shù)據(jù)匪凡,將其封裝到item對象膊畴。由于我們需要進一步獲取圖集的每張圖片的鏈接,所以需要再次爬取病游,爬取圖集鏈接唇跨,得到具體頁面的所有圖片鏈接稠通。
此處調(diào)用img-url函數(shù)處理爬取的結(jié)果,由于需要傳遞數(shù)據(jù)买猖,
此處參考了Scrapy抓取在不同級別Request之間傳遞參數(shù)文章改橘。
流程是這樣的:
在這里遇到一個問題:
如上圖所示,得到封裝后的數(shù)據(jù)玉控。點擊卻發(fā)現(xiàn)得到的image_urls與name和URL不是一個對應(yīng)的圖集的飞主,數(shù)據(jù)封裝產(chǎn)生了混淆。如何解決呢高诺?碌识??
虱而。筏餐。。牡拇。魁瞪。。惠呼。导俘。。罢杉。趟畏。。滩租。赋秀。。律想。猎莲。。技即。著洼。
就是百度。
在CSDN 得到了解決而叼,有人說是參數(shù)傳遞問題
這是由于傳遞的item是淺拷貝身笤,造成數(shù)據(jù)沒有隔離,需要深拷貝來將數(shù)據(jù)隔離葵陵,避免產(chǎn)生混淆液荸。使用深拷貝,保證內(nèi)容的獨立性脱篙。
import copy
yield Request(url,meta={'item':copy.deepcopy(item)},callback=self.img_url)
深度拷貝 copy.deepcopy(),而且copy是在yield傳遞的時候深度拷貝值,不是在接收的時候拷貝娇钱。
到此伤柄,已經(jīng)能將獲得的數(shù)據(jù)獲得到。接下來就是數(shù)據(jù)存儲或者將把圖片弄回本地文搂。
暫時到此适刀,下次再說存儲數(shù)據(jù)庫和下載圖片到本地。