目录


  • 目录
  • 前言
  • 1、Scrapy框架应用
  • 1.1、Scrapy准备
  • 1.2、创建项目及配置
  • 1.3、网页分析及代码实现
  • 1.3.1 items.py 中定义存储的数据
  • 1.3.2 spiders文件夹中编写爬虫主题代码
  • 1.3.3 pipeline s.py中编写数据储存代码
  • 1.3.4 更改setting文件
  • 1.4、运行爬虫
  • 2、马赛克风格图片生成
  • 2.1、准备工作
  • 2.2、生成拼图


前言

介绍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

然后提示使用模板,按提示输入即可。

python 去马赛克的算法 python 马赛克拼图_马赛克拼图


目录结构如下(盗的一张很好的图),

python 去马赛克的算法 python 马赛克拼图_马赛克拼图_02

这里有个问题,就是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()

这里使用正则表达式提取首页 中所有英雄的个人页面网址,

python 去马赛克的算法 python 马赛克拼图_马赛克拼图_03

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()获取皮肤网址

这里解析英雄的个人页面,正则表达式获取头像和皮肤背景链接。

下面通过浏览器查看链接,这里为了观察,可以将该页面的的源码打印出来分析。

头像链接

python 去马赛克的算法 python 马赛克拼图_python 去马赛克的算法_04


皮肤背景链接

python 去马赛克的算法 python 马赛克拼图_scrapy_05

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文件

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

python 去马赛克的算法 python 马赛克拼图_LOL_06

有些地方提示可以去掉下面的注释,就是保存页面缓存,下次访问更快。

确实会快,但占用内存很大,之前在本地运行,将整个项目上传服务器,没有成功,原因是在本地运行过,缓存高达几个G。

python 去马赛克的算法 python 马赛克拼图_马赛克拼图_07

1.4、运行爬虫

运行entrypoint.py文件即可

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

软件下载

2.2、生成拼图

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

生成图片

python 去马赛克的算法 python 马赛克拼图_python 去马赛克的算法_08

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

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