前文摘要/本文内容:
在上一篇文章中,我们已经成功的把每一期的链接爬行了下来,并且以txt记事本的形式存储到了本地。那么,是时候进行收尾工作,把壁纸都下载到本地了
页面分析:
首先,我们还是先打开一期,分析一下它的页面
随便点击一张图片,发现它进去了另一个页面,页面上方依旧有游明星空的导航栏,此时发现,图片还可以点击,最后是这样的效果
为什么要点两次啊?这很不应该啊?接下来从html源码分析
第一次访问的a标签,href的值是这样的
点开之后,再看一下新页面的图片a标签,发现href的值是这样的
最后,才是图片真正的url
难道真的要点两次,才能获取到我们想要的图片url,继续分析,发现了这个规律
在初始a标签的href值,它是由两个字段组成的
第一段是gamersky的一个固定网址
第二段是图片的原始url链接
中间用【?】拼接起来
这么说,只要我提取出每一页的图片url,就可以下载图片了
所以说!我们可以开始动手了
#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
=======================================
=======================================
============Author:Task138=============
===========Power By Python2============
=======================================
=======================================
"""
# Create On 2018/2/15
import re
import os
import chardet
import requests
from scrapy.selector import Selector
class Get_IMG(object):
def __init__(self):
# 打开之前爬行保存好的txt,读取里面的url数据
with open('url_list.txt', 'r') as fp:
self.url_list = fp.readlines()
# 定义一个文件夹的名称,所有的壁纸都保存在这个文件夹里面
self.dirname = 'gamersky_wallpicture'
# 如果该文件夹不存在,则创建一个这个文件夹
if not os.path.exists(self.dirname):
os.mkdir(self.dirname)
print 'dir [ %s ] create success!!' % self.dirname
# 遍历url数据,执行保存图片的主函数
for url in self.url_list:
try:
self.save_img(url.strip())
except:
with open('error.txt', 'a') as fp:
fp.write(url + '\r\n')
print 'url error [ %s ]' % url
def save_img(self, url):
# 使用requests库去请求url
response = requests.get(url)
# 使用chardet库去判断该页面的编码类型,并赋值
# 游民星空也算是有发展历史了,15年了,GBK和UTF8的编码都有,不能写死这个参数
response.encoding = chardet.detect(response.content)['encoding']
content = response.text
# 抓取title标题,这个将作为本期壁纸单独存放的一个文件夹名称
title = Selector(text=content).css('h1::text').extract()
if title:
# 由于Windows文件夹的创建名称限制,必须要过滤掉以下字符,否则不能创建文件夹
title = re.sub(r'\\|/|:|\*|\?|"|<|>|\||', '', title[0])
# 抓取壁纸图片a标签的href值
links = Selector(text=content).css('p a::attr(href)').extract()
# 遍历href值
for link in links:
# 正则匹配,匹配以【.jpg】结束的url
if re.search('\.jpg$',link):
# 以【?】为分隔,提取后半部分
img_url = link.split('?')[-1]
# 使用os模块,从url中提取壁纸图片的文件名
filename = os.path.basename(img_url)
# 使用os模块,把存储的文件夹路径合成起来,因为在Linux中,路径用斜杠【/】连接
# 而在Windows中,路径用的是反斜杠【\】
dir_path = os.path.join(self.dirname, title)
# 判断以title为名的文件夹是否存在,若不存在,则创建一个
if not os.path.exists(dir_path):
os.mkdir(dir_path)
print 'dir [ %s ] create success!!' % dir_path
file_path = os.path.join(dir_path, filename)
# 判断图片是否存在于本地,如果不存在,才执行下载
if not os.path.exists(file_path):
# 使用requests库去请求图片的url,提取content值,而不是text值
img_content = requests.get(img_url).content
# 创建一个jpg的空文件,以'wb'的方式,把img_content的值写进去
with open(file_path, 'wb') as fp:
fp.write(img_content)
print 'img [ %s ] save success!!' % file_path
else:
print 'img [ %s ] already existed!!' % file_path
# 判断是否存在下一页,如果有下一页,继续下载壁纸图片
# 如果没有,输出一些自定义的标识符,好让我们知道,这一期的壁纸下载完成了
page_links = Selector(text=content).css('div.page_css a::text').extract()
if page_links[-1] == u'下一页':
next_page = Selector(text=content).css('div.page_css a::attr(href)').extract()[-1]
self.save_img(next_page)
else:
print ''
print '=' * 80
print ''
if __name__ == '__main__':
GI = Get_IMG()
结尾:
这样,就可以把壁纸下载下来了,但是,相信我,它会报错的,因为,这只是个初级代码