1. 程式人生 > >scrapy框架來爬取桌布網站並將圖片下載到本地檔案中

scrapy框架來爬取桌布網站並將圖片下載到本地檔案中

首先需要確定要爬取的內容,所以第一步就應該是要確定要爬的欄位:

  首先去items中確定要爬的內容

class MeizhuoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 圖集的標題
    title = scrapy.Field()
    # 圖片的url,需要來進行圖片的抓取
    url = scrapy.Field()
    pass

 

在確定完要爬的欄位之後,就是分析網站頁面的請求了,找到自己需要的內容,我這裡爬的是http://www.win4000.com裡面的桌布照片

   首先我們在分析的時候,點到一個圖集裡面可以發現,真正的照片都在這裡面,所以我們分成兩步走

    1、找到所有圖集的url

    2、根據指定的圖集的url來將裡面所有照片的URL找出來

      但是找出照片的url之後又面臨一個問題,那就是那個url並不是我們真正想要的,它在最後還加了一層修飾,所以我們還要對這個url進一步的操作

# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from fake_useragent import UserAgent
from meizhuo.items import MeizhuoItem

headers = {
    'user-agent': UserAgent(verify_ssl=False).chrome
}


class MzSpider(scrapy.Spider):
    name = 'mz'
    allowed_domains = ['www.win4000.com']
    start_urls = [
        'http://www.win4000.com/wallpaper_2285_0_0_1.html',
        'http://www.win4000.com/wallpaper_204_0_0_1.html'
    ]

    def parse(self, response):
        sel = Selector(response)
        list = sel.xpath('//*[@class="list_cont Left_list_cont"]/div/div/div/ul/li/a')

        for img in list:
            # 這個是每個圖集得到的url
            url = img.xpath('@href').extract_first()
            title = img.xpath('@title').extract_first()
            # 對我的每一個URL進行解析
            yield scrapy.Request(url, callback=self.get_all_img, meta={'title': title})
        # 對於下一頁進行定位,如果存在就進行跳轉
        next_url = sel.xpath('//*[@class="next"]/@href').extract_first()
        if next_url is not None:
            yield scrapy.Request(next_url, callback=self.parse)

    def get_all_img(self, response):
        item = MeizhuoItem()

        container = []
        sel = Selector(response)
        # 這個是所有照片的所有的總共的頁數
        img_list = sel.xpath('//*[@class="scroll-img-cont"]/ul')
        for img in img_list:
            img_url = img.xpath('li/a/img/@data-original').extract()
            for url in img_url:
                # 這個url還是需要經過處理的,所以要迴圈出來挨個進行修改
                cmp_url = url.split('_')[0] + '.jpg'
                container.append(cmp_url)
            item['url'] = container
            item['title'] = response.meta['title']
            # print(container)

            yield item
            container.clear()

 

 

當我們將圖集中的所有照片的url找出來之後要做的,就是將圖片下載到本地中,所以我們就在pipelines中配置了相關的下載路徑的配置,然後利用抓取到的圖片的url和rqeuests的模組的配合使用,來獲取到圖片真正的二進位制的資料,然後將這些二進位制資料,寫入到你配置的指定的資料夾中,

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import os
import requests
from meizhuo.settings import IMAGES_STORE
from fake_useragent import UserAgent

headers = {
    'user-agent': UserAgent(verify_ssl=False).chrome
}


class MeizhuoPipeline(object):
    def process_item(self, item, spider):
        dir_path = IMAGES_STORE
        title = item['title']
        img_list = item['url']
        print(title, img_list)
        """
        1、我要建立指定的路徑
        2、然後我要利用requests模組獲取到那一個url的二進位制資料儲存進去
        """
        if not os.path.exists(IMAGES_STORE):
            os.mkdir(IMAGES_STORE)

        # 如果這個頂標頭檔案夾存在的話
        collection_url = os.path.join(IMAGES_STORE, title)
        print('111', collection_url)
        if not os.path.exists(collection_url):
            os.mkdir(collection_url)
        for url_list in range(len(img_list)):
            cmp_url = os.path.join(collection_url, img_list[url_list])

            # print(cmp_url)
            file_path = os.path.join(collection_url, title) + str(url_list) + '.jpg'
            print(file_path)
            with open(file_path, 'wb') as fp:
                res = requests.get(img_list[url_list], headers=headers).content
                # print(img_list[url_list])
                fp.write(res)
                print('insert successfully!!!')

 

 

最後就是要講一下,在settings中的相關配置:

BOT_NAME = 'meizhuo'

SPIDER_MODULES = ['meizhuo.spiders']
NEWSPIDER_MODULE = 'meizhuo.spiders'
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {
   'meizhuo.pipelines.MeizhuoPipeline': 300,
}
# 下載的頂頭路徑
IMAGES_STORE = '/Users/mac/Documents/girl'
# 下載延遲
DOWNLOAD_DELAY = 0.3