【Python3.6爬虫学习记录】(十五)Scrapy爬虫框架的应用及马赛克拼图生成

目录

前言

介绍Scrapy框架的简单使用。文中首先通过Scrapy框架爬取网络图片,然后使用工具生成马赛克拼图。
虽然Scrapy的使用,网上教程很丰富,尤其参考链接1,这里,自己再走一遍流程,熟悉熟悉。
文中爬取LOL英雄皮肤,然后做一张马赛克拼图。

1、Scrapy框架应用
1.1、Scrapy准备

python环境,应该没什么问题。我使用的是Anaconda管理的python及相关库,一般各种库都有,比较方便。
当然也需要安装Scrapy

pip install Scrapy
(Anaconda中直接使用)
conda install Scrapy

验证安装完成,输入Scrapy,会有提示。

1.2、创建项目及配置

首先cmd到项目目录,输入(projectname为项目名称)

scrapy startproject projectname

然后提示使用模板,按提示输入即可。
这里写图片描述
目录结构如下(盗的一张很好的图),
这里写图片描述

这里有个问题,就是Scrapy不能在IDE中调试,解决办法是,在根目录即scrapy.cfg同级目录创建一个entrypoint.py文件,输入

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

其中,运行时解析为scrapy crawl projectname

1.3、网页分析及代码实现

这里主要爬取

1.3.1 items.py 中定义存储的数据

包含英雄id,皮肤背景图集合(一个英雄有多个皮肤),头像集合(不同皮肤,头像不同)

import scrapy

class LolSkinsItem(scrapy.Item):
    # name of hero
    id = scrapy.Field()
    # skins set set
    bg_urls = scrapy.Field()
    # icons set of hero
    icon_urls = scrapy.Field()
1.3.2 spiders文件夹中编写爬虫主题代码

首先导入相关库,在这里使用正则表达式,匹配网页连接。
当然,如果爬取文字的网站,也可以使用beautifulsoup对源码进行解析(from bs4 import BeautifulSoup)。

from scrapy.http import Request
from Scrapy.lol_skins.lol_skins.items import LolSkinsItem
import scrapy
import re

然后编写开始函数start_requests()
在down_skins类中(一下所有解析函数均定义在该类中)

    # self members
    name = 'lol_skins'
    def start_requests(self):
        index = 'http://lol.qq.com/skin/'
        yield Request(index,self.parse)

这里最后一行尤为重要,主要是Request函数的使用,第一个参数index为访问网址,第二个参数表示调用函数parse()。就是访问index网站,然后将访问信息(网站源码)传递给parse函数进行下一次解析。

编写初次解析函数parse()
这里使用正则表达式提取首页 中所有英雄的个人页面网址,
这里写图片描述

    def parse(self, response):
        url_regex = 'http://lol.qq.com/act/3d/\d+'
        pattern = re.compile(url_regex)
        hero_url = pattern.findall(response.text)
        i = 0
        for url in hero_url:
            i = i + 1
            yield Request(url,self.get_hero_skin,meta={'id':i})

parse(self, response),其中response为上次执行的响应返回,response.text即为返回的页面源码。
这里调用下一个执行函数get_hero_skin(),并且传递了一个额外数据参数meta={‘id’ : i}。

编写二次解析函数get_hero_skin()获取皮肤网址
这里解析英雄的个人页面,正则表达式获取头像和皮肤背景链接。
下面通过浏览器查看链接,这里为了观察,可以将该页面的的源码打印出来分析。
头像链接
这里写图片描述
皮肤背景链接
这里写图片描述

    def get_hero_skin(self,response):
        bg_regex = 'bg:"http://ossweb-img.qq.com/upload/gameact/topic/[\w\_\-\/]+_Value_local.jpg"'
        icon_regex = 'icon:"http://ossweb-img.qq.com/upload/gameact/topic/[\w\_\-\/]+_Value_local.jpg"'
        bg_pattern = re.compile(bg_regex)
        bgs = bg_pattern.findall(response.text)
        icon_pattern = re.compile(icon_regex)
        icons = icon_pattern.findall(response.text)
        bgs_url = []
        icons_url = []
        for bg in bgs:
            bgs_url.append(bg.split('"')[1])
        for icon in icons:
            icons_url.append(icon.split('"')[1])

        item = LolSkinsItem()
        item['id'] = response.meta['id']
        item['bg_urls'] = bgs_url
        item['icon_urls'] = icons_url
        yield item

这里需要注意最后几行,创建了一个LolSkinsItem的对象,然后对对象属性进行了赋值,最后返回。这里item对象,就是在items中定义的数据类型。

总体流程
scrapy是一个分布式框架,
首先使用parse() index首页,提取所有英雄的个人页面;然后使用get_hero_skins()对每个英雄的个人页面进行解析,提取头像和皮肤背景链接,并且保存到定义的数据类型中。

1.3.3 pipeline s.py中编写数据储存代码

这里将get_hero_skins()中最后返回的item进行解析保存到本地

import requests

class LolSkinsPipeline(object):
    def process_item(self, item, spider):
        i = 0
        id = item['id']
        for bg in item['bg_urls']:
            i = i +1
            image = requests.get(bg).content
            with open('D:\PythonScripts\Scrapy\lol_skins\lol_skins\\bgs\\'+str(id)+'_'+str(i) +'.jpg', 'wb') as f:
                f.write(image)

        for icon in item['icon_urls']:
            i = i + 1
            image = requests.get(icon).content
            with open('D:\PythonScripts\Scrapy\lol_skins\lol_skins\icons\\' + str(id) + '_' + str(i) + '.jpg', 'wb') as f:
                f.write(image)
1.3.4 更改setting文件

为了能够成功下载图片并保存需要将下面去掉下面的注释
这里写图片描述

有些地方提示可以去掉下面的注释,就是保存页面缓存,下次访问更快。
确实会快,但占用内存很大,之前在本地运行,将整个项目上传服务器,没有成功,原因是在本地运行过,缓存高达几个G。
这里写图片描述

1.4、运行爬虫

运行entrypoint.py文件即可

2、马赛克风格图片生成
2.1、准备工作

软件下载

2.2、生成拼图

1、新建图片数据库
…到新数据库,命名
2、制作马赛克拼图
要求选择主题图片
选择拼图保存位置
选择分辨率

生成图片
放逐之刃

提示一下,如果分辨率选择过高,生成图片非常大(之前生成一张96M的图片)。
这里的图片数据库不是很好,生成的图片不是很清晰。相较而言,可以使用一些二次元图片,会更好一下(见参考链接)。

参考
小白进阶之Scrapy第一篇
Python爬虫进阶三之Scrapy框架安装配置
利用爬虫技术能做到哪些很酷很有趣很有用的事情?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值