目录
- 目录
- 前言
- 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
然后提示使用模板,按提示输入即可。
目录结构如下(盗的一张很好的图),
这里有个问题,就是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框架安装配置
利用爬虫技术能做到哪些很酷很有趣很有用的事情?