【愚公系列】《Python网络爬虫从入门到精通》007-请求模块requests高级应用(Reguests-HTML)
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
🚀前言
在当今数据驱动的时代,网络爬虫和数据采集变得越来越重要。Python作为一门强大的编程语言,其requests库因其简单易用而广受欢迎,但在处理复杂的网页内容时,单靠requests可能并不足够。这时候,Requests-HTML模块的出现,为我们提供了更为强大的工具,使得抓取和解析网页变得更加高效和便捷。
Requests-HTML是基于requests库构建的,它不仅支持简单的HTTP请求,还具备强大的HTML解析功能,能够轻松处理动态内容和JavaScript渲染的页面。在本期文章中,我们将深入探讨Requests-HTML的各种高级应用,涵盖如何快速抓取网页、解析数据、处理复杂的HTML结构等实用技巧。无论你是数据分析师、爬虫开发者,还是对网页数据提取感兴趣的学习者,掌握Requests-HTML都将为你的项目增添无限可能。
🚀一、请求模块requests高级应用(Reguests-HTML)
🔎1.概述
-
模块关系:Requests-HTML 是 requests 的扩展模块,由同一开发者维护。 -
核心功能: -
支持 JavaScript 动态渲染 -
集成数据提取(CSS/XPath 选择器) -
模拟真实浏览器行为 -
包含 requests 所有功能
-
🔎2.安装与基础使用
🦋2.1 安装命令
pip install requests-html
🦋2.2 发送 GET 请求
from requests_html import HTMLSession
session = HTMLSession() # 创建会话对象
url = 'http://news.youth.cn/'
r = session.get(url) # 发送 GET 请求
print(r.html.url) # 输出请求地址

🦋2.3 发送 POST 请求
from requests_html import HTMLSession
session = HTMLSession()
data = {'user':'admin', 'password':123456}
r = session.post('http://httpbin.org/post', data=data)
if r.status_code == 200:
print(r.text) # 返回结果包含表单数据和浏览器级 User-Agent

🔎3.请求头管理
🦋3.1 自定义请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
r = session.post(url, data=data, headers=headers)
🦋3.2 生成随机请求头
from requests_html import HTMLSession,UserAgent # 导入HTMLSession类
session = HTMLSession() # 创建HTML会话对象
ua = UserAgent().random # 创建随机请求头
r = session.get('http://httpbin.org/get',headers = {'user-agent': ua})
if r.status_code == 200: # 判断请求是否成功
print(r.text) # 以文本形式打印返回结果

🔎4.数据提取方法
🦋4.1 CSS 选择器
elements = r.html.find('li') # 提取所有 li 标签
for li in elements:
title = li.find('a', first=True).text
参数说明:
find(
selector: str = "*", # 使用CSS选择器定位网页元素
containing: Containing = None, # 通过指定文本获取网页元素
clean: bool = False, # 是否清除HTML中的 <script> 和 <style> 标签,默认值为 False(不清除)
first: bool = False, # 是否只返回网页中第一个元素,默认值为 False(返回全部)
encoding: str = None # 表示编码格式
)
🦋4.2 XPath 选择器
news_list = r.html.xpath('//ul[@class="tj3_1"]/li')
for li in news_list:
time = li.xpath('.//font/text()')[0]
参数说明:
xpath(
selector: str, # 使用 XPath 选择器定位网页元素
clean: bool = False, # 是否清除 HTML 中的 <script> 和 <style> 标签,默认值为 False(不清除)
first: bool = False, # 是否只返回网页中第一个元素,默认值为 False(返回全部)
encoding: str = None # 表示编码格式
)
🔎5.实战案例:爬取即时新闻
from requests_html import HTMLSession,UserAgent # 导入HTMLSession类
session = HTMLSession() # 创建HTML会话对象
ua = UserAgent().random # 创建随机请求头
# 发送网路请求
r = session.get('http://news.youth.cn/jsxw/index.htm',
headers = {'user-agent': ua})
r.encoding='gb2312' # 编码
if r.status_code == 200: # 判断请求是否成功
# 获取所有class=tj3_1中的li标签
li_all = r.html.xpath('.//ul[@class="tj3_1"]/li')
for li in li_all: # 循环遍历每个li标签
news_title = li.find('a')[0].text # 提取新闻标题内容
# 获取新闻详情对应的地址
news_href = 'http://news.youth.cn/jsxw'+\
li.find('a[href]')[0].attrs.get('href').lstrip('.')
news_time = li.find('font')[0].text # 获取新闻发布的时间
print('新闻标题为:',news_title) # 打印新闻标题
print('新闻url地址为:',news_href) # 打印新闻url地址
print('新闻发布时间为:',news_time)# 打印新闻发布时间

🔎6.动态数据加载(JavaScript 渲染)
🦋6.1 使用 render()
方法
from requests_html import HTMLSession,UserAgent # 导入HTMLSession类
session = HTMLSession() # 创建HTML会话对象
ua = UserAgent().random # 创建随机请求头
# 发送网路请求
r = session.get('https://movie.douban.com/tag/#/?sort=U&range=0,10'
'&tags=%E7%94%B5%E5%BD%B1,2020',headers = {'user-agent': ua})
r.encoding='gb2312' # 编码
if r.status_code == 200: # 判断请求是否成功
r.html.render() # 调用render()方法,没有Chromium浏览器就自动下载
class_wp = r.html.xpath('.//div[@class="list-wp"]/a') # 获取当前页面中所有电影信息的a标签
for a in class_wp:
title = a.find('p span')[0].text # 获取电影名称
rate = a.find('p span')[1].text # 获取电影评分
details_url = a.attrs.get('href') # 获取详情页url地址
img_url = a.find('img')[0].attrs.get('src') # 获取图片url地址
print('电影名称为:', title) # 打印电影名称
print('电影评分为:', rate) # 打印电影评分
print('详情页地址为:', details_url) # 打印电影详情页url地址
print('图片地址为:', img_url) # 打印电影图片地址
🔎7.高级数据提取技巧
🦋7.1 使用 find()
方法与 containing
参数
find()
方法可以通过查找网页中包含特定内容的标签来提取相关信息。对于“新冠疫情”相关新闻,示例代码如下:
for li in r.html.find("li", containing='新冠疫情'):
news_title = li.find('a')[0].text # 获取新闻标题
news_href = 'http://news.youth.cn/jsxw' + li.find('a[href]')[0].attrs.get('href').lstrip('.') # 获取新闻详情的URL
news_time = li.find('font')[0].text # 获取新闻发布时间
print('新闻标题为:', news_title)
print('新闻 URL 地址为:', news_href)
print('新闻发布时间为:', news_time)
-
find()
方法可以通过containing
参数查找包含指定文本的元素。
🦋7.2 search()
与 search_all()
1、使用 search()
方法获取新闻信息
search()
方法用于查找符合条件的第一个元素,可以用它来提取新闻的标题、地址和发布时间。以下是示例代码:
for li in r.html.find("li", containing="新冠疫情"):
a = li.search('{}') # 使用search()方法查找匹配的内容
news_title = a[1] # 获取新闻标题
news_href = 'http://news.youth.cn/jsxw' + a[0] # 获取新闻地址
news_time = li.search('{}')[0] # 获取新闻发布时间
# 打印结果
print("新闻标题为:", news_title)
print("新闻url地址为:", news_href)
print("新闻发布时间为:", news_time)
2、使用 search_all()
方法获取多个新闻信息
search_all()
方法可以用于获取符合条件的所有元素。如果你需要获取多个匹配的新闻内容,可以使用该方法。以下是一个示例:
import re # 导入正则表达式模块
# 获取 class="tj31" 的标签
class_tj31 = r.html.xpath('.//ul[@class="tj31"]')
# 使用 search_all() 方法获取所有 class="tj31" 中的 li 标签
li_all = class_tj31[0].search_all('{}')
for li in li_all: # 遍历所有的 li 标签内容
if '新冠疫情' in li[0]: # 判断li标签内容中是否包含关键字“新冠疫情”
a = re.findall('(.*?)(.*?)', li[0]) # 使用正则表达式提取新闻信息
news_title = a[0][2] # 获取新闻标题
news_href = 'http://news.youth.cn/jsxw' + a[0][1] # 获取新闻链接
news_time = a[0][0] # 获取新闻发布时间
# 打印结果
print("新闻标题为:", news_title)
print("新闻url地址为:", news_href)
print("新闻发布时间为:", news_time)
-
search()
和search_all()
方法可以通过正则表达式提取符合条件的第一个或所有元素,字符串中的{}为提取内容。
🔎8.注意事项
-
Chromium 下载: render()
首次使用需下载约 100MB 的浏览器内核。 -
性能优化:频繁调用 render()
会显著降低爬取速度,建议仅对需要 JS 渲染的页面使用。 -
反爬策略:结合随机 User-Agent 和 IP 代理提升爬虫稳定性。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)