爬取分页彼岸图网图片
爬取图片:
1.获取待爬取网站主页网址
2.如果要分页爬取的话,观察一下每个页面主页网址,可以发现 (第一页num为空,从第二页开始有num数值)http://pic.netbian.com/4kmeinv/index_{num}.html
每次是num位置的改变,对应的num值代表页数
3.首先爬取主页信息并进行页面数据预处理
4.笔记本Fn+F12(或者右键 ‘检查’ )进入页面开发者模式
先点击左边图标,变蓝色后点击要定位的图片,可以获取图片对应的元素
可以发现 img 标签里 src属性存储的是图片下载链接的后半部分,前半部分是彼岸图网原始地址:http://pic.netbian.com/;alt存储的是图片名称。观察此标签的上层目录,可以发现有一个 li 标签的列表,每张图片的链接和名称都放在对应li标签中,每个li标签内部结构相同,这就非常有利于遍历 li 列表进行图片爬取
补充一些xpath解析的基础知识方便理解:
然后理解下面代码就简单了
li_list = tree.xpath('//div[@class="slist"]/ul/li')
表示从任意位置开始查找class="slist"的标签,然后寻找此标签下的ul,再寻找ul下的li标签
detail_url = 'http://pic.netbian.com/' + li.xpath('.//a/img/@src')[0]
表示从当前位置获取下级的a标签,再在a标签找下面img标签,获取src属性值
爬取名称时可能出现乱码, 我们将编码转化为gbk格式
detail_name = detail_name.encode('iso-8859-1').decode('gbk')
下面是爬取每一张图片页面的详细信息:
detail_data = requests.get(url=detail_url, headers=headers).content
设置存储路径并以二进制形式(’wb‘)保存
detail_path = f'p{num}/' + detail_name
with open(detail_path, 'wb') as fp:
fp.write(detail_data)
print(detail_name, '爬取完毕')
下面是源代码+详细注释:
# 分页爬取图片
import requests
import os
from lxml import etree
print('# -*- coding: utf-8 -*-\n\
# @Author : Fuzihao ')
print('图片内容在p开头文件夹中')
start = int(input('请输入开始的页数(从2开始吧): '))
end = int(input('请输入结束的页数(最好不要超过170: '))
for num in range(start, end + 1):
# 网站主页
url = f"http://pic.netbian.com/4kmeinv/index_{num}.html"
# 设置headers,进行UA伪装,模拟浏览器,可换为自己浏览器的UA
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
# get到的主页数据
page_text = requests.get(url=url, headers=headers).text
# 使用etree进行网页数据预处理
tree = etree.HTML(page_text)
# 获取li标签列表
li_list = tree.xpath('.//div[@class="slist"]/ul/li')
# 如果不存在p{num}文件夹则创建
if not os.path.exists(f'./p{num}'):
os.mkdir(f'./p{num}')
print(f'正在爬取第{num}页')
# 遍历所有li标签
for li in li_list:
# 每张图片具体网址
detail_url = 'http://pic.netbian.com/' + li.xpath('.//a/img/@src')[0]
# 图片名称
detail_name = li.xpath('.//a/img/@alt')[0] + '.jpg'
# 防止文件名出现乱码
detail_name = detail_name.encode('iso-8859-1').decode('gbk')
# 待爬取图片的具体信息
detail_data = requests.get(url=detail_url, headers=headers).content
# 文件保存路径及文件名
detail_path = f'p{num}/' + detail_name
# 二进制形式存储图片
with open(detail_path, 'wb') as fp:
fp.write(detail_data)
print(detail_name, '爬取完毕')
pycharm中格式化代码快捷键 (规范代码格式):Ctrl+Alt+L