Scrapy笔记五 爬取妹子图网的图片 详细解析

2019-11-27 23:43:09 浏览数 (1)

这部分相当有用,咱们不多说,目前是2016.6.22日亲测可用.环境方面是linux_ubuntu_15.04 python_scrapy的环境搭建有问题请看之前的scrapy笔记

代码在:github  https://github.com/luyishisi/WebCrawlers/tree/master/scrapy_code/meizitu

先上最终截图,有动力好好学习了没?

0.创建项目

代码语言:javascript复制
scrapy startproject meizitu

1.修改item.py

代码语言:javascript复制
import scrapy
 
class MeizituItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url = scrapy.Field()
    name = scrapy.Field()
    tags = scrapy.Field()
    image_urls = scrapy.Field()
    images = scrapy.Field()

2.修改pipelines.py

代码语言:javascript复制
# -*- coding: utf-8 -*-
 
#图片下载部分(自动增量)
import requests
from meizitu import settings
import os
 
#图片下载类
class ImageDownloadPipeline(object):
    def process_item(self, item, spider):
        if 'image_urls' in item:#如果‘图片地址’在项目中
            images = []#定义图片空集
            
            dir_path = '%s/%s' % (settings.IMAGES_STORE, spider.name)
 
            #建立目录名字和项目名称一致
            if not os.path.exists(dir_path):
                os.makedirs(dir_path)
    
            #根据item字典进行查询   
            for image_url in item['image_urls']:
                us = image_url.split('/')[3:]
                image_file_name = '_'.join(us)
                file_path = '%s/%s' % (dir_path, image_file_name)
                images.append(file_path)
 
            #如果这个文件存在则跳过
                if os.path.exists(file_path):
                    continue
            #进行图片文件写入,wb模式打开文件,然后requests.get获取图片流,
                with open(file_path, 'wb') as handle:
                    response = requests.get(image_url, stream=True)
                    for block in response.iter_content(1024):
                        #获取的流如果有不存在的,则使用break结束,如果没有一次结束则进行写入
                        if not block:
                            break
 
                        handle.write(block)
 
            item['images'] = images
            #即使注释了也一样效果,不知道为何
        return item

3.修改settings.py

代码语言:javascript复制
# -*- coding: utf-8 -*-
 
BOT_NAME = 'meizitu'
 
SPIDER_MODULES = ['meizitu.spiders']
NEWSPIDER_MODULE = 'meizitu.spiders'
 
#载入ImageDownLoadPipeline类
ITEM_PIPELINES = {'meizitu.pipelines.ImageDownloadPipeline': 1}
#图片储存
IMAGES_STORE = 

4.建立 spiders/meizi.py

注意这里名字不可以和项目文件夹的名字一样就是说不可以是meizitu。否则会报错

原scrapy ImportError: No module named items

ImportError: No module named items

spiders 目录中的.py文件不能和项目名同名。

代码语言:javascript复制
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
#Item Loaders提供了一种便捷的方式填充抓取到的 :Items
from scrapy.contrib.loader import ItemLoader, Identity
from meizitu.items import MeizituItem
 
class MeiziSpider(scrapy.Spider):
    name = "meizi"
    allowed_domains = ["meizitu.com"]
    start_urls = (
        'http://www.meizitu.com/',
    )
 
    def parse(self, response):
        #sel是页面源代码,载入scrapy.selector
        sel = Selector(response)
        #每个连接,用@href属性
        for link in sel.xpath('//h2/a/@href').extract():
            #请求=Request(连接,parese_item)
            request = scrapy.Request(link, callback=self.parse_item)
            yield request#返回请求
        #获取页码集合
        pages = sel.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
        print('pages: %s' % pages)#打印页码
        if len(pages) > 2:#如果页码集合>2
            page_link = pages[-2]#图片连接=读取页码集合的倒数第二个页码
            page_link = page_link.replace('/a/', '')#图片连接=page_link(a替换成空)
            request = scrapy.Request('http://www.meizitu.com/a/%s' % page_link, callback=self.parse)
            yield request#返回请求
 
    def parse_item(self, response):
        #l=用ItemLoader载入MeizituItem()
        l = ItemLoader(item=MeizituItem(), response=response)
        #名字
        l.add_xpath('name', '//h2/a/text()')
        #标签
        l.add_xpath('tags', "//div[@id='maincontent']/div[@class='postmeta  clearfix']/div[@class='metaRight']/p")
        #图片连接
        l.add_xpath('image_urls', "//div[@id='picture']/p/img/@src", Identity())
        #url
        l.add_value('url', response.url)
        
        return l.load_item()

5.运行

代码语言:javascript复制
scrapy crawl meizi

6.检查效果

在执行命令的这个目录下就可以看到啦一个meizi的文件夹

原创文章,转载请注明: 转载自URl-team

本文链接地址: Scrapy笔记五 爬取妹子图网的图片 详细解析

Related posts:

  1. Scrapy-笔记一 入门项目 爬虫抓取w3c网站
  2. Scrapy-笔记二 中文处理以及保存中文数据
  3. Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
  4. Scrapy笔记四 自动爬取网页之使用CrawlSpider
  5. Scrapy笔记零 环境搭建与五大组件架构
  6. 基于百度IP定位的网站访问来源分析的python实战项目–实践笔记零–项目规划

0 人点赞