Scrapy爬取美女圖片 (原創)


   有半個月沒有更新了,最近確實有點忙。先是華為的比賽,接着實驗室又有項目,然后又學習了一些新的知識,所以沒有更新文章。為了表達我的歉意,我給大家來一波福利。。。(我的新書《Python爬蟲開發與項目實戰》出版了,大家可以看一下樣章

 

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

    

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

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

 

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

 

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

 

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

 

 

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

 

 

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

 

 

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

  

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

 

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

 

  

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

 

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

 

 

 

上圖就是工程的結構。

 

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

 

        items.py -----------------對要爬取數據的模型定義

 

        pipelines.py-------------咱們最終要存儲的數據

 

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

 

        接下來我把代碼貼一下:

jiandanSpider.py:

#coding:utf-8
import scrapy
from jiandan.items import JiandanItem

from scrapy.crawler import CrawlerProcess

class jiandanSpider(scrapy.Spider):
    name = 'jiandan'
    allowed_domains = []
    start_urls = ["http://jandan.net/ooxx"]
    
    def parse(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 -*-

import os
import urllib

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。。。

 

 

 

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

 

歡迎大家支持我公眾號:   

 本文章屬於原創作品,歡迎大家轉載分享。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM