Scrapy+MongoDB 轻松爬取海量妹子图

关键时刻,第一时间送达!

【作者】:pk哥

【原文链接】:https://mp.weixin.qq.com/s/WIrepTu-2CGrGifLLRsHjw

全文758字 | 阅读需要7分钟

今天要完成的项目的是用 Scrapy 框架爬取煎蛋网妹子图片,这个项目之前用常规方法已经做过一次,为什么这次还要做这个项目呢?

1.用不同的方法做同一个项目,学习不同方法的特点。

2.上次用常规方法的写的项目有点小瑕疵,文章中有一处代码的配图用错了。关键字获取的源码中有一个方法因粗心多写了一个参数导致下载图片失败(已修正)。之前上传到 Github 上的代码是正确的。

所以这次还是用这个项目来学习下,咳咳,我们真的是用来学习的。

先放两张爬取的图片来给大家一点学习的动力。

项目环境

语言:Python3 编辑器:Pycharm

首先确保电脑已配置好 Scrapy 框架环境和 MongoDB 环境,不清楚的可参考上两篇文章:

初识爬虫框架 Scrapy

你的爬虫数据储存在哪?MongoDB入门篇

创建 Scrapy 项目

cmd 中通过命令创建 Scrapy 项目。

C:\Windows\System32>F:

F:\>cd scrapy

F:\scrapy>scrapy startproject meizi
New Scrapy project 'meizi', using template directory 'e:\\py3\\lib\\site-packages\\scrapy\\templates\\project', created in:
    F:\scrapy\meizi

You can start your first spider with:
    cd meizi
    scrapy genspider example example.com

然后基于basic模板创建一个名为的「jiandan」爬虫文件。

F:\scrapy>cd meizi

F:\scrapy\meizi>scrapy genspider -t basic jiandan jiandan.net --nolog
Created spider 'jiandan' using template 'basic' in module:
  meizi.spiders.jiandan

Scrapy 框架目录结构

items.py 文件

items.py 文件中定义提取的 Item,这里只定义了图片地址 img_url。

import scrapy


class MeiziItem(scrapy.Item):
    img_url = scrapy.Field()
jiandan.py 文件

在上面创建的爬虫文件 jiandan.py 中编写爬虫代码提取 Item。煎蛋网是通过 js 加载图片信息的,Scrapy 爬虫框架没有提供页面 js 渲染服务,直接用 requests 我们获取不到信息。两种方法解决此问题。

1.继续用自动化测试库 selenium 提取图片信息,selenium 库的优点是可见即可爬。

2.用 scrapy-splash 库获取。scrapy-splash 安装启动比较繁琐,下次再讲解,我们今天用 selenium 库获取图片信息。

在 jiandan.py 文件中编辑代码,用 selenium 库抓取页面信息并提取图片链接。

# -*- coding: utf-8 -*-
import scrapy
from meizi.items import MeiziItem
from selenium import webdriver

browser = webdriver.Chrome()
browser.maximize_window()


class JiandanSpider(scrapy.Spider):
    name = 'jiandan'
    allowed_domains = ['jiandan.net']
    url = "http://i.jandan.net/ooxx/"
    page = 1
    start_urls = [url + 'page-' + str(page) + "#comments"]

    def parse(self, response):
        browser.get(response.url)
        browser.implicitly_wait(15)
        a_list = browser.find_elements_by_link_text("[查看原图]")
        for a in a_list:
            item = MeiziItem()
            print(a.get_attribute('href'))
            item['img_url'] = a.get_attribute('href')    # 提取图片链接
            yield item
        if self.page < 38:   # 最大页面数,每天可能有变动,可优化
            self.page += 1
        yield scrapy.Request(self.url + str(self.page) + "#comments", self.parse)
settings.py 文件

激活 Item Pipeline 组件,需要在 settin.py 文件中配置指定 pipelines 文件,在 settings 中找到 ITEM_PIPELINES,把这部分注释去除。

ITEM_PIPELINES = {
   'meizi.pipelines.MeiziPipeline': 300,
}
pipelines.py 文件

编写 Pipeline 来存储提取到的数据,保存到本地或者保存到 MongoDB 中。

保存到本地

在本地新建好保存图片的路径。

import requests


class MeiziPipeline(object):    # 保存到本地
    count = 1

    def process_item(self, item, spider):
        result = requests.get(item['img_url'])
        with open("E:\\img\\jiandan\\" + str(self.count) + ".jpg", 'wb') as f:
            f.write(result.content)
            f.close()
        self.count += 1
        return item
保存到 MongoDB

MongoDB 和 pymongo 参考前面的文章安装好。新建一个 db 文件夹,用来存放 MongoDB 数据库。然后启动 cmd,cd 进入你下载的 MongoDB 解压的路径的 bin 文件,例如我的为 C:\Program Files\MongoDB\Server\3.2\bin,然后输入 mongod --dbpath=E:\db 来启动 MongoDB,打开 MongoDB 可视化工具 Robo 3T。

在 pipelines.py 文件中修改代码如下:

class SaveToMongoPipeline(object):    # 将数据保存到mongodb中
    def __init__(self, mongo_url, mongo_db):
        self.mongo_url = mongo_url
        self.mongo_db = mongo_db

    def process_item(self, item, spider):
        data = [{
            'img_url': item['img_url']

        }]
        self.db.image.insert(data)
        return item

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

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

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

在 settings.py 文件中修改配置 ITEM_PIPELINES 内容,定义 MongoDB 配置信息。

ITEM_PIPELINES = {
    'meizi.pipelines.SaveToMongoPipeline': 301
}

MONGO_URL = 'mongodb://localhost:27017'
MONGO_DB = 'jiandan'

但是储存在 MongoDB 中用 Robo 3T 打开只显示图片的链接信息,如何显示图片有待研究。MongoDB 这方面知识点较薄弱,望大佬们赐教!

运行爬虫框架

有两种方法可运行,我用的是第二种。 1. cmd 中输入命令运行

scrapy crawl jiandan

2. 在编辑器(我用的是 Pycharm)爬虫项目目录下新建 run_spider.py 文件,输入命令,运行此 py 文件即可启动爬虫框架。

from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'jiandan'])

下面是储存在本地的图片。

原文发布于微信公众号 - Python数据科学(Python_Spiderman)

原文发表时间:2018-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

分布式爬虫原理之Scrapy分布式实现

4146
来自专栏Python小屋

Python使用Scrapy爬虫框架爬取天涯社区小说“大宗师”全文

大宗师是著名网络小说作家蛇从革的系列作品“宜昌鬼事”之一,在天涯论坛具有超级高的访问量。这个长篇小说于2015年3月17日开篇,并于2016年12月29日大结局...

3455
来自专栏腾讯IVWEB团队的专栏

前端 fetch 通信

随着前端异步的发展, XHR 这种耦合方式的书写不利于前端异步的 Promise 回调。而且,写起来也是很复杂.。fetch API 本来是在 SW(Servi...

1.4K0
来自专栏aoho求索

基于可靠消息方案的分布式事务(四):接入Lottor服务

在上一篇文章中,通过Lottor Sample介绍了快速体验分布式事务Lottor。本文将会介绍如何将微服务中的生产方和消费方服务接入Lottor。

2411
来自专栏码字搬砖

工作中用到的sh脚本(持续更新)

day=(date−d‘−0day′‘+echo“(date−d‘−0day′‘+echo“(date -d ‘-0 day’ ‘+%Y-%m-%d’) e...

1565
来自专栏华章科技

分分钟学会用python爬取心目中的女神——Scrapy

原文网址:http://www.cnblogs.com/wanghzh/p/5824181.html

933
来自专栏三木的博客

FUSE

###一、FUSE简介 FUSE(用户空间文件系统)是这样一个框架,它使得FUSE用户在用户态下编写文件系统成为可能,而不必和内核打交道。FUSE由三个部分组成...

2686
来自专栏乐百川的学习频道

scrapy 快速入门

安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。 首先我们安装Sc...

2405
来自专栏用户2442861的专栏

poll()函数总结

http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html

852
来自专栏Python攻城狮

TFTP客户端1.TFTP协议介绍2.TFTP下载过程相关代码

TFTP(Trivial File Transfer Protocol,简单文件传输协议)

1262

扫码关注云+社区