抓取素材
4K壁纸_4K手机壁纸_4K高清壁纸大全_电脑壁纸_4K,5K,6K,7K,8K壁纸图片素材_彼岸图网
思路:
1、运用requests模块获取整个页面代码
2、用xpath的功能解析数据,获取到我们需要的数据
3、获取子页面的代码后用xpath功能解析数据,获取所需要的图片
4、进行图片下载存储
第一步:导包
import requests from lxml import etree import os
第二步:指定url
url = "https://pic.netbian.com/4krenwu/"
第三步:进行UA伪装(此处代码没打全,要全部复制的)
headers = { 'User-Agent': 'Mozilla/5.0' }
第四步:请求发送
page_text = requests.get(url=url,headers=header) #手动设定响应数据的编码格式 page_text.encoding = 'gbk' response = page_text.text
注意:这里手动设定响应数据的编码格式是因为原网页的编码格式不是utf-8,如果不进行编码格式转换,获取到的代码中若出现中文则会出现乱码情况。
第五步:数据解析,获取src属性值和alt属性值
tree = etree.HTML(response) li_list = tree.xpath('//div[@class="slist"]/ul/li')
我们所需图片的src在<div class="slist">这个大盒子中,故xpath的路劲为:/html/body/div[2]/div/div[3],其中div[3]代表<div class="slist">,故而再精确定位到ul中的li就可以到达各个图片的位置。
第六步:for循环找到div中所有a的href
for li in li_list: img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
第七步:请求子页面
child_response = requests.get(img_a) # 请求到子页面 child_response.encoding = "gbk" child_responses = child_response.text tree = etree.HTML(child_responses) child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
第八步:for循环获得子页面图片的src属性值和alt属性值
for a in child_div: img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0] img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
第九步:存储
#创建文件夹 if not os.path.exists('./4k大图'): os.mkdir('./4k大图') # 替换文件名中的非法字符 img_name = img_name.replace('*', '_') # 将 * 替换为 _ #持久化储存 img_data = requests.get(url=img_src,headers=header) img_path = "4k大图/" + img_name with open(img_path, mode='wb') as fp: fp.write(img_data.content) print(img_name,'下载成功!!')
完整代码
import requests
from lxml import etree
import os
if __name__ == '__main__':
url = "https://pic.netbian.com/4krenwu/"
header = {
'User-Agent' : 'Mozilla/5.0'#没复制完
}
page_text = requests.get(url=url, headers=header)
#手动设定响应数据的编码格式
page_text.encoding = 'gbk'
response = page_text.text
#数据解析:src属性值 alt属性值
tree = etree.HTML(response)
li_list = tree.xpath('//div[@class="slist"]/ul/li')
#创建文件夹
if not os.path.exists('./4k大图'):
os.mkdir('./4k大图')
for li in li_list:
img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
#请求子页面
child_response = requests.get(img_a)
child_response.encoding = "gbk"
child_responses = child_response.text
tree = etree.HTML(child_responses)
child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
for a in child_div:
img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0]
img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
# print(img_alt,img_src)
# 替换文件名中的非法字符
img_name = img_alt.replace('*', '_') # 将 * 替换为 _
# 持久化储存
img_data = requests.get(url=img_src, headers=header)
img_path = "4k大图/" + img_name
with open(img_path, mode='wb') as fp:
fp.write(img_data.content)
print(img_name, '下载成功!!')
翻页提取数据
for page in range(2,4): url = (f"https://pic.netbian.com/4krenwu/index_{page}.html") print(f'第{page}页获取成功')
下面的代码只提取第2页~第3页的内容,添加后的完整代码:
import requests
from lxml import etree
import os
if __name__ == '__main__':
url = "https://pic.netbian.com/4krenwu/"
header = {
'User-Agent' : 'Mozilla/5.0 ' #没复制完整
}
for page in range(2,4):
url = (f"https://pic.netbian.com/4krenwu/index_{page}.html")
print(f'第{page}页获取成功')
page_text = requests.get(url=url, headers=header)
#手动设定响应数据的编码格式
page_text.encoding = 'gbk'
response = page_text.text
#数据解析:src属性值 alt属性值
tree = etree.HTML(response)
li_list = tree.xpath('//div[@class="slist"]/ul/li')
#创建文件夹
if not os.path.exists('./4k大图'):
os.mkdir('./4k大图')
for li in li_list:
img_a = 'https://pic.netbian.com' + li.xpath('./a/@href')[0]
#请求子页面
child_response = requests.get(img_a) # 请求到子页面
child_response.encoding = "gbk"
child_responses = child_response.text
tree = etree.HTML(child_responses)
child_div = tree.xpath('/html/body/div[2]/div[1]/div[3]/div[1]/div[2]')
for a in child_div:
img_src = 'https://pic.netbian.com' + a.xpath('./a/img/@src')[0]
img_alt = a.xpath('./a/img/@alt')[0] + '.jpg'
# print(img_alt,img_src)
# 替换文件名中的非法字符
img_name = img_alt.replace('*', '_') # 将 * 替换为 _
# 持久化储存
img_data = requests.get(url=img_src, headers=header)
img_path = "4k大图/" + img_name
with open(img_path, mode='wb') as fp:
fp.write(img_data.content)
print(img_name, '下载成功!!')
总结
1、在存储的时候,我发现我会出现OSError: [Errno 22] Invalid argument: 'piclibs\\肖战3840*2560 4k壁纸.jpg'的错误,后来发现问题出在文件名中的特殊字符上,因为在文件系统中,* 是一个通配符,可能不被允许作为文件名的一部分,所以我把文件名中的非法字符进行替换:
img_name = img_name.replace('*', '_')
2、关于翻页提取数据,目前的我只能从第二页开始提取,因为该网页的代码第1页居然不是index_1.html,所以我按照规律先抓取第一页再从第二页开始循环。如果有更好的方法,欢迎指正。