写个python,爬行【游明星空】的壁纸(4)

前文摘要/本文内容:

在上一篇文章中,我们已经成功的把每一期的链接爬行了下来,并且以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()


结尾:

这样,就可以把壁纸下载下来了,但是,相信我,它会报错的,因为,这只是个初级代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值