requests-html库轻体验-HTMLSession下载表情包
requests-html实战,HTMLSession下载斗图啦最新表情包
前言
在这篇文章之前,我写了requests入门实践02_下载斗图拉最新表情包用正则表达式提取url,来下载斗图啦最新表情包,前几天我去查看时,直接就翻车了,代码根本提取不到表情包的URL咯,昨天意外看到一个视频,想到了直接用html解析库来改造(没错2020年7月我才想到用html解析库来处理响应, 这博主是真的菜).
依赖库
该脚本文件使用了:requests库, requests-html库, loguru库(可选,如果不需要,你得把文件中logger/loguru相关的内容给干掉)
安装方法: pip install requests requests-html loguru
requests-html
官方文档:
https://requests.readthedocs.io/projects/requests-html/en/latest/
https://cncert.github.io/requests-html-doc-cn/#/
全面支持解析JavaScript!
CSS 选择器 (jQuery风格, 感谢PyQuery).
XPath 选择器, for the faint at heart.
自定义user-agent (就像一个真正的web浏览器).
自动追踪重定向.
连接池与cookie持久化.
令人欣喜的请求体验,魔法般的解析页面.
该脚本用的方法概览:
from requests_html import HTMLSession
# 相当于requests.Session(),它会自动记录并在所有请求之间持久保存cookie
session = HTMLSession()
# 请求方法,参数与requests一致
res = session.get(url='http://www.baidu.com/')
# 提取响应的html文件中所有的超链接(相对路径提取):注意只能提取到 <a herf="提取到这里的链接">
res.html.links
# 绝对url路径提取
res.html.absolute_links
# 通过css查找指定元素,(这需要一点css基础???)
about = res.html.find('#about', first=True) # 解析:从响应的html文件中,查找ID为about的元素,first=True只返回第一个,first=False返回所有,返回值是一个list # 通过xpath查找指定元素,返回一个list (这就需要xpath基础了)
res.html.xpath("//div[contains(@class,'page-content')]//a//img/@data-original") # 解析:// - html根目录,div[contains(@class, 'page-content')] - class为contains的div元素,下面的 class为page-content的元素, //a//img - 元素下的a标签下的img标签 , /@data-original - 属性为data-original的值 # 通过查找到的element元素,得到下方所有的属性与值,返回形式是dict
about.attrs
脚本一览
# 安装:pip install requests (必须)
# 安装:pip install requests-html (必须)
# 安装:pip install loguru (可选)
# HTMLSession 同步会话
import time
from requests_html import HTMLSession
# 创建文件目录
import os
# 日志库
from loguru import logger
"""
为避免下载重复图片,请选择注释掉文中不需要的文件名称处理方法,也可任意组合下载方法,文件名称处理方法
"""
class Dowanlod_Image(object):
def __init__(self, save_path='./img/'):
"""
:param save_path: 文件保存目录,默认当前目录下新建img文件夹
"""
self.save_path = save_path
# 日志存放位置
logger.add(f"file_{time.time()}.log")
# 创建目录存放文件
os.makedirs(save_path, exist_ok=True)
logger.info(f'{save_path.split("/")[-1]}文件夹创建成功.')
# 同步会话实例
self.session = HTMLSession()
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/84.0.4147.89 Safari/537.36',
}
logger.info(f'session已实例化:{self.session}.')
@logger.catch
def main(self, start_page: int = 1, end_page: int = 2):
"""
:param start_page: 默认参数,从第x页开始下载
:param end_page: 默认参数,下载第y页之前的
:return:
"""
for index in range(start_page, end_page):
# 访问斗图啦最新表情第index页
base_url = f'https://www.doutula.com/photo/list/?page={index}'
res = self.session.get(url=base_url, headers=self.headers)
logger.info(f'请求{base_url}后得到的响应html{res.text}.')
# 含links方法只能获取 a herf标签
# print(res.html.absolute_links, '\n', type(res.html.absolute_links))
# 图片url 提取 :方法1
# 选取element对象-css查找,first=True,只返回第一个,False返回所有
img_element = res.html.find('.page-content .col-xs-6 img', first=False)
logger.info(f'通过css查找.page-content .col-xs-6 img,得到的所有element对象.')
# 图片url 提取: 方法2
# xpath 直接提取出图片的链接,列表形式返回
img_url_list = res.html.xpath("//div[contains(@class,'page-content')]//a//img/@data-original")
logger.info(f'通过xpath查找到img标签中data-original属性的值,也就是我们需要的图片url.')
# 文件名称处理:适配图片url提取-方法1
for data in img_element:
# attrs返回element对象所有的属性字典
# 图片实际url
img_url = data.attrs.get('data-original')
# 文件后缀名
img_suffix = img_url.split('.')[-1]
# 完整文件名
img_name = data.attrs.get('alt').join(['', f'.{img_suffix}'])
# 文件名称处理,不能包含:\ / : * ? " < > |
wor_list = ['\\', '/', ':', '*', '?', '"', '<', '>', '|']
for wor in wor_list:
if wor in img_name:
img_name = img_name.replace(wor, '_')
# print(img_url, img_name)
self.req_download(img_url, img_name)
# 文件名称处理:适配图片url提取-方法2: 这种方法整体简洁,但是没有中文文件名
for img_url in img_url_list:
img_name = img_url.split('/')[-1]
# print(img_url, img_name)
self.ute_download(img_url, img_name)
def ute_download(self, img_url, img_name):
# 下载图片方法1:全适配
from urllib.request import urlretrieve
# 传入url, 文件保存路径
urlretrieve(img_url, f'./{self.save_path}{img_name}')
logger.info(f'{img_name}下载完成.')
def req_download(self, img_url, img_name):
# 下载图片方法2:全适配
# 需单独请求图片url接口
rep = self.session.get(img_url, headers=self.headers)
with open(f'{self.save_path}{img_name}', 'wb') as f:
# 写入二进制文件
f.write(rep.content)
logger.info(f'{img_name}下载完成.')
if __name__ == '__main__':
start_time = time.time()
d_img = Dowanlod_Image()
d_img.main(2, 3)
end_time = time.time()
run_time = end_time - start_time
logger.debug("=====================")
logger.info(f'运行耗时{run_time}.')
实际结果

代码Gitee库地址
https://gitee.com/zy7y/study_packages.git
参考资料
https://www.cnblogs.com/-wenli/p/10160351.html
https://requests.readthedocs.io/projects/requests-html/en/latest/
https://cncert.github.io/requests-html-doc-cn/#/?id=element类
requests-html库轻体验-HTMLSession下载表情包的更多相关文章
- 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...
- requests入门实践02_下载斗图拉最新表情包
新版本移步:https://www.cnblogs.com/zy7y/p/13376228.html 下载斗图拉最新表情包 要爬取的目标所在网址:http://www.doutula.com/phot ...
- Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...
- requests第三方库
requests第三方库 简介: requests是一个优雅而简单的Python 第三方HTTP请求库,专为人类而构建. requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档:ht ...
- python +requests 爬虫-爬取图片并进行下载到本地
因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地 爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...
- 爬虫(一)—— 请求库(一)requests请求库
目录 requests请求库 爬虫:爬取.解析.存储 一.请求 二.响应 三.简单爬虫 四.requests高级用法 五.session方法(建议使用) 六.selenium模块 requests请求 ...
- Python浅谈requests三方库
requests 三方库用于获取URL资源 1.GET请求访问一个页面 import requests r = requests.get('https://www.cnblogs.com/xqxacm ...
- Python用pip安装第三方库时换源下载
pip默认是从Python官网下载第三方库,从国外下载当然不如从国内下载来得快 豆瓣:https://pypi.doubanio.com/simple 还有其它源,阿里云等等,一个就够用了 用pip安 ...
- requests实现文件下载, 期间显示文件信息&下载进度_python3
requests实现文件下载, 期间显示文件信息&下载进度 """使用模块线程方式实现网络资源的下载 # 实现文件下载, 期间显示文件信息&下载进度 # ...
随机推荐
- UDP/TCP 流程与总结
1 UDP流程 前序:可以借助网络调试助手工具进行使用 1 UDP 发送方 1 创建UDP套接字 2 准备目标(发送方) IP和端口 3 需要发送的数据内容 4 关闭套接字 from socket i ...
- 结合SpEL使用@Value-基于配置文件或非配置的文件的值注入-Spring Boot
本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 在使用spring框架的项目中,@Value是经常 ...
- day07总结
元组常用操作 # ======================================基本使用======================================# 1.用途:元组就是 ...
- Halcon一维测量1D Measuring解析
一维测量(也叫一维计量或卡尺)的概念非常直观.沿着一个预定的区域(主要是垂直于RIO感兴趣区域的方向) 边缘的位置.这里的边缘为从暗到亮或从亮到暗的过渡. 基于提取的边缘,可以测量零件的尺寸.例如,可 ...
- python数据处理(四)之数据获取与存储
1.前烟 几个数据问题 1.1 是否能够联系上作者本人 1.2 数据是否定期检查错误并更新 1.3 数据是否包含数据获取方法的信息,是否包含数据获取过程中使用的样本类型 1.4 有没有其他数据源可以验 ...
- softmax、cross entropy和softmax loss学习笔记
之前做手写数字识别时,接触到softmax网络,知道其是全连接层,但没有搞清楚它的实现方式,今天学习Alexnet网络,又接触到了softmax,果断仔细研究研究,有了softmax,损失函数自然不可 ...
- Java设计模式 --- 七大常用设计模式示例归纳
设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 行为型模式:模 ...
- Flink之对时间的处理
window+trigger+watermark处理全局乱序数据,指定窗口上的allowedLateness可以处理特定窗口操作的局部事件时间乱序数据 1.流处理系统中的微批 Flink内部也使用了某 ...
- 题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没 ...
- 题解 洛谷 P4098 【[HEOI2013]ALO 】
考虑原序列中的每一个值作为构成最终答案的那个次大值,那么其所在的合法区间最大时,其对答案的贡献最大. 一个值作为最大值时有两个合法的最大区间,一个是左边第二个比其大的位置和右边第一个比其大的位置构成的 ...