python爬虫实战零基础(2)——网页图片

网页图片的批量爬取保存

  • 分析思路
  • 预备知识
    • xpath用法
    • response.text和 response.content两者的区别
  • 代码实战
    • 请求网页内容
    • 批量图片保存

分析思路

还是基于request和xpath的爬虫代码

  • 定位目标网址(里面图片还是很好看的 https://pic.netbian.com/4kdongman/index.html)
  • 分析网页结构,找到目标图片网址
  • request请求网址,xpath获取地址和名称
  • 批量下载并保存到本地

嗯,逻辑清楚

预备知识

xpath用法

选择某个标签,使用 /,也可以多层查找,如/html/body/h2
获取所有信息,使用 //,如//p,将p标签的所有信息都提取出来
获取文本内容:text()
获取注释:comment()
获取其它任何属性:@xx,如:@href、@src、@title

更多详细的语法可以看这个,很清楚的讲解
xpath语法基础

response.text和 response.content两者的区别

requests对象的get和post方法都会返回一个Response对象, 这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。其中返回的网页部分会存在.content和.text 两个对象中

两者区别在于:

  • content中间存的是字节流数据 ,
  • text中存的是根据requests模块自己猜测的编码方式将content内容编码成Unicode

我们使用requests.content输出的内容是需要解码的(因为网页上的内容是编码而成的,而在Python中字符串形式是以Unicode形式存在的,当然我们只想看到那些字符串,不想看到那些乱七八糟的字节,所以我们爬下来的东西才需要去解码)

1.使用content输出

print(response.content.decode('utf-8')# 以utf-8的编码的方式解码为Unicode

2.使用text输出

response.encoding = 'utf-8'  # 为请求的网页指定该网页的编码方式
print(response.text)

代码实战

请求网页内容

依旧是 requests 库直接请求,可以看上一篇(是一样的)传送门
在请求网页时,我们需要将我们的爬虫伪装成浏览器,具体通过添加请求头 headers 实现。
请求头以字典的形式创建,可以包括很多内容,主要关注:User-Agent, Cookie

这个网页的解码一般是“utf-8“或者“gbk“,可以查看网页的源码,来看下编码方式。
python爬虫实战零基础(2)——网页图片_第1张图片

import time
import requests
from lxml import etree    #这是导入xpath模块

headers= {
    'User-Agent': '...',
    'Cookie': '...',
}
url="https://pic.netbian.com/"
resp=requests.get(url=url,headers=headers)
main_text = resp.content.decode('gbk')
print(main_text)

有输出,证明请求成功。

批量图片保存

接着,我们用xpath解析图片数据,首先找到图片路径和名称。

从网页源代码可以看出,图片的地址都在一个

  • 标签里面
    python爬虫实战零基础(2)——网页图片_第2张图片
    我们通过一个循环来拿到全部的标签的内容,由于它的完整地址是
    https://pic.netbian.com/uploads/allimg/230819/143449-169242688936cb.jpg,
    而我们获取的地址是
    /uploads/allimg/230819/143449-169242688936cb.jpg,
    由此我们可以看出图片的整个url缺的是https://pic.netbian.com,然后通过代码把它们拼接在一起。
    接着上面的继续写,具体代码如下:

    resp.encoding="gbk"
    tree=etree.HTML(resp.text)
    
    tu_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
    for tu in tu_list:
        tu_html = url + tu.xpath("./a/img/@src")[0]   #循环获取图片的url
        name = tu.xpath("./a/img/@alt")[0]  # 获取图片名称
        print(tu_html)
        print(name)
    
    

    输出结果为:

    https://pic.netbian.com/uploads/allimg/230819/143449-169242688936cb.jpg
    彼岸图网原创 蓝色裙子美女 唯美 鲜花 4k壁纸
    https://pic.netbian.com/uploads/allimg/230817/133011-16922502118cba.jpg
    敦煌美女 唯美 彼岸图网原创 4K壁纸
    ...
    

    图片url和名称我们都有了,接下来就是保存了,

    tu_get = requests.get(url=html, headers=headers).content # 响应为二进制(bytes)形式
    name_path = "img/" + name + '.jpg'
    with open(name_path,"wb") as f:
         f.write(tu_get)
         print(name , "下载完成")
    

    注意,我们需要往后点几页看下它的URL,就会发现它们之间是有点不同的
    第一页,https://pic.netbian.com/4kdongman/index.html
    第二页,https://pic.netbian.com/4kdongman/index_2.html
    第三页,https://pic.netbian.com/4kdongman/index_3.html
    。。。
    因此,可以在代码中加一条判断

    根据网页url的规律,来得到要爬取的网址,接着我们把之前的代码封装成一个函数 get_pic,循环爬取前5页的图片,并保存至本地。

    for i in range(1,6):
        if i == 1:
            url = "https://pic.netbian.com/4kdongman/index.html"
        else:
            url = "https://pic.netbian.com/4kdongman/index_{}.html".format(i)
        print('这是第'+str(i)+"页数据")
    

    OK,测试成功,可以看到img文件夹下面满满的图片
    python爬虫实战零基础(2)——网页图片_第3张图片
    完整代码图片爬取,需要自取,笔者写的很粗糙,还可以更精细

  • 你可能感兴趣的:(python爬虫,python,爬虫,开发语言)