这部分相当有用,咱们不多说,目前是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:
- Scrapy-笔记一 入门项目 爬虫抓取w3c网站
- Scrapy-笔记二 中文处理以及保存中文数据
- Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
- Scrapy笔记四 自动爬取网页之使用CrawlSpider
- Scrapy笔记零 环境搭建与五大组件架构
- 基于百度IP定位的网站访问来源分析的python实战项目–实践笔记零–项目规划