bs4爬取图片

#coding:utf-8
#__author__='wang'

import requests,os,urllib,urllib2
import shutil
#shutil模块,属于文件操作的高级模块
from bs4 import BeautifulSoup

#定义爬虫类
class SpiderImage(object):
    def __init__(self):
        self.base_url = 'http://www.ivsky.com'
        self.headers = {
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0)
 Gecko/20100101 Firefox/50.0",
            "HOST":'www.ivsky.com'
        }
        self.current_page_nember = 1


    def get_page_code(self,url):
        '''
        定义获取HTML源码的属性
        :param url: 部分路径 /tupian/index_1.html
        :return: 无返回值
        '''
        #拼接每一页的绝对路径
        abs_url = self.base_url + url
        try:
            request = urllib2.Request(abs_url,headers=self.headers)
            response = urllib2.urlopen(request)
        except Exception,e:
            print '链接失败,原因:',e
        else:
            pass
            #获取源码数据成功,开始获取源码中的图片
            html = response.read()
            self.get_images_by_html(html)

    def get_images_by_html(self,page_code):
        '''
        根据每一页的网页源码,获取网页中的图片
        :param page_code: 当前页的HTML源码
        :return: 无返回值
        '''
        print '正在下载第{}页图片...'.format(self.current_page_nember)
        #通过bs4对源码进行解析,将其解析成一个文档树对象
        bs_soup = BeautifulSoup(page_code,'lxml')
        img_list = bs_soup.select('.il_img img')
        # 为了更方便的查看和管理图片内容,再次将每一页分分组问价夹信息单独的存放
在一个文件夹内
        page_number = '%d-pageimages' % self.current_page_nember
        os.mkdir(page_number)
        os.chdir(page_number)
        for img in img_list:
            #取出每一张的src,alt属性
            img_src = img.get('src')
            img_alt = img.get('alt')


            #img_alt的值将其作为文件夹的名称,将img_src的图片下载到该文件夹内部
            if os.path.exists(img_alt):
                #如果文件夹存在,删除文件夹
                #mdir.()只能删除空的文件夹,如果文件夹内部或者文件夹或者文件则
会删除失败
                #os.rmdir(img_alt)
                shutil.rmtree(img_alt,ignore_errors=True)
                print '{}:文件夹重复'.format(img_alt.encode('utf-8'))
            os.mkdir(img_alt)
            os.chdir(img_alt)
            img_name = img_src.split('/')[-1]
            # 下载图片
            urllib.urlretrieve(img_src, img_name)
            # 从当前返回上一级目录,再创建一个分组信息的文件夹
            os.chdir(os.path.pardir)

        os.chdir(os.path.pardir)
        self.current_page_nember += 1
        #获取下一页的URL
        self.get_next_url(bs_soup)

    def get_next_url(self,bs_soup):
        '''
        获取下一页的URL
        :param bs_soup:接收当前页面(get_images_by_html())解析的bs对象
        :return:没有返回值
        '''
        next_page = bs_soup.select('.page-next')
        if len(next_page) == 0:
            print '已经是最后一页了'
        else:
            next_page = next_page[0]
            url = next_page.get('href')
            self.get_page_code(url)

    def start_spider(self):

        if os.path.exists(u'图片'):
            shutil.rmtree(u'图片', ignore_errors=True)
        os.mkdir(u'图片')
        os.chdir(u'图片')
        self.get_page_code('/tupian/index_1.html')

if __name__=='__main__':
    img_spider = SpiderImage()
    img_spider.start_spider()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值