当前位置:主页 > python教程 > Python抓取网页图片

Python抓取网页图片难点分析

发布:2023-03-04 15:00:01 59


给寻找编程代码教程的朋友们精选了相关的编程文章,网友顾浩涆根据主题投稿了本篇教程内容,涉及到Python抓取网页图片、Python抓取图片、Python抓取网页、Python抓取网页图片相关内容,已被575网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

Python抓取网页图片

一、网页图片抓取时代背景

随着网络技术的发展和互联网的普及,由于网上用户数量越来越庞大,网站同时并发的压力比较大,尤其是大型网站,因此现在网页图片都采取懒加载(Lazy Load)的方式;还出现了好多为了采集资源而出现的网络爬虫(Net spider),为了反制图片爬虫,研发人员都不会把网页的图片地址放到标签的src属性中去,而放到其他属性中去通过脚本来异步加载,或者页面中根本没有图片地址,通过专门的异步请求来单独获取和处理,还有就是针对频繁下载IP进行封号。

二、网页图片抓取难点处理

1、图片地址存放位置不同

采用以下网页图片抓取代码,把存放到不同位置的图片地址都抓取出来,:

            # 获取图片的真实地址
            if img_node_type==0:
                fileUrl=''
                # 优先src之外的其他属性,这些属性一般存放真实地址,发爬都是这样设计的
                for attrkey in img.attrs:
                    if attrkey=='src':
                        continue
                    tempurl = str(img.attrs[attrkey])
                    tempurl=get_imageurl_in_str(tempurl)
                    if tempurl=="": #当前属性值不含图片url则继续搜索其他属性值
                        continue
                    if tempurl[:4]=="http":
                        fileUrl = tempurl
                    elif tempurl[:2]=="//":
                        fileUrl = "http:"+tempurl
                    elif tempurl[:1] == "/":  # 当前页面地址作为路径
                        fileUrl = get_root_by_pageurl(pageUrl) + tempurl
                    elif tempurl[:2] == "./":  # 当前页面地址作为路径
                        fileUrl = get_root_by_pageurl(pageUrl) + tempurl[1:]
                    elif tempurl[:3] == "../":  # 当前页面地址作为路径
                        fileUrl = get_root_by_pageurl(pageUrl) + tempurl[2:]
                    if fileUrl!='':
                        break
                # 如果在其他属性未能找到图片的真实地址,则再在src属性寻找
                if fileUrl=='': #图片地址为空则不下载
                    for attrkey in img.attrs:
                        if attrkey=='src': tempurl = str(img.attrs[attrkey]) tempurl=get_imageurl_in_str(tempurl) if tempurl=="": #当前属性值不含图片url则继续搜索其他属性值     continue if tempurl[:4]=="http":     fileUrl = tempurl elif tempurl[:2]=="//":     fileUrl = "http:"+tempurl elif tempurl[:1] == "/":  # 当前页面地址作为路径     fileUrl = get_root_by_pageurl(pageUrl) + tempurl elif tempurl[:2] == "./":  # 当前页面地址作为路径     fileUrl = get_root_by_pageurl(pageUrl) + tempurl[1:] elif tempurl[:3] == "../":  # 当前页面地址作为路径     fileUrl = get_root_by_pageurl(pageUrl) + tempurl[2:] if fileUrl!='':     break

2、图片地址格式解析处理

采用以下网页图片抓取代码,可以从纷繁复杂的文本中把正确的图片地址提取处理来:

        # 按照正则方式进行匹配查找类似'http://*.jpg,https://*.jpg'
        list2_jpg = re.findall(r"http(.+?)\.jpg", pageUrl)
        list2_png = re.findall(r"http(.+?)\.png", pageUrl)
        list2 = []
        for m in range(len(list2_jpg)):
            while len(re.findall(r"http(.+?)\.jpg", list2_jpg[m] + ".jpg")) > 0:
                list2_jpg[m] = re.findall(r"http(.+?)\.jpg", list2_jpg[m] + ".jpg")[0]
            list2_jpg[m] = list2_jpg[m].replace("\\", "")  # 去掉转义反斜杠
            list2_jpg[m] = unquote(unquote(list2_jpg[m]))  # 去掉Hex字符,类似%3A%2F%2F 应为://
            list2.append("http" + list2_jpg[m] + ".jpg")
        for m in range(len(list2_png)):
            while len(re.findall(r"http(.+?)\.png", list2_png[m] + ".png")) > 0:
                list2_png[m] = re.findall(r"http(.+?)\.png", list2_png[m] + ".png")[0]
            list2_png[m] = list2_png[m].replace("\\", "")  # 去掉转义反斜杠
            list2_png[m] = unquote(unquote(list2_png[m]))  # 去掉Hex字符,类似%3A%2F%2F 应为://
            list2.append("http" + list2_png[m] + ".png")

3、防止IP被封可以采用代理Ip机制

采用以下网页图片抓取代码,可以防止本机IP被封:

       try:
            # response=requests.request('GET', pageUrl, headers=headers, proxies=ProxyPool.get_Proxy_Str(poolName), verify=False)
            response=requests.request('GET', pageUrl, headers=headers, timeout=5) #, proxies=ProxyPool.get_Proxy_Str(poolName), verify=False)
        except Exception as e:
            my_logger_debug(logger,"local request page fail,page url:[%s] " % (pageUrl))
            try: # 反爬虫:先使用本机,不行再使用代理IP
                proxy_ip_mode = int(proxyiper.getValueByKey('mode'))
                if proxy_ip_mode == 0:  # 调用代理Ip API 不同用户配置不同,按使用代理IP数量收费
                    response=requests.request('GET', pageUrl, headers=headers, timeout=5, proxies=ProxyPool.get_Proxy_Str(poolName), verify=False)
                elif proxy_ip_mode == 1:  # 使用ADSL服务器动态切换IP,按照租赁ADSL服务器收费
                    switchIp(logger)
                    response = requests.request('GET', pageUrl, headers=headers,                     timeout=5)  # , proxies=ProxyPool.get_Proxy_Str(poolName), verify=False)
            except Exception as e:
                my_logger_debug(logger, e)
                my_logger_debug(logger,"proxy request page fail,page url:[%s]" % (pageUrl))
                return

三、网页图片抓取场景分类

基本现在的网页图片抓取场景可以分为2种:

场景1:原来从各大搜索引擎(例如百度、360、搜狐等)和知名图片网站(昵图网、汇图网等),输入图片关键词进行搜索,然后一页一页翻看图片搜索结果,现在想在下载工具上输入图片关键字,一键把图片搜索结果下载到本地。

场景2:从指定的网站首页或网站内页(包括单个页面或多个页面)上一键下载图片到本地计算机上,如果要把某个网站所有页面上的图片都下载下来,可以先使用类似SiteMap X这种网站地图扫描工具,然后再把地址文件导入图片抓取工具来下载。Demo示例截图如下:、

有相关经验或碰到类似问题的同学,可以后台评论区留言大家一起交流讨论。

到此这篇关于Python抓取网页图片难点分析的文章就介绍到这了,更多相关Python抓取网页图片内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • Python抓取网页乱码的解决方法分析

    发布:2019-07-01

    ​本篇文章给大家带来的内容是关于Python抓取网页乱码的原因及解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。


  • 如何利用python抓取网页中链接的静态图片

    发布:2020-01-19

    这篇文章主要为大家详细介绍了python抓取网页中链接的静态图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论