网页图片的批量爬取保存
- 分析思路
- 预备知识
- 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“,可以查看网页的源码,来看下编码方式。
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解析图片数据,首先找到图片路径和名称。
从网页源代码可以看出,图片的地址都在一个<li>标签里面
我们通过一个循环来拿到全部的标签的内容,由于它的完整地址是
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文件夹下面满满的图片
完整代码图片爬取,需要自取,笔者写的很粗糙,还可以更精细