python爬虫 - 爬取图片

文章目录

    • 1、爬取图片示例1:使用 .urlretrieve() 函数
    • 2、爬取图片示例2 - 使用 open/write 函数
    • 3、爬取图片示例3
      • 3.1 使用 open/write 下载
      • 3.2 使用 urlretrieve下载

爬虫的本质:模拟对应的App,浏览器访问对应的地址获取到数据

1、爬取图片示例1:使用 .urlretrieve() 函数

urlretrieve() 方法直接将远程数据下载到本地。下面我们再来看看 urllib 模块提供的 urlretrieve() 函数。


Help on function urlretrieve in module urllib:
  
urlretrieve(url, filename=None, reporthook=None, data=None)


import requests

from lxml import etree
from urllib import request

my_url_test = 'https://www.huya.com/g/4079'

url_response_data = requests.get(my_url_test)

response_status = url_response_data.status_code
print(f"url_response_data_text : [{response_status}]")
if response_status != 200:   # 应答码为200,表示:查询成功
    print("download failed")
else:
    # 通过.text 可以获取到当前网页 返回的一手数据
    url_response_data_text = url_response_data.text
    # print(f"url_response_data_text : [{url_response_data_text}]")

    # 通过 .HTML 可以对原始数据进行清洗(解析)
    url_response_data_eTreeHtml = etree.HTML(url_response_data_text)
    print(f"url_response_data_eTreeHtml : [{url_response_data_eTreeHtml}]")

    # 通过 .xpath() 函数,可以从一手数据中筛选所有以 img class=‘pic‘开头的图片代码块
    url_response_data_pics = url_response_data_eTreeHtml.xpath('//img[@class="pic"]')
    print(f"url_response_data_pics : [{url_response_data_pics}]")

    for i in url_response_data_pics:
        print(f"url_response_data_pic_src1 : [{i.xpath('./@data-original')}]")
        print(f"url_response_data_pic_name1: [{i.xpath('./@alt')}]")
        pic_path = i.xpath('./@data-original')[0]
        pic_name = i.xpath('./@alt')[0]

        # 下载到本地
        request.urlretrieve(pic_path, r'./test001_down/'+pic_name+".jpg")

运行结果:
在这里插入图片描述

2、爬取图片示例2 - 使用 open/write 函数

from lxml import etree
import requests
import os
if __name__=="__main__":
    
    url='https://pic.netbian.com/4kyouxi/'
    headers={
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
        }
    response=requests.get(url=url,headers=headers)
    response.encoding='gbk'#图片名称乱码时的处理方式
    page_text=response.text
    tree=etree.HTML(page_text)
    li_list=tree.xpath('//div[@class="slist"]/ul/li')
    if not os.path.exists('./4K游戏'):
        os.mkdir('./4K游戏')
    for li in li_list:
        img_src='http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
        img_name=li.xpath('./a/img/@alt')[0]+'.jpg'
        img_data=requests.get(url=img_src,headers=headers).content
        img_path='4K游戏/'+img_name
        with open(img_path,'wb') as fp:
            fp.write(img_data)
            print(img_name,"下载成功")

在 Python 中使用文件的关键函数是 open() 函数。

open() 函数有两个参数:文件名和模式。

有四种打开文件的不同方法(模式):

  • “r” - 读取 - 默认值。打开文件进行读取,如果文件不存在则报错。
  • “a” - 追加 - 打开供追加的文件,如果不存在则创建该文件。
  • “w” - 写入 - 打开文件进行写入,如果文件不存在则创建该文件。
  • “x” - 创建 - 创建指定的文件,如果文件存在则返回错误。

此外,您可以指定文件是应该作为二进制还是文本模式进行处理。

  • “t” - 文本 - 默认值。文本模式。
  • “b” - 二进制 - 二进制模式(例如图像)。

在这里插入图片描述虽然 open 函数也能实现文件的下载保存,但不建议使用IO操作,容易出现问题, for循环执行效率要快于with open的效率。

3、爬取图片示例3

3.1 使用 open/write 下载


from lxml import etree
import requests
from urllib import request

url = 'http://www.haoduanzi.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content = requests.get(url, headers=headers).text

tree = etree.HTML(url_content)

div_list = tree.xpath('//div[@id="main"]/div')[2:-1]

i = 0
for div in div_list:
    img_url = div.xpath('./div/img/@src')[0]
    img_content = requests.get(url=img_url, headers=headers).content
    request.urlretrieve(url=img_url, filename='img' + str(i) + '.jpg')
    i += 1


3.2 使用 urlretrieve下载


from lxml import etree
import requests
from uuid import uuid4
import time
from urllib import request

url = 'http://www.haoduanzi.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
url_content = requests.get(url, headers=headers).text

tree = etree.HTML(url_content)

div_list = tree.xpath('//div[@id="main"]/div')[2:-1]
filename = uuid4()
# i = 0
for div in div_list:
    img_url = div.xpath('./div/img/@src')[0]
    img_content = requests.get(url=img_url, headers=headers).content
    # request.urlretrieve(url=img_url, filename='img' + str(i) + '.jpg')
    # i += 1
    time.sleep(2)
    with open(r'C:\jupyter\day02\%s.jpg' % filename, 'wb') as f:
        f.write(img_content)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_9.6p1(亲测无问题,建议收藏)

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

centos 6设置yum源遇到的问题

由于centos6已经不被支持了,直接抄人家的命令是不行的 比如执行这些(是wget或者是curl按照自己的改) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo yum makecache会报错 需要到对应的镜像源网…

Base64编码方式简介

从二进制转为字符的一种编码。每个base64字符表示长度为6个比特的二进制数据,因此可以推得每3个字节(24比特)可以由4个base64字符组成。base64字符编码表如下: 因此需要注意的是,当二进制文件长度不是3的倍数的时候&a…

OSCP靶场--RPC1

OSCP靶场–RPC1 考点 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.227.236 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-14 22:21 EDT Nmap scan report for 192.168.227.236 Host is up (0.14s latency). …

20V/200mA高PSRR低噪声高性能车规级稳压器

概述 PCD3900 是一款高性能低压差线性稳压电源,其采用的超低噪声和超高电源抑制比(PSRR)架构对噪声敏感的信号采集和无线通信应用供电。 PCD3900 被设计为一个高性能电流基准后跟随一个高性能电压缓冲器,其可容易地通过并联以进一…

MySQL之锁详细总结

介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用外,数据也是一种供多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&…

如何在Windows使用固定公网地址SSH远程访问本地Archcraft系统

文章目录 1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 Archcraft是一个基于Arch Linux的Linux发行版,它使用最简主义的窗口管理器而不是功能齐全的桌面环境来提供图形化用户界面。 C…

MOM系统:制造企业的“神级助手“!

一、大环境下的智能化改造 嘿,亲爱的制造企业老板们,你们是否曾经为生产计划混乱、物料和设备管理无序、产品质量不稳定等等问题而头疼不已?现在,有一个超级助手可以帮助你们解决这些问题,那就是MOM系统!什…

QT、ffmpeg视频监控分屏

1、支持分屏(4,6,8,9,13,16,25,32,64)切换 2、支持拖拽效果 3、支持播放mp4,rtmp等 4、本人亲测支持播放32路,64路没做测试 5、支持读…

中职大数据技术应用就业方向解读

在信息化时代,各个行业都或多或少会需要运用到数据分析,因此大数据技术应用专业毕业生有着比较广泛的就业选择。 ●大数据技术应用● 主干课程 计算机网络基础、C语言程序设计、常用软件应用、计算机编程基础、数据库基础应用、计算机网络基础…

Upload-labs(Pass-14 - Pass-16)

Pass-14 (图片马,判断文件类型) 图片的格式在防护中通常是不会使用后缀进行判断的依据,文件头是文件开头的一段二进制码,不同类型的图片也就会有不同的二进制头。   JPEG (jpg),文件头:FF D…

The 0-1 Knapsack Problem KNAPSACK

Problem Let U {u1, u2, . . . , un} be a set of n items to be packed in a knapsack of size C. For 1 ≤ j ≤ n, let sj and vj be the size and value of the jth item, respectively. Here C and sj, vj , 1 ≤ j ≤ n, are all positive integers. Each item should e…

ELK日志收集和备份填坑实战 (滞后8个小时等时区问题)

ES的备份:ES快照备份 根据时间,每天零点在Linux机器crontab来调用api接口实现快照备份,通过快照备份,可以定准恢复到某一天的日志。 现象:(坑:但是恢复某一天日志,发现会少8小时的日…

P2P通信基本原理

在数字世界的脉络中,点对点(P2P)技术如同一条悄无声息的河流,流经信息的每个角落,连接着世界各地的计算机和设备。这种去中心化的网络模型,不仅打破了传统的客户端-服务器架构的界限,还赋予了数…

BCLinux8U6系统准备oceanbase开源数据库的 OBD 中控机

本文记录了在BCLinux8U6操作系统的虚拟服务器准备oceanbase开源数据库的 OBD 中控机的过程。 一、中控机环境 1、虚拟服务器硬件配置 2、操作系统版本信息 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)&qu…

Golang | Leetcode Golang题解之第29题两数相除

题目: 题解: func divide(dividend, divisor int) int {if dividend math.MinInt32 { // 考虑被除数为最小值的情况if divisor 1 {return math.MinInt32}if divisor -1 {return math.MaxInt32}}if divisor math.MinInt32 { // 考虑除数为最小值的情…

C语言单链表详解

链表和顺序表的区别 顺序表的底层存储空间是连续的,链表的底层存储空间是不连续的,链表的每个节点需要额外的指针来指向下一个节点,占用更多的存储空间。 顺序表的随机访问性能好,时间复杂度为O(1),链表的随机访问性能…

谷歌最强大模型Gemini 1.5 Pro免费开放了,附详细流程!

Gemini 1.5 Pro可以免费使用了。打开试了下。 下面分享一下,实际体验已经登录流程。 打开 网址,点击上方红色箭头所指的蓝色框。 https://ai.google.devhttps://ai.google.dev登录Gmail账号 输入谷歌邮箱账号,然后点击下一步。 输入密码,然

Windows文件搜索神器Everything安装配置结合内网穿透实现公网查询本地文件

文章目录 前言1.软件安装完成后,打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库,我们需要两个软件的支持,分别是cpolar(用于搭建内网穿透数据隧道…

三次握手与四次挥手到底是怎么回事?

三次握手和四次挥手是TCP/IP协议中建立和断开连接的关键步骤,它们是保证可靠通信的重要机制。这里将探讨这两个概念,并解释它们背后的原理。 三次握手 三次握手用于建立TCP连接,它由客户端和服务器之间发送的三个报文组成: 第一次…