Scrapy爬取圖片

? ? ?有半個月沒有更新了,最近確實有點忙。先是華為的比賽,接著實驗室又有項目,然后又學習了一些新的知識,所以沒有更新文章。為了表達我的歉意,我給大家來一波福利。。。(我的新書《Python爬蟲開發(fā)與項目實戰(zhàn)》發(fā)布了,大家在這里可以看到樣章


? ? ? 今天咱們說的是爬蟲框架。之前我使用python爬取慕課網的視頻,是根據(jù)爬蟲的機制,自己手工定制的,感覺沒有那么高大上,所以我最近玩了玩 python中強大的爬蟲框架Scrapy。

? ? ? ?Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,并且非常方便。Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通訊,架構清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:


? ? ? 綠線是數(shù)據(jù)流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的“下一頁”的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數(shù)據(jù),它們則被送到 Item Pipeline 那里,那是對數(shù)據(jù)進行后期處理(詳細分析、過濾、存儲等)的地方。另外,在數(shù)據(jù)流動的通道里還可以安裝各種中間件,進行必要的處理。

? ? ?簡要介紹了Scrapy的工作流程,咱們開始直奔主題,使用Scrapy爬取美女圖片。

? ? ?大家注意今天不是講Scrapy基礎教程,咱們在之后的七夜音樂臺開發(fā)的時候會講解。所以咱們今天直接上手。

? ? ?以煎蛋網(http://jandan.net)為例子:



咱們來到煎蛋網首頁,其中有一個欄目是妹子,今天的目標就是它。



圖片的分類是按頁進行排列,咱們要爬取所有的圖片需要模擬翻頁。


打開火狐中的firebug,審查元素。



這是咱們需要的圖片鏈接,只要獲取這個鏈接,進行下載就可以了。

咱們看看翻頁后的鏈接是什么???



咱們只要解析出紅線圈出的這個標簽,就可以知道下一頁的鏈接了,就是這么簡單。好了,這時候就可以寫代碼了。。。

打開cmd,輸入scrapy startproject jiandan,這時候會生成一個工程,然后我把整個工程復制到pycharm中(還是使用IDE開發(fā)快)。



上圖就是工程的結構。

jiandanSpider.py ------Spider 蜘蛛

items.py -----------------對要爬取數(shù)據(jù)的模型定義

pipelines.py-------------咱們最終要存儲的數(shù)據(jù)

settings.py----------------對Scrapy的配置

接下來我把代碼貼一下:

jiandanSpider.py:

#coding:utf-8

import scrapy

from jiandan.items ? import ?JiandanItem

fromscrapy.crawler ?import ?CrawlerProcess

class ?jiandanSpider(scrapy.Spider):

name ='jiandan'

allowed_domains = []

start_urls = ["http://jandan.net/ooxx"]

defparse(self, response):

item = JiandanItem()

item['image_urls'] = response.xpath('//img//@src').extract()#提取圖片鏈接

# print 'image_urls',item['image_urls']

yield ?item

new_url= response.xpath('//a[@class="previous-comment-page"]//@href').extract_first()#翻頁

# print 'new_url',new_url

if new_url:

yield ?scrapy.Request(new_url,callback=self.parse)


items.py :

# -*- coding: utf-8 -*-

import ?scrapy

class ?JiandanItem(scrapy.Item):

# define the fields for your item here like:

image_urls=scrapy.Field()#圖片的鏈接


pipelines.py:

# -*- coding: utf-8 -*-

importos

importurllib

from jiandan ?import ?settings

class ?JiandanPipeline(object):

def ?process_item(self, item, spider):

dir_path='%s/%s'%(settings.IMAGES_STORE,spider.name)#存儲路徑

print'dir_path',dir_path

if not ?os.path.exists(dir_path):

os.makedirs(dir_path)

for image_url in ?item['image_urls']:

list_name=image_url.split('/')

file_name=list_name[len(list_name)-1]#圖片名稱

# print 'filename',file_name

file_path='%s/%s'%(dir_path,file_name)

# print 'file_path',file_path

if ?os.path.exists(file_name):

continue

with ?open(file_path,'wb') as file_writer:

conn=urllib.urlopen(image_url)#下載圖片

file_writer.write(conn.read())

file_writer.close()

return item


settings.py:

# -*- coding: utf-8 -*-

# Scrapy settings for jiandan project

#

# For simplicity, this file contains only settings considered important or

# commonly used. You can find more settings consulting the documentation:

#

#http://doc.scrapy.org/en/latest/topics/settings.html

#http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html

#http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME='jiandan'

SPIDER_MODULES=['jiandan.spiders']

NEWSPIDER_MODULE='jiandan.spiders'

ITEM_PIPELINES={

'jiandan.pipelines.JiandanPipeline':1,

}

IMAGES_STORE='E:'

DOWNLOAD_DELAY=0.25


最后咱們開始運行程序,cmd切換到工程目錄,

輸入scrapy crawl jiandan,啟動爬蟲。。。


大約20分鐘左右,爬蟲工作結束。。。


咱們去看看美女圖吧,居然有1.21G。。。



今天的分享就到這里,如果大家覺得還可以呀,記得打賞呦。


感謝大家的關注,加我的微信,咱們進行交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容