摘要:爬取妹子圖的實(shí)例打算分成三部分來寫,嘗試完善實(shí)用性。中的每一個(gè)子項(xiàng)都是一個(gè)標(biāo)簽。這個(gè)說明的前提是不自定義當(dāng)爬蟲完成的模型數(shù)據(jù)采集后,會(huì)自動(dòng)將發(fā)送給處理。
0. 前言
這是一個(gè)利用python scrapy框架爬取網(wǎng)站圖片的實(shí)例,本人也是在學(xué)習(xí)當(dāng)中,在這做個(gè)記錄,也希望能幫到需要的人。爬取妹子圖的實(shí)例打算分成三部分來寫,嘗試完善實(shí)用性。
系統(tǒng)環(huán)境System Version:Ubuntu 16.04
Python Version:3.5.2
Scrapy Version:1.5.0
可參考《Python爬蟲 - scrapy - 爬取豆瓣電影TOP250》
我建立的項(xiàng)目名稱為:spider_meizitu
2. items文件<項(xiàng)目目錄>/spider_meizitu/items.py
import scrapy class SpiderMeizituItem(scrapy.Item): images = scrapy.Field() image_urls = scrapy.Field()
注意:這里的SpiderMeizituItem名字是可以改的,但是images和image_urls兩個(gè)變量名稱暫時(shí)不要改,原因后面說。3. 爬蟲文件 3.1 完整文件
<項(xiàng)目目錄>/spider_meizitu/spiders/meizitu.py
from scrapy import Request from scrapy.spiders import Spider from spider_meizitu.items import SpiderMeizituItem class MeizituSpider(Spider): #爬蟲名稱 name = "meizitu" #開始的url start_urls = { "http://www.meizitu.com/a/sexy.html" } #處理函數(shù) def parse(self, response): meizi_titles = response.xpath("http://ul[@class="wp-list clearfix"]/li") for meizi_title in meizi_titles: meizi_url = meizi_title.xpath(".//h3[@class="tit"]/a/@href").extract()[0] yield Request(meizi_url,callback=self.parse_meizi_pic) #處理函數(shù)跳轉(zhuǎn) def parse_meizi_pic(self,response): item = SpiderMeizituItem() meizitu_pics = response.xpath("http://div[@id="picture"]/p/img") for meizitu_pic in meizitu_pics: item["images"] = meizitu_pic.xpath(".//@alt").extract()[0].split(",")[0] item["image_urls"] = meizitu_pic.xpath(".//@src").extract() yield item3.2 詳細(xì)說明
name和start_urls就不說了,略過。
parse函數(shù)首先看一下妹子圖網(wǎng)站的結(jié)構(gòu),打開我們的start_urls。
前端頁面:
再看源碼:
可以看到,所有的圖片項(xiàng)目是在一個(gè)標(biāo)簽下的標(biāo)簽。而每個(gè)圖片的鏈接打開后會(huì)進(jìn)入一個(gè)新的頁面,那里才是我們要下載的圖片。所以,第一步,要解析這些頁面鏈接,下面這段代碼建立了一個(gè)標(biāo)簽的集合。
meizi_titles = response.xpath("http://ul[@class="wp-list clearfix"]/li")
meizi_titles中的每一個(gè)子項(xiàng)都是一個(gè)標(biāo)簽。接下來在meizi_titles集合中做迭代循環(huán),繼續(xù)解析標(biāo)簽中的內(nèi)容。
for meizi_title in meizi_titles:
看下標(biāo)簽中的源碼:
注意,第一個(gè)img連接中的limg.jpg只是縮略圖,并不是我們想要的內(nèi)容。標(biāo)簽中的連接才是后面的頁面,我們要把這個(gè)鏈接解析出來。
meizi_url = meizi_title.xpath(".//h3[@class="tit"]/a/@href").extract()[0]
解析完成后,我們要爬蟲請(qǐng)求新的頁面,那里才有我們需要的圖片:
yield Request(meizi_url,callback=self.parse_meizi_pic)
這里的callback參數(shù)將頁面請(qǐng)求結(jié)果發(fā)送給了當(dāng)前class下面的parse_meizi_pic函數(shù)。解析過程與前面的頁面大同小異,不細(xì)說了。
唯一需要說明的是item["image_urls"]中存儲(chǔ)的變量必須是list類型的,如果不是,后期在pipeline處理時(shí)會(huì)報(bào)錯(cuò),無法解析url。(這個(gè)說明的前提是不自定義 ImagesPipeline)
當(dāng)爬蟲完成item的模型數(shù)據(jù)采集后,scrapy會(huì)自動(dòng)將item發(fā)送給Pipeline處理。
4. settings.py<項(xiàng)目目錄>/spider_meizitu/settings.py需要修改的項(xiàng)目
ITEM_PIPELINES = { "scrapy.contrib.pipeline.images.ImagesPipeline": 1, } #圖片存儲(chǔ)路徑,根據(jù)自己的情況修改 IMAGES_STORE = "/home/sftp_root/spider_meizitu/meizitu" #一些USER_AGENT USER_AGENT_LIST = [ "zspider/0.9-dev http://feedback.redkolibri.com/", "Xaldon_WebSpider/2.0.b1", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0) AddSugarSpiderBot www.idealobserver.com", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)", "Mozilla/5.0 (compatible; Speedy Spider; http://www.entireweb.com/about/search_tech/speedy_spider/)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.11096.400", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0" "Nusearch Spider (www.nusearch.com)", "nuSearch Spider (compatible; MSIE 4.01; Windows NT)", "lmspider (lmspider@scansoft.com)", "lmspider lmspider@scansoft.com", "hl_ftien_spider_v1.1", "hl_ftien_spider", "everyfeed-spider/2.0 (http://www.everyfeed.com)", "envolk[ITS]spider/1.6 (+http://www.envolk.com/envolkspider.html)", "envolk[ITS]spider/1.6 ( http://www.envolk.com/envolkspider.html)", "Baiduspider+(+http://www.baidu.com/search/spider_jp.html)", "Baiduspider+(+http://www.baidu.com/search/spider.htm)", "BaiDuSpider", ] #隨機(jī)發(fā)送UserAgent DOWNLOADER_MIDDLEWARES = { "spider_meizitu.middlewares.RandomUserAgentMiddleware": 400, } #每次下載圖片的延遲時(shí)間 DOWNLOAD_DELAY = 3
特別需要說明的是ITEM_PIPELINES參數(shù)。如果你看過其他的下載圖片的爬蟲文章,應(yīng)該注意到我沒有寫自己的Pipeline。如果將ITEM_PIPELINES內(nèi)容指定為scrapy.contrib.pipeline.images.ImagesPipeline,那么在spider完成item采集后,Scrapy會(huì)自動(dòng)開啟系統(tǒng)默認(rèn)的ImagesPipeline處理通道,這也是之前定義item的時(shí)候,images和image_urls兩個(gè)參數(shù)名稱不能更改的原因。具體內(nèi)容可參考官方文檔下載項(xiàng)目圖片章節(jié)5. middlewares.py
<項(xiàng)目目錄>/spider_meizitu/middlewares.py
from spider_meizitu.settings import USER_AGENT_LIST import random class RandomUserAgentMiddleware(): def process_request(self, request, spider): ua = random.choice(USER_AGENT_LIST) if ua: request.headers.setdefault("User-Agent", ua)
在這個(gè)實(shí)例中,middlewares的唯一功能就是想web服務(wù)器發(fā)送隨機(jī)的USER_AGENT
6. 執(zhí)行結(jié)果 后續(xù)計(jì)劃 Lv2 爬取多頁面的妹子圖 Lv3 嘗試更改圖片文件名,并分目錄存儲(chǔ)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41407.html
摘要:前言這個(gè)文章是延續(xù)之前爬取妹子圖的延續(xù),之前的爬蟲可以爬取一個(gè)頁面的圖片,爬取一次大概張圖片的樣子,按照之前的計(jì)劃,本次要進(jìn)一步完善爬蟲,爬取妹子圖全網(wǎng)圖片。做完上述改動(dòng)后,爬蟲運(yùn)行基本正常,但是爬取的速度有點(diǎn)慢,個(gè)小時(shí)大概爬取了張圖片。 0. 前言 這個(gè)文章是延續(xù)之前《爬取妹子圖 Lv1》的延續(xù),之前的爬蟲可以爬取一個(gè)頁面的圖片,爬取一次大概400張圖片的樣子,按照之前的計(jì)劃,本次要...
摘要:很多人學(xué)習(xí)爬蟲的第一驅(qū)動(dòng)力就是爬取各大網(wǎng)站的妹子圖片,比如比較有名的。最后我們只需要運(yùn)行程序,即可執(zhí)行爬取,程序運(yùn)行命名如下完整代碼我已上傳到微信公眾號(hào)后臺(tái),在癡海公眾號(hào)后臺(tái)回復(fù)即可獲取。本文首發(fā)于公眾號(hào)癡海,后臺(tái)回復(fù)即可獲取最新編程資源。 showImg(https://segmentfault.com/img/remote/1460000016780800); 閱讀文本大概需要 1...
摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:學(xué)習(xí)網(wǎng)站爬蟲,整站爬取妹子圖定義爬取的內(nèi)容的編寫提供了一種便捷的方式填充抓取到的是頁面源代碼,載入每個(gè)連接,用屬性請(qǐng)求連接,返回請(qǐng)求獲取頁碼集合打印頁碼如果頁碼集合圖片連接讀取頁碼集合的倒數(shù)第二個(gè)頁碼圖片連接替換成空返回請(qǐng)求用載 學(xué)習(xí)網(wǎng)站:爬蟲,整站爬取妹子圖 1.item.py(定義爬取的內(nèi)容) import scrapy class MeizituItem(scrapy.Ite...
摘要:爬取百思不得姐首先一步一步來,我們先從爬最簡(jiǎn)單的文本開始。將百思不得姐段子保存到中別忘了將管道加到配置文件中。雖然我只是簡(jiǎn)單的爬了百思不得姐,不過這些方法可以應(yīng)用到其他方面,爬取更多更有用的數(shù)據(jù)。 前一篇文章介紹了很多關(guān)于scrapy的進(jìn)階知識(shí),不過說歸說,只有在實(shí)際應(yīng)用中才能真正用到這些知識(shí)。所以這篇文章就來嘗試?yán)胹crapy爬取各種網(wǎng)站的數(shù)據(jù)。 爬取百思不得姐 首先一步一步來,我...
閱讀 2096·2021-11-23 09:51
閱讀 2839·2021-11-22 15:35
閱讀 2937·2019-08-30 15:53
閱讀 1038·2019-08-30 14:04
閱讀 3276·2019-08-29 12:39
閱讀 1802·2019-08-28 17:57
閱讀 1086·2019-08-26 13:39
閱讀 551·2019-08-26 13:34