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

爬虫主程序:

 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. c++类模板成员函数报错

    类模板成员函数要不就在类模板中实现,要不就和类模板写在同一个文件中. 否则然会出现下面错误: >main.obj : error LNK2019: 无法解析的外部符号 "public: ...

  2. 第一次团队Scrum

                                    长大一条龙之成绩查询 一.项目介绍             本项目的意义在于锻炼团队的scrum能力,加强团队合作能力.确定本项目采用的 ...

  3. LA 4731 蜂窝网络

    题目链接:https://vjudge.net/problem/UVALive-4731 题意: n 个 数,分成 w 组,求整个区间的数学期望的最小值: 一个区间的数学期望公式给出:一个区间的和 * ...

  4. EXCRT

    是个好东西,可以处理在模数不互质的同余方程组 核心就是用扩欧来合并方程 如果我们有两个形如\(x\equiv b_1(mod\ a_1)\) \(x\equiv b_2(mod\ a_2)\)的方程我 ...

  5. fast、faster中ap值的计算

    def voc_ap(rec, prec, use_07_metric=False): """ ap = voc_ap(rec, prec, [use_07_metric ...

  6. SignalR集成Autofac

    SignalR SignalR集成需要 Autofac.SignalR NuGet 包. SignalR 集成提供SignalR 集线器的依赖集成.由于 SignalR 是内部构件,所以不支持Sign ...

  7. 【洛谷P1083】[NOIP2012]借教室

    借教室 [题目描述] 在n天中每天有一个可以借出的教室数,有m个订单,每个订单从第l天到第r天要借用x个教室.问能否满足所有的订单,若不能,输出第一个不能满足的订单编号. 思路: 1.1 ≤ n,m ...

  8. 【luogu P2880 [USACO07JAN]平衡的阵容Balanced Lineup】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2880 是你逼我用ST表的啊qaq #include <cstdio> #include < ...

  9. Spring Boot应用的测试——Mockito

    Spring Boot应用的测试——Mockito Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试:生成测试数据初始化数据库用于测试:Spring ...

  10. etcd客户端c#

    etcd是什么东西就不介绍了,自己网上搜索,简单说就是一个分布式K/V存储系统: 由于它是go语言写的,没有其它客户端,找到一个java的. 出于方案积累原因,写了c#版本,可以使用.c#版本是基于e ...