前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Scrapy框架之批量下载360妹纸图

Scrapy框架之批量下载360妹纸图

作者头像
公众号guangcity
发布于 2019-09-20 06:35:18
发布于 2019-09-20 06:35:18
57000
代码可运行
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)
运行总次数:0
代码可运行

Scrapy框架之批量下载360妹纸图

0.导语1.项目初始化2.定义存储结构3.Spider核心代码4.pipeline下载及存储5.json知识

0.导语

爬虫终于来了,,,好久没更爬虫了,现在更起来。。。。

1.项目初始化

  • 创建项目
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy startproject images360
  • 创建Spider
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scrapy genspider images images.so.com

2.定义存储结构

查看数据:

items.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 提取数据
class Images360Item(Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    collection = table = 'images' # 设置MongoDB的表名为images
    id = Field()
    url = Field()
    title = Field()
    thumb = Field()

3.Spider核心代码

  • settings.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MAX_PAGE = 50 # 爬取 50 页,每页 30 张,一共 1500 张图片
ROBOTSTXT_OBEY = False # 设为False,否则无法抓取
  • images.py

分析网页(http://images.so.com/z?ch=beauty)

注意先打开 http://images.so.com/ 然后点美女,紧接着,打开浏览器的检查页面,点击Network的XHR,向下滑动鼠标,动态加载出如下图一所示的左边一栏Name值,再往下滑动鼠标会发现,Name里面的sn不断发生变化,其他的保持不变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from scrapy import Spider, Request
from urllib.parse import urlencode
import json
from images360.items import Images360Item

class ImagesSpider(Spider):
    name = 'images'
    allowed_domains = ['images.so.com']
    start_urls = ['http://images.so.com/']

    def start_requests(self):
        data = {'ch': 'beauty', 'listtype': 'new', 'temp': '1'}
        base_url = 'https://image.so.com/zj?'
        for page in range(1, self.settings.get('MAX_PAGE') + 1):
            data['sn'] = page * 30
            params = urlencode(data)
            url = base_url + params
            yield Request(url, self.parse)

    def parse(self, response):
        result = json.loads(response.text) # 字符串转dict类型
        for image in result.get('list'):
            item = Images360Item()
            item['id'] = image.get('imageid')
            item['url'] = image.get('qhimg_url')
            item['title'] = image.get('group_title')
            item['thumb'] = image.get('qhimg_thumb_url')
            yield item

4.pipeline下载及存储

  • 修改settings.py

启用item Pipeline组件 每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值确定了他们的运行顺序,数字越小越优先

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ITEM_PIPELINES = {
   # 下载图片到本地
   'images360.pipelines.ImagePipeline': 300,
   # 存储至MongoDB
   'images360.pipelines.MongoPipeline': 301
}

BOT_NAME = 'images360'
MAX_PAGE = 50
MONGO_URI = 'localhost'
MONGO_DB = 'test'
  • 设置图片存储路径

settings.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
# 配置数据保存路径,为当前工程目录下的 images 目录中
project_dir = os.path.abspath(os.path.dirname(__file__))
print(project_dir)
IMAGES_STORE = os.path.join(project_dir, 'images')
  • 修改pipelines.py

process_item(self,item,spider)

每个item piple组件是一个独立的pyhton类,必须实现以process_item(self,item,spider)方法;每个item pipeline组件都需要调用该方法,这个方法必须返回一个具有数据的dict,或者item对象,或者抛出DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pymongo
from scrapy import Request
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline

class MongoPipeline(object):
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DB')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def process_item(self, item, spider):
        self.db[item.collection].insert(dict(item))
        return item

    def close_spider(self, spider):
        self.client.close()

class ImagePipeline(ImagesPipeline):
    def file_path(self, request, response=None, info=None):
        url = request.url
        file_name = url.split('/')[-1]
        return file_name

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        print(image_paths)
        if not image_paths:
            raise DropItem('Image Downloaded Failed')
        return item

    def get_media_requests(self, item, info):
        yield Request(item['url'])

上述代码解释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 存储至MongoDB实现
open_spider(self,spider)
表示当spider被开启的时候调用这个方法
close_spider(self,spider)
当spider关掉时这个方法被调用
from_crawler(cls,crawler)
必须设置为类方法@classmethod
# 下载至本地实现
file_path(self, request, response=None, info=None)
根据request的url得到图片的原始xx.jpg(即获得图片名)
get_media_requests(self,item, info):
ImagePipeline根据image_urls中指定的url进行爬取,
可以通过get_media_requests为每个url生成一个Request
item_completed(self, results, item, info)图片下载完毕后,处理结果会以二元组的方式返回给item_completed()函数。这个二元组定义如下:
(success, image_info_or_failure)
其中,第一个元素表示图片是否下载成功;第二个元素是一个字典
image_paths = [x['path'] for ok, x in results if ok] #打印图片path,比如xx.jpg
等价于
for ok, x in results:
    if ok:
        image_paths = [x['path']]

5.json知识

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a={
    'asd':'12',
    'as':'4',
    'asd12':'s12',
    'list': [{'a':'12'},{'b':'123'}]
}
import json
print(type(a))
a = json.dumps(a)
print(a)
print(type(a))
a = json.loads(a)
print(a)
print(type(a))
a = a.get('list')
print(a)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一款比Typora更简洁优雅的Markdown编辑器神器(完全开源免费)
自从Typora收费以后经常有朋友会问有没有一个好用、简洁、免费的Markdown编辑器推荐的,今天大姚给大家分享一款比Typora更简洁优雅的、完全开源免费(MIT License)Markdown编辑器神器:MarkText。
追逐时光者
2024/03/31
1.9K0
一款比Typora更简洁优雅的Markdown编辑器神器(完全开源免费)
R沟通|​markdown编辑器—Typora
markdown是一种轻量级标记语言,它允许使用者可以通过简单的文本格式 编写文档,并且转换成html文档。
庄闪闪
2021/04/08
7630
强烈推荐使用的Markdown编辑器
今天我有幸来给各位分享几款优秀的在线且免费的Markdown编辑器工具。如果你是一位程序员或开发者,我相信你对Markdown工具并不陌生。对,没错,就是那个让我们能够更高效地编写文档的工具。
Masutaa大师
2023/07/26
6730
强烈推荐使用的Markdown编辑器
vue中引入并使用markdown编辑器
  不知道各位是否对 markdown熟悉。它算是一门标记语言,但是语法简单,却本领强大。例如本篇博客,便是用 markdown语法编写,然后根据不同的环境及依赖生成各种我想要的样式,比如直接生成本篇博客样式或者使用一些依赖或者工具赋之更加美观的样式。同样,一般在CMS后台管理系统中,也经常会用到编辑器来编写一些文章材料。其中最常用的还是 markdown编辑器和 富文本编辑器。
流眸
2019/08/12
7K0
vue中引入并使用markdown编辑器
Typora 收费?试试这款开源 Markdown 神器!好用还美观
Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(英语:John Gruber)。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。
民工哥
2022/02/12
1.1K0
Typora 收费?试试这款开源 Markdown 神器!好用还美观
几款主流好用的 Markdown 编辑器!值得拥有
Markdown 其实在 2004 年就有了,不过之前一直很小众,这几年随着相关应用平台的发展,Markdown以其独到的优势迅速火起来了。Markdown编辑器使用一套格式标记语言来对文档内容进行排版和格式显示。而Markdown的标记很少,常用的也就十个左右,它是一种非常轻量的标记语言。
终码一生
2022/04/15
6.9K0
几款主流好用的 Markdown 编辑器!值得拥有
美哭了,一款面向程序员的 Markdown 应用,功能属实有点强...
今天给大家推荐一款面向程序员的开源 Markdown 神器:Yank Note,完美替代Typora,甚至提供了比Typora更加强大的功能。
一行Java
2022/09/03
1.6K0
美哭了,一款面向程序员的 Markdown 应用,功能属实有点强...
Typora——一款简洁的Markdown编辑器
如果你是一个佛(lan)系(duo),内心文艺的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,可以来了解一下该软件Typora.
ZC.TigerRoot
2020/05/12
1.2K0
CSDN的Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
用户9006224
2022/12/21
2K0
CSDN的Markdown编辑器
老版本Typora强制付费!试试这款替代品
前两天,陌溪兴高采烈的准备开始创作(水文)的时候,打开 Typora 就弹出下面一段内容
陌溪
2022/10/27
2.6K0
Typora一款简洁的Markdown编辑器
这篇文章最后修改于 2022-07-01 日,距今已有 144 天,请注意甄别内容是否已经过时!
羽翼博客
2022/11/28
8100
Typora一款简洁的Markdown编辑器
强烈推荐使用的Markdown编辑器工具
大家好,我是程序员二条。今天来给大家分享几款,在线并且免费的Markdown编辑器工具。
兔云小新LM
2023/08/09
1K0
强烈推荐使用的Markdown编辑器工具
公司新来一个同事,把 Typora 玩得炉火纯青!太强悍了
一次偶然的机会,让我接触到了 .md 文档,进而开始摸索,并意外结识了 Typora 这个编辑器。
公众号 IT老哥
2022/12/17
4.5K0
公司新来一个同事,把 Typora 玩得炉火纯青!太强悍了
Yank Note 高度可扩展的 Markdown 编辑器
Yank Note 是一款高度可扩展的 Markdown 编辑器,支持全平台操作系统使用,专为易用和强大的编辑体验而设计。
为为为什么
2024/07/18
3670
Yank Note 高度可扩展的 Markdown 编辑器
Markdown快速入门
现在博文写作次数渐渐变多,经常看到很多园友的博文样式都非常的美观,个人虽然是个土鳖,但对美也是有很强需求的,同时由于最近将要上线一个博客项目,因此也很关心如何可以更高效的编辑和发布博文。之前一直使用word,在发布时始终存在一个格式转换的问题,很多word特有样式都会失效,需要手动微调,而且也会变得没那么美观,比如SmartArt需要重新切图上传,代码需要重新复制插入,表格的尺寸等也有很大的失真等,困扰了我很久。最近看到很多博主推荐markdown编辑器,并且博客园也支持,git的readme的文件均是.m
用户1216676
2018/01/24
1.3K0
Markdown快速入门
Typora安装包,超强Markdown编辑器,所见即所得
Typora是一个所见即所得的Markdown格式文本编辑器,支持Windows、macOS和GNU/Linux操作系统,包括对GitHub Flavored Markdown扩展格式的支持、拼写检查、自定义CSS样式、数学公式渲染(通过MathJax)等特性。
Eleven
2023/04/26
7080
Typora安装包,超强Markdown编辑器,所见即所得
MarkEdit:相信做技术的同学都会喜欢这个编辑器的,MarkEdit编辑器,让Markdown编辑变得简单而强大,超赞~~~
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/02/02
4441
MarkEdit:相信做技术的同学都会喜欢这个编辑器的,MarkEdit编辑器,让Markdown编辑变得简单而强大,超赞~~~
Typora for Mac(Markdown文本编辑器)
Typora for Mac最新版是一款应用广泛的Markdown文本编辑器,Typora for Mac最新版软件编辑功能齐全,支持中文界面,可以非常直观的看到源部分和预览部分,支持插入文本、图片、表格、代码、数学公式等,Typora mac版还支持实时预览和所见即所得功能,让你工作更加高效。
对影三人
2023/04/11
5870
Typora for Mac(Markdown文本编辑器)
Typora-轻量级MD编辑器-官方免费版
markdown是一种轻量级标记语言,轻量级标记语言是一类用简单句法描述简单格式的文本语言,它的语法简单,可方便地使用简单的文本编辑器输入,原生格式接近自然语言。所谓“轻量级”是相对于其他更丰富格式的标记语言而言的。
张旭博客
2022/12/27
1.5K0
Typora-轻量级MD编辑器-官方免费版
CSDN-markdown编辑器笔记
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
wjl110
2022/03/24
1.6K0
CSDN-markdown编辑器笔记
推荐阅读
相关推荐
一款比Typora更简洁优雅的Markdown编辑器神器(完全开源免费)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验