爬虫系列(六)--爬取页面上的图像

本文介绍了一种利用Python爬虫技术抓取网页图片的方法,包括如何下载单张图片、获取页面上所有图片URL及批量下载。通过具体实例展示了从指定网页抓取图片的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

爬虫系列(六)--爬取页面上的图像

马上国庆节了,要是再不写,可能又要到了十一过后才能写了。图像的爬取和普通页面的爬取是一样的,只是不需要进行转码,是二进制数据,直接写入文件中就行了。要注意的地方就是文件扩展名,还有图片文件是否已经存在了。


1.目标简介

下面的内容要实现的是爬取取某个指定页面上的图片。要是想要爬取指定区域内的图片或者是全站图片的话,需要结合前面的几篇文章的内容,稍微组合一下即可。

任务分解

  • 单张图片下载:给一个图片url,下载下来
  • 提取出页面上需要的图片的url

2.图片下载

这里实现一个函数,函数需要一个url,和一个文件路径和名称,把该图片下载到本地。

from urllib import request
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }

def download_image(load_url,file_path_name,header=None):
    success=True
    try:
        req = request.Request(url=load_url,headers=header)#创建请求对象
        connect = request.urlopen(req)#打开该请求
        byte_res = connect.read()#读取所有数据,很暴力
        
        #写入文件
        f=open(file_path_name,"wb")
        f.write(byte_res)
        f.close()
    except Exception as e:
        print(e)
        success=False
    return success

#测试调用
url="https://bpic.588ku.com//ppt_face/20/18/09/3930044398d0f5fc45c520f6a663c39d.jpg"
fp="./bbb.jpg"
download_image(url, fp, header_dict)

3.获取页面上的所有图片url

这个和前面某篇文章中的获取其他页面链接是一样的。这里也写成一个函数。

from urllib import request
from lxml import etree
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }
def get_http(load_url,header=None):
    res=""
    try:
        req = request.Request(url=load_url,headers=header)#创建请求对象
        connect = request.urlopen(req)#打开该请求
        byte_res = connect.read()#读取所有数据,很暴力
        try:
            res=byte_res.decode(encoding='utf-8')
        except:
            try:
                res=byte_res.decode(encoding='gbk')
            except:
                res=""
    except Exception as e:
        print(e)
    return res

def get_page_images(url):
    html_text=get_http(url,header_dict)
    tree=etree.HTML(html_text)
    dir(tree)
    img_urls=tree.xpath("//img/@src")
    return img_urls
url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml"
urls=get_page_images(url)
print(urls)
#输出:['//beacon.sina.com.cn/a.gif?noScript', '//i.sso.sina.com.cn/images/login/thumb_default.png'...]

4.组装2和3

from urllib import request
from lxml import etree
header_dict = {
    "Accept":"application/json, text/javascript, */*; q=0.01",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    }

#图像下载
def download_image(load_url,file_path_name,header=None):
    success=True
    try:
        req = request.Request(url=load_url,headers=header)#创建请求对象
        connect = request.urlopen(req)#打开该请求
        byte_res = connect.read()#读取所有数据,很暴力
        
        #写入文件
        f=open(file_path_name,"wb")
        f.write(byte_res)
        f.close()
    except Exception as e:
        print(e)
        success=False
    return success

#页面下载
def get_http(load_url,header=None):
    res=""
    try:
        req = request.Request(url=load_url,headers=header)#创建请求对象
        connect = request.urlopen(req)#打开该请求
        byte_res = connect.read()#读取所有数据,很暴力
        try:
            res=byte_res.decode(encoding='utf-8')
        except:
            try:
                res=byte_res.decode(encoding='gbk')
            except:
                res=""
    except Exception as e:
        print(e)
    return res

#获取全部图像url
def get_page_images(url):
    html_text=get_http(url,header_dict)
    tree=etree.HTML(html_text)
    dir(tree)
    img_urls=tree.xpath("//img/@src")
    return img_urls


url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml"
urls=get_page_images(url)
namei=1001
for url in urls:
    url="http:"+url
    file_name="./img_"+str(namei)
    if url.find(".jpg")>=0:
        file_name+=".jpg"
    elif url.find(".png")>=0:
        file_name+=".png"
    elif url.find(".gif")>=0:
        file_name+=".gif"
    elif url.find(".jpeg")>=0:
        file_name+=".jpeg"
    else:
        print("未知图片类型",url)
        continue
    state=download_image(url,file_name,header_dict)
    if state:
        namei+=1
    else:
        print("下载失败",url)


下一篇爬虫文章的内容暂时保密,18年国庆过后写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值