闲来无事,做的一个小爬虫项目

爬虫主程序:

 import scrapy
from ..items import MeiziItem class MztSpider(scrapy.Spider):
name = 'mzt'
allowed_domains = ['meizitu.com']
start_urls = ['http://meizitu.com/'] def parse(self, response):
tags = response.xpath(".//*[@class='tags']/span/a")
for i in tags:
item = MeiziItem()
tag_href = i.xpath(".//@href").extract()[0]
tag_name = i.xpath(".//@title").extract()[0]
item['tag_name'] = tag_name
item['tag_href'] = tag_href
#print(item['tag_name'])
#yield item
yield scrapy.Request(url=item['tag_href'], meta={'item': item}, callback=self.parse_page) def parse_page(self, response): item = response.meta['item']
# 进入某个标签后,爬取底部分页按钮
page_lists = response.xpath(".//*[@id='wp_page_numbers']/ul/li")
# 获取底部分页按钮上的文字,根据文字来判断当前标签页下总共有多少分页
page_list = page_lists.xpath('.//text()')
# 如果当前标签页下有多个页面,则再根据第一个按钮是否为“首页”来进行再次提取,因为这里有的页面第一个按钮是首页,有的第一个按钮是“1”
if len(page_lists) > 0:
if page_list[0].extract() == '首页':
page_num = len(page_lists) - 3
else:
page_num = len(page_lists) - 2
else:
page_num = 1 # 根据当前标签页的链接,来拼成带页码的链接
if '_' in item['tag_href']:
index = item['tag_href'][::-1].index('_')
href_pre = item['tag_href'][:-index]
else:
if page_num == 1:
href_pre = item['tag_href'].split('.html')[0]
else:
href_pre = item['tag_href'].split('.html')[0] + '_'
for i in range(1, page_num + 1):
item = response.meta['item']
if page_num == 1:
href = href_pre + '.html'
else:
href = href_pre + str(i) + '.html'
item['page_list'] = href
#yield item
yield scrapy.Request(url=item['page_list'], meta={'item': item}, callback=self.parse_album) def parse_album(self, response):
albums = response.xpath(".//*[@class='pic']")
for album in albums:
item = response.meta['item']
album_href = album.xpath(".//a/@href").extract()[0]
album_name = album.xpath(".//a/img/@alt").extract()[0]
item['album_name'] = album_name
item['album_href'] = album_href
#yield item
yield scrapy.Request(url=item['album_href'], meta={'item': item}, callback=self.parse_img) def parse_img(self, response):
img_list = response.xpath(".//*/p/img")
for img in img_list:
item = response.meta['item']
img_title = img.xpath(".//@alt").extract()[0]
if img_title == '':
for i in range(1, len(img_list + 1)):
img_title = item['album_name'] + '_' + str(i)
else:
img_title = img_title
img_urls = img.xpath(".//@src").extract()
img_src = img.xpath(".//@src").extract()[0]
item['img_title'] = img_title
item['img_src'] = img_src
item['img_urls'] = img_urls
yield item

items设置

 import scrapy

 class MeiziItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 标签名称
tag_name = scrapy.Field()
# 标签链接
tag_href = scrapy.Field()
# 进入某标签后的所有链接,加页码的
page_list = scrapy.Field()
# 图片专辑名称
album_name = scrapy.Field()
# 图片专辑链接
album_href = scrapy.Field()
# 照片标题
img_title = scrapy.Field()
# 照片链接
img_src = scrapy.Field()
# 照片链接集合,用于ImagesPipeline下载图片
img_urls = scrapy.Field()

输出管道:

print('正在爬取...')
print('老湿机,请耐心等待哟...')
class MeiziPipeline(object):
def process_item(self, item, spider):
print('标签名称:',item['tag_name'])
print('标签链接:',item['tag_href'])
print('页码:',item['page_list'])
print('图片专辑名称:',item['album_name'])
print('图片专辑链接:',item['album_href'])
print('照片标题:',item['img_title'])
print('照片链接:',item['img_src'])
print('照片链接集合:',item['img_urls'])
print('----------------')
return item

保存到本地的管道:

import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem class MztImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for image_url in item['img_urls']:
yield scrapy.Request(image_url) def item_completed(self, results, item, info):
image_paths = [x['path'] for ok, x in results if ok]
if not image_paths:
raise DropItem("该Item没有图片")
return item

setting的设置,往setting.py加入

BOT_NAME = 'meizi'

SPIDER_MODULES = ['meizi.spiders']
NEWSPIDER_MODULE = 'meizi.spiders' IMAGES_STORE = r'G:\\mzt' # 图片存储路径
IMAGES_EXPIRES = 90 # 过期天数
IMAGES_MIN_HEIGHT = 100 # 图片的最小高度
IMAGES_MIN_WIDTH = 100 # 图片的最小宽度

爬取的最终结果

本来想把这些图片分门分类的保存,然而不太会,所有的图片全保存在一个文件夹下面,,,

												

Python的scrapy之爬取妹子图片的更多相关文章

  1. scrapy框架爬取妹子图片

    首先,建立一个项目#可在github账户下载完整代码:https://github.com/connordb/scrapy-jiandan2 scrapy startproject jiandan2 ...

  2. 基于python的scrapy框架爬取豆瓣电影及其可视化

    1.Scrapy框架介绍 主要介绍,spiders,engine,scheduler,downloader,Item pipeline scrapy常见命令如下: 对应在scrapy文件中有,自己增加 ...

  3. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  4. Python的scrapy之爬取顶点小说网的所有小说

    闲来无事用Python的scrapy框架练练手,爬取顶点小说网的所有小说的详细信息. 看一下网页的构造: tr标签里面的 td 使我们所要爬取的信息 下面是我们要爬取的二级页面 小说的简介信息: 下面 ...

  5. python爬虫scrapy框架——爬取伯乐在线网站文章

    一.前言  1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...

  6. Python的scrapy之爬取boss直聘网站

    在我们的项目中,单单分析一个51job网站的工作职位可能爬取结果不太理想,所以我又爬取了boss直聘网的工作,不过boss直聘的网站一次只能展示300个职位,所以我们一次也只能爬取300个职位. jo ...

  7. Python的scrapy之爬取豆瓣影评和排名

    基于scrapy框架的爬影评 爬虫主程序: import scrapy from ..items import DoubanmovieItem class MoviespiderSpider(scra ...

  8. Python的scrapy之爬取51job网站的职位

    今天老师讲解了Python中的爬虫框架--scrapy,然后带领我们做了一个小爬虫--爬取51job网的职位信息,并且保存到数据库中 用的是Python3.6  pycharm编辑器 爬虫主体: im ...

  9. python利用scrapy框架爬取起点

    先上自己做完之后回顾细节和思路的东西,之后代码一起上. 1.Mongodb 建立一个叫QiDian的库,然后建立了一个叫Novelclass(小说类别表)Novelclass(可以把一级类别二级类别都 ...

随机推荐

  1. qt中的lineEdit文本输入框的输入类型限制(三种验证类)

    qt的三种验证类: 1.输入int类型 QValidator *validator=new QIntValidator(100,999,this): QLineEdit *edit=new QLine ...

  2. aiohttp模块1 client

    Make a Request import aiohttp async with aiohttp.ClientSession() as session: async with session.get( ...

  3. 面向切面编程-AOP的介绍

    AOP简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象 ...

  4. web中的cookie管理

    本篇是以JSP为背景介绍,但是在web开发中也是相同的原理. 什么是cookie 由于http是一种无状态的协议,因此服务器收到请求后,只会当做一次新的请求.即便你重复发送了1000次同样的请求,这1 ...

  5. C语言 数组的使用

    #include <stdio.h> // 数组的定义和存储 void test1() { ]; // 64bit环境下占用4*5=20个字节 // 计算数组占据的存储空间 // size ...

  6. 前端HTML5几种存储方式

    h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大小是4k之内.主Domain污染. 主要应用:购物车.客户登录 对于IE浏览器有UserData,大小是64k,只有IE ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 A、Saving Tang Monk II 【状态搜索】

    任意门:http://hihocoder.com/problemset/problem/1828 Saving Tang Monk II 时间限制:1000ms 单点时限:1000ms 内存限制:25 ...

  8. PAML学习一

    前言 模式识别起源于工程,而机器学习从计算机科学中产生.然而这两者被看做同一领域的两方面,过去十年里他们获得了极大的发展.特别是,贝叶斯方法已经发展成主流,而图模型已经被融入用于描述和应用概率模型的通 ...

  9. lucene&solr学习——索引维护

    1.索引库的维护 索引库删除 (1) 全删除 第一步:先对文档进行分析 public IndexWriter getIndexWriter() throws Exception { // 第一步:创建 ...

  10. Python 学习笔记(七)Python字符串(三)

    常用字符串方法 split()  分割字符串,指定分隔符对字符串进行分割 join()   将序列中的元素以指定的字符连接生成一个新的字符串 str.strip() 用于移除字符串头尾指定的字符(默认 ...