Python爬虫从入门到精通:(11)数据解析_站长素材图片的爬取(爬取俄罗斯高清图片名称和地址)* _Python涛哥

45 篇文章 18 订阅

站长素材图片的爬取(爬取俄罗斯高清图片名称和地址)

地址: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知识!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值