前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scrapy笔记五 爬取妹子图网的图片 详细解析

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

作者头像
十四君
发布2019-11-27 23:43:09
5330
发布2019-11-27 23:43:09
举报
文章被收录于专栏:UrlteamUrlteamUrlteam

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

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

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

0.创建项目

scrapy startproject meizitu

1.修改item.py

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

# -*- 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

# -*- 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文件不能和项目名同名。

# -*- 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.运行

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实战项目–实践笔记零–项目规划
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-232,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.创建项目
  • 1.修改item.py
  • 2.修改pipelines.py
  • 3.修改settings.py
  • 4.建立 spiders/meizi.py
  • 5.运行
  • 6.检查效果
  • Related posts:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档