zoukankan      html  css  js  c++  java
  • 【Python爬虫案例学习】下载某图片网站的所有图集

    前言

    其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup。
    其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行。

    基本环境配置

    • python 版本:2.7
    • IDE :pycharm

    相关模块

    import urllib2
    import io
    import random
    import urllib
    from bs4 import BeautifulSoup
    import re
    import os
    

    完整代码

    import urllib2
    import io
    import random
    import urllib
    from bs4 import BeautifulSoup
    import re
    import os
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    '''
    遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
    '''
    def getHtml(url):
        #尽可能让爬虫显示为一个正常用户。若不设置,则发送的请求中,user-agent显示为Python+版本
        user_agent = [
            'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30',
            'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0',
            'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)',
            'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50',
            'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',
            'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)'        
        ]
        #设置网页编码格式,解码获取到的中文字符
        encoding = "gb18030"
        #构造http请求头,设置user-agent
        header = {"User-Agent":random.choice(user_agent)}
        #构造发送请求
        request = urllib2.Request(url,headers=header)
        #发送请求,获取服务器响应回来的html页面
        html = urllib2.urlopen(request).read()
        #使用beautifulSoup处理的html页面,类似dom
        soup = BeautifulSoup(html,from_encoding=encoding)
        return soup
    
    # 获取整个站点所有图集的页码
    def getPageNum(url):
        soup = getHtml(url)
        # 直接在站点首页获取所有图集的总页码
        nums=soup.find_all('a',class_='page-numbers')
        # 除掉“下一页”的链接,并获取到最后一页
        totlePage = int(nums[-2].text)
        return totlePage
    
    #获取指定页面下图集名称和链接
    def getPicNameandLink(url):
        
        soup = getHtml(url)
        meun = []
        #类似html dom对象,直接查找id为“pins”的ul标签,返回的结果是一个dom对象
        targetul = soup.find("ul",id="pins")
        if targetul:    
            #获取该ul下所有的超链接,返回值的类型是list,find_all中第二个参数表示某个指定标签的属性
            pic_list = targetul.find_all("a",target="_blank")
            if pic_list:
               # 遍历所有指定的标签a
                for pic in pic_list:
                    #获取图集的链接
                    link = pic["href"]
                    picturename = ""
                    #找到标签a中,“class”为“lazy”的img标签。
                    #find中,第二个参数表示某个指定标签的属性。
                    #在python中class是保留字,所有标签的class属性的名称为“class_”
                    img = pic.find("img",class_='lazy')
                    if img:
                        # 保证中文字符能够正常转码。
                        picturename = unicode(str(img["alt"]))
                    else:
                        continue
                    #插入图集名称和对应的url
                    meun.append([picturename,link])    
            
            return meun
        return None
    
    #function获取所有的图集名称
    def getallAltls(url):
        totalpage = getPageNum(url)
        #获取首页中所有的图集名称。首页的url和其他页面不同,没有page
        meun = getPicNameandLink(url)
        #循环遍历所有的图集页面,获取图集名称和链接
        for pos in range(2,totalpage):
            currenturl = url + "/page/" + str(pos)
            #getPicNameandLink()返回的值是一个list。
            #当一个list插入到另一个list中时,使用extend。
            #若是插入一个值时,可以用append
            meun.extend(getPicNameandLink(currenturl))
        
        return meun
        
    # 获取从首页到指定页面所有的图集名称和链接
    def getparAltls(url,page):
        meun = getPicNameandLink(url)
            
        for pos in range(2,page):
            currenturl = url + "/page/" + str(pos)
            meun.extend(getPicNameandLink(currenturl))
            
        return meun
    
    #获取单个相册内图片页码
    def getSinglePicNum(url):
        soup = getHtml(url)
        #pagenavi还是一个对象(Tag),可以通过find_all找出指定标签出来
        pagenavi = soup.find("div",class_="pagenavi")
        pagelink = pagenavi.find_all("a")
        
        num = int(pagelink[-2].text)
        return num
    
    
    #下载单个相册中的所有图片
    def getSinglePic(url,path):
        totalPageNum = getSinglePicNum(url)
        #从第一页开始,下载单个图集中所有的图片
        #range()第二个参数是范围值的上限,循环时不包括该值
        #需要加1以保证读取到所有页面。
        for i in range(1,totalPageNum + 1):
            currenturl = url + "/" + str(i)
            downloadpic(currenturl,path)
           
    #下载单个页面中的图片 
    def downloadpic(url,path):
        soup = getHtml(url)
        #找出指定图片所在父容器div
        pageimg = soup.find("div",class_="main-image")
        
        if pageimg:
            #找出该div容器中的img,该容器中只有一个img
            img = pageimg.find("img")
            #获取图片的url
            imgurl = img["src"]
            #获取图片的文件名
            restring = r'[A-Za-z0-9]+.jpg'
            reimgname = re.findall(restring,imgurl)
            
            #将图片保存在指定目录下
            path = str(path)
            if path.strip() == "":
                downloadpath = reimgname[0]
            else:
                downloadpath = path + "/" + reimgname[0]
            #伪装一下下载的http请求,否则有些站点不响应下载请求。
            #不设置的话,下载请求中的user-agent为python+版本号
            urllib.URLopener.version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0'
            #下载图片到指定目录中,保留图片在服务器上的文件名
            urllib.urlretrieve(imgurl,downloadpath)
        
    def downimgofsite(url,path = ""):
        
        path = str(path)
        #获取所有图集的名称和链接
        meun_list = getallAltls(url)
        directorypath = ""
        
        for meun in meun_list:
            directoryname = meun[0]
            if path.strip() != "":
                directorypath = path + "/" + directoryname
            else:
                directorypath = os.getcwd + "/" + directoryname
            
            if not os.path.exists(directorypath):
                os.makedirs(directorypath)
            
            getSinglePic(meun[1], directorypath)
            
    
    if __name__ == "__main__":
       
        
       # page = 8
        url = "XXXXX"
        menu = getallAltls(url)
        #menu = getparAltls(url, page)  
        
        f = open("tsts.txt","a")
        for i in menu:
            f.write(str(unicode(i[0]))+"	"+str(i[1])+"
    ")
        f.close()
    
  • 相关阅读:
    关于上传的种种(一)
    由SharePoint:ChangeContentType想到的
    关于上传的种种(二)
    关于上传的种种(三)
    SharePoint 2013 Suite Bar
    SharePoint 2013 商城
    自定义列表默认的视图文件
    InfoPath表单与SPD无代码工作流(一)
    列表的展示分页
    无处不在的SharePoint按钮(二)
  • 原文地址:https://www.cnblogs.com/Pythonmiss/p/11311588.html
Copyright © 2011-2022 走看看