站长素材图片的爬取(爬取俄罗斯高清图片名称和地址)
地址:https://sc.chinaz.com/tupian/eluosi.html
我们先来分析下页面,获取图片名称和地址定位:
我们很容易获取到了图片名称和地址是在<div id="container">
/<div>
/<div>
/<a>
/<img>
标签下,我们用xpath来解析下:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
url = 'https://sc.chinaz.com/tupian/eluosi.html'
response = requests.get(url=url, headers=headers)
response.encoding = 'utf-8'
page_text = response.text
# 开始解析
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@id="container"]/div/div')
for div in div_list:
# 局部数据解析
title = div.xpath('./a/img/@alt')
img_src = div.xpath('./a/img/@src')
# 打印下,看下结果
print(title,img_src)
我们发现,图片名称没问题,但地址却没有提取出来。。。
难道代码流程写错了吗?如果错的话,那名称怎么会正常提取的到呢?
好吧,我们再来分析下源码:
翻着翻着,我突然发现,后面的图片地址属性不是src,而是src2。
这是上面原因呢?
原来,图片在没加载的时候是src2,加载后那就是src。(我们可以在Network里的响应看下,这里肯定都是没加载的静态数据)
那我们提取的属性就应该是src2,那改下代码看下:
for div in div_list:
title = div.xpath('./a/img/@alt')
img_src = div.xpath('./a/img/@src2')
print(title,img_src)
果然,全都获取到了。
上述问题解释:
这里涉及到了又一个反爬机制:图片懒加载
反爬机制:图片懒加载,广泛应用在了一些图片的网站中。
只有当图片被显示在浏览器可视化范围之内,才会将img的伪属性变成真正的属性。
如果是requests发起的请求,requests请求是没有可视化范围,因此我们一定要解析的是img伪属性的属性值(图片地址)
到此,我的文章所学过的反爬机制:
roboys UA伪装 动态加载数据的捕获 图片懒加载
后面我们会学习更多的反爬机制!
好了,既然我们都获取到了,现在我们下载前五页的图片。
完整代码如下:
import requests
from lxml import etree
import os
# 创建文件夹保存图片
dirName = 'eluosi'
if not os.path.exists(dirName):
os.mkdir(dirName)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
# url模板
url = 'https://sc.chinaz.com/tupian/eluosi_%d.html'
# 循环5次,爬取5页
for page in range(1, 6):
if page == 1:
new_url = 'https://sc.chinaz.com/tupian/eluosi.html'
else:
new_url = format(url % page)
response = requests.get(url=new_url, headers=headers)
response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@id="container"]/div/div')
# 局部数据分析
for div in div_list:
title = div.xpath('./a/img/@alt')[0]
img_src = 'https:' + div.xpath('./a/img/@src2')[0]
img_path = dirName + '/' + title + '.jpg'
img_data = requests.get(url=img_src, headers=headers).content
# 保存图片
with open(img_path, 'wb+') as f:
f.write(img_data)
print(title + ' 下载成功!')
最后,肤白貌美大长腿的俄罗斯美女就下载到了硬盘了
关注 Python涛哥,学习更多Python知识!