scrapy框架來爬取桌布網站並將圖片下載到本地檔案中
阿新 • • 發佈:2019-09-26
首先需要確定要爬取的內容,所以第一步就應該是要確定要爬的欄位:
首先去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