一、网页图片抓取时代背景
随着网络技术的发展和互联网的普及,由于网上用户数量越来越庞大,网站同时并发的压力比较大,尤其是大型网站,因此现在网页图片都采取懒加载(Lazy Load)的方式;还出现了好多为了采集资源而出现的网络爬虫(Net spider),为了反制图片爬虫,研发人员都不会把网页的图片地址放到<image>标签的src属性中去,而放到其他属性中去通过脚本来异步加载,或者页面中根本没有图片地址,通过专门的异步请求来单独获取和处理,还有就是针对频繁下载IP进行封号。
二、网页图片抓取难点处理
1、图片地址存放位置不同
采用以下网页图片抓取代码,把存放到不同位置的图片地址都抓取出来,:
# 获取图片的真实地址if img_node_type==0:fileUrl=''# 优先src之外的其他属性,这些属性一般存放真实地址,发爬都是这样设计的for attrkey in img.attrs:if attrkey=='src':continuetempurl = str(img.attrs[attrkey])tempurl=get_imageurl_in_str(tempurl)if tempurl=="": #当前属性值不含图片url则继续搜索其他属性值continueif tempurl[:4]=="http":fileUrl = tempurlelif tempurl[:2]=="//":fileUrl = "http:"+tempurlelif tempurl[:1] == "/": # 当前页面地址作为路径fileUrl = get_root_by_pageurl(pageUrl) + tempurlelif 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则继续搜索其他属性值continueif tempurl[:4]=="http":fileUrl = tempurlelif tempurl[:2]=="//":fileUrl = "http:"+tempurlelif tempurl[:1] == "/": # 当前页面地址作为路径fileUrl = get_root_by_pageurl(pageUrl) + tempurlelif 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、图片地址格式解析处理
采用以下网页图片抓取代码,可以从纷繁复杂的文本中把正确的图片地址提取处理来:
# 按照正则方式进行匹配查找类似'*.jpg,*.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:# responsequest('GET', pageUrl, headers=headers, proxies_Proxy_Str(poolName), verify=False)responsequest('GET', pageUrl, headers=headers, timeout=5) #, proxies_Proxy_Str(poolName), verify=False)except Exception as e:my_logger_debug(logger,"local request page fail,page url:[%s] " % (pageUrl))try: # 反爬虫:先使用本机,不行再使用代理IPproxy_ip_mode = ValueByKey('mode'))if proxy_ip_mode == 0: # 调用代理Ip API 不同用户配置不同,按使用代理IP数量收费responsequest('GET', pageUrl, headers=headers, timeout=5, proxies_Proxy_Str(poolName), verify=False)elif proxy_ip_mode == 1: # 使用ADSL服务器动态切换IP,按照租赁ADSL服务器收费switchIp(logger)response = quest('GET', pageUrl, headers=headers,timeout=5) # , proxies_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示例截图如下:、
有相关经验或碰到类似问题的同学,可以后台评论区留言大家一起交流讨论。
本文发布于:2024-01-29 13:04:36,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650467615484.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |