Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy(4)spider 帮助你寻找最美小姐姐
我们都知道我们平常想下载一些漂亮的图片来装饰自己的桌面,可是找到了都是需要收费的网站,真的很恼火,所以今天小编,可能要带大家实现这么一个工具,可以用来爬取某个网站的好看的图片
公众号---人生代码
2020/05/16
5170
scrapy爬虫笔记(2):提取多页图片并下载至本地
所以只需要构造一下传入的url即可,例如需要爬取10页图片,则 url 后缀需要从1遍历至10
冰霜
2022/03/15
7290
scrapy爬虫笔记(2):提取多页图片并下载至本地
(原创)Scrapy爬取美女图片续集
上一篇咱们讲解了Scrapy的工作机制和如何使用Scrapy爬取美女图片,而今天接着讲解Scrapy爬取美女图片,不过采取了不同的方式和代码实现,对Scrapy的功能进行更深入的运用。 在学习Sc
七夜安全博客
2018/06/21
1.9K1
Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为,
coders
2018/01/04
1.1K0
Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
data pipeline是做什么_pycharm创建爬虫项目
爬取爱套图网图片:https://github.com/EExplode/scrapy_aitaotu
全栈程序员站长
2022/10/05
4490
Scrapy框架的使用之Item Pipeline的用法
Item Pipeline是项目管道,本节我们详细了解它的用法。 首先我们看看Item Pipeline在Scrapy中的架构,如下图所示。 图中的最左侧即为Item Pipeline,它的调用发生
崔庆才
2018/06/25
7.3K1
Scrapy 框架的使用之 Item Pipeline 的用法
Item Pipeline 的调用发生在 Spider 产生 Item 之后。当 Spider 解析完 Response 之后,Item 就会传递到 Item Pipeline,被定义的 Item Pipeline 组件会顺次调用,完成一连串的处理过程,比如数据清洗、存储等。
马修
2021/01/21
6640
[890]scrapy之pipeline的使用
scrapy的pipeline是一个非常重要的模块,主要作用是将return的items写入到数据库、文件等持久化模块,下面我们就简单的了解一下pipelines的用法。
周小董
2020/08/13
1.1K0
scrapy 也能爬取妹子图 ?
我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需求。那我们的 scrapy 能爬取图片吗?答案是,当然的。说来惭愧,我也是上个月才知道,在 zone7 粉丝群中,有群友问 scrapy 怎么爬取图片数据?后来搜索了一下才知道。现在总结一下分享出来。
小小詹同学
2019/11/12
6880
#Python爬虫#Item Pipeline介绍(附爬取网站获取图片到本地代码)
当spider爬取到item后,它被发送到项目管道(Item Pipeline),通过几个组件按顺序进行处理。每一个Item Pipeline是一个实现了简单方法的Python类,它接收到一个item并对其执行一个操作,也要决定该item是否应该继续通过管道,或者被丢弃,不再进行处理。
程序员迪迪
2022/01/06
1.4K0
爬虫小白:11.scrapy框架(六) _媒体管道
直接使用ImagePipeline类 , 所有的图片都是保存在 full文件夹下:
见贤思齊
2020/08/05
9420
爬虫小白:11.scrapy框架(六) _媒体管道
Python(十六)
接下来的几篇,我们将介绍一下最流行的爬虫框架 Scrapy。本篇,我们会介绍一下 Scrapy 的基本使用。
1ess
2021/11/01
3410
Python(十六)
Scrapy框架的使用之Scrapy入门
接下来介绍一个简单的项目,完成一遍Scrapy抓取流程。通过这个过程,我们可以对Scrapy的基本用法和原理有大体了解。 一、准备工作 本节要完成的任务如下。 创建一个Scrapy项目。 创建一个Spider来抓取站点和处理数据。 通过命令行将抓取的内容导出。 将抓取的内容保存的到MongoDB数据库。 二、准备工作 我们需要安装好Scrapy框架、MongoDB和PyMongo库。 三、创建项目 创建一个Scrapy项目,项目文件可以直接用scrapy命令生成,命令如下所示: scrapy st
崔庆才
2018/06/25
1.5K0
分布式爬虫搭建系列 之三---scrapy框架初用
其次,通过我们的神器PyCharm打开我们的项目--crawlquote(也可以将PyCharm打开我们使用虚拟环境创建的项目)
wfaceboss
2019/04/08
6030
分布式爬虫搭建系列 之三---scrapy框架初用
scrapy 进阶使用
乐百川
2018/01/09
2.1K0
scrapy 进阶使用
手把手教你用Scrapy爬取知乎大V粉丝列表
导读:通过获取知乎某个大V的关注列表和被关注列表,查看该大V以及其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息。
IT阅读排行榜
2021/05/06
9500
python scrapy爬虫练习(1) 爬取豆瓣电影top250信息
文章目录 一、分析网页 目标URL:https://movie.douban.com/top250?start=0&filter= 每一页有25条电影信息,总共10页。检查网页可以发现,每条电影的详细
叶庭云
2020/09/17
5.2K0
python  scrapy爬虫练习(1)   爬取豆瓣电影top250信息
Scrapy框架之利用ImagesPipeline下载图片
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/72802184
大黄大黄大黄
2018/09/14
3.1K0
Scrapy框架之利用ImagesPipeline下载图片
Scrapy 爬虫框架入门案例详解
本文介绍了如何使用 Scrapy 框架爬取知乎用户详细信息并存储到 MongoDB 数据库的过程。通过分析网页结构,使用 Scrapy 框架和 XPath、CSS 选择器提取数据,并利用 Spider 的 Item 输出格式将数据保存至 MongoDB 数据库。
崔庆才
2017/04/25
4K0
利用 Scrapy 爬取知乎用户信息
  思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息。 一、新建一个scrapy项目   scrapy startproject zhihuuser   移动到新建目录下: cd zhihuuser   新建spider项目: scrapy genspider zhihu zhihu.com 二、这里以爬取知乎大V轮子哥的用户信息来实现爬取知乎大量用户信息。 a)
希希里之海
2018/05/16
6730
相关推荐
Scrapy(4)spider 帮助你寻找最美小姐姐
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验