【愚公系列】《Python网络爬虫从入门到精通》007-请求模块requests高级应用(Reguests-HTML)

举报
愚公搬代码 发表于 2025/04/30 23:50:46 2025/04/30
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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.注意事项

  1. Chromium 下载render() 首次使用需下载约 100MB 的浏览器内核。
  2. 性能优化:频繁调用 render() 会显著降低爬取速度,建议仅对需要 JS 渲染的页面使用。
  3. 反爬策略:结合随机 User-Agent 和 IP 代理提升爬虫稳定性。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。