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

爬虫主程序:

 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. broadcastemit

    http://code.angularjs.org/1.0.2/docs/api/ng.$rootScope.Scope#$broadcast scope可以以类似于DOM事件的方式进行事件传播.事件 ...

  2. Java使用FileReader(file)、readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号。

    //Java使用FileReader(file).readLine()读取文件,以行为单位,一次读一行,一直读到null时结束,每读一行都显示行号. public static void readFi ...

  3. JQUERY实现点击INPUT使光标移动到最后或指定位置

    下面本文章给大家简单介绍一下JQUERY实现点击INPUT使光标移动到最后或指定位置例子,希望对各位有帮助,你要知道面对一个 处女座的 需求者, focus()是远远不够的,比如说“我点进去的时候光标 ...

  4. scrum 第二次冲刺

    scrum 第二次冲刺 1.本周工作 本周正式开始了开发工作.首先设计了类图,建好了数据库,将整个小组的分工传到了禅道上,我主要负责后台的挂号操作. 本周分工如下: 首先搭建好了ssm框架,其中遇到了 ...

  5. 108. Convert Sorted Array to Binary Search Tree (building tree with resursion)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  6. flume-ng 自定义sink消费flume source

    如何从一个已经存在的Flume source消费数据 1.下载flume wget http://www.apache.org/dist/flume/stable/apache-flume-1.5.2 ...

  7. SSH 学习记录及在SSH模式下使用XShell连接服务器

    传统的网络服务程序,如rsh.FTP.POP和Telnet其本质上都是不安全的:因为它们在网络上用明文传送数据.用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击 ...

  8. Python:一些小知识

    小知识点总结 一.Python2与Python3 的区别 1.Python2中可以加括号输出,也可不加输出     Python3中必须加 2.python2 中有xrange(生成器)也有range ...

  9. ubuntu误删home目录

    今天第一次写shell脚本,一不小心把home目录全给删除了. 解决方案: 先把手打上二十大板!!! [root@myshell ~]#mkdir /home/test01             / ...

  10. intelli j中如何重启tomcat,或者关掉tomcat?每次点run都提示jmx端口占用

    方法1.idea有时候会这样,我一般都是直接打开任务管理器,把java进程给杀掉就好了.