百度贴吧爬虫实战(BeautifulSoup+lxml)

文章目录

      • BeautifulSoup
      • lxml
      • 使用场景
      • 具体代码
      • 具体解析
        • 1. 导入模块
        • 2. 定义爬虫类
        • 3. 初始化方法
        • 4. 获取URL列表
        • 5. 获取页面内容
        • 6. 提取页面数据
        • 7. 保存数据
        • 8. 运行爬虫
        • 9. 主程序
      • 总结

在实际爬虫之前还需要了解和下载两个模块:BeautifulSoup和lxml。

BeautifulSouplxml 是Python中两个非常流行的库,它们在网页内容解析和数据提取方面非常有用。以下是关于这两个库的详细介绍:

BeautifulSoup

BeautifulSoup 是一个用于提取HTML和XML文件中数据的Python库。它能够通过你喜欢的解析器来解析网页,提供一些简单的方法和Pythonic的方式来导航、搜索和修改解析树。BeautifulSoup 的主要特点包括:

  • 易于使用:提供了简洁的API,使得即使是新手也能快速上手。
  • 可读性强:能够以可读的方式呈现解析后的文档结构。
  • 灵活:支持多种解析器,如Python内置的 html.parser,快速高效的 lxml,以及 html5lib 等。
  • 强大的搜索功能:可以轻松地通过标签名、属性等找到所需的元素。
  • 广泛的文档和社区支持:拥有大量的文档和活跃的社区,方便查找解决方案。

lxml

lxml 是一个Python库,用于处理XML和HTML文件。它具有以下特点:

  • 性能lxml 使用高效的libxml2库,因此在解析速度上通常比 BeautifulSoup 使用的内置解析器快。
  • 易用性:虽然 lxml 主要用于XML,但它也提供了对HTML的解析支持,且API直观易用。
  • 功能丰富:除了基本的解析和元素查找功能外,lxml 还支持XPath和XSLT,这使得在复杂的文档中进行数据提取变得更加容易。
  • 兼容性lxml 能够处理不规范的HTML代码,容错性较好。

使用场景

  • 当您需要快速解析HTML或XML文件,并从中提取数据时,BeautifulSoup 是一个很好的选择,特别是当您需要一个易于学习和使用的库时。
  • 如果性能是您的主要关注点,或者您需要处理大型文件和复杂的查询,lxml 可能是更合适的选择。

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库。要安装 BeautifulSoup,可以使用Python的包管理器 pip。以下是安装步骤:

  1. 打开命令行界面(在Windows上是命令提示符或PowerShell,在macOS或Linux上是终端)。

  2. 输入以下命令来安装 beautifulsoup4

pip install beautifulsoup4

如果使用的是Python 3,并且系统同时安装了Python 2,可能需要使用 pip3 来代替 pip

pip3 install beautifulsoup4
  1. 等待安装完成。

此外,BeautifulSoup 需要一个解析器来解析网页,最常用的解析器是 lxmlhtml.parser(Python标准库中包含)。html.parser 不需要额外安装,但 lxml 更快且能更好地处理不规范的HTML。如果想使用 lxml 作为解析器,可以使用以下命令安装:

pip install lxml

或者,如果使用的是Python 3:

pip3 install lxml

安装完成后,可以在Python脚本中导入并使用 BeautifulSoup

from bs4 import BeautifulSoup

具体代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-#Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0
#Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
import requests
import json
from bs4 import BeautifulSoupclass TiebaSpider():def __init__(self, kw, max_pn):self.max_pn = max_pnself.kw = kwself.base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}passdef get_url_list(self):'''获取 url 列表:return:'''# 写法一'''url_list = []for pn in range(0,self.max_pn,50):url = self.base_url.format(self.kw,pn)url_list.append(url)return url_list'''# 写法二return [self.base_url.format(self.kw, pn) for pn in range(0, self.max_pn, 50)]def get_content(self, url):'''发送请求获取响应内容:param url::return:'''response = requests.get(url=url,headers=self.headers)return response.content# def get_items(self, content, index):#     '''#     从响应内容中提取数据#     :param content:#     :return:#     '''#     with open('tieba-{}.html'.format(index), 'wb') as f:#         f.write(content)#     return Nonedef get_items(self, content, index):'''从响应内容中提取页面标题,并保存HTML内容到文件:param content: HTML内容的字节串:param index: 用于文件命名的索引:return: 页面标题和URL的字典'''# 解析HTML内容soup = BeautifulSoup(content, 'html.parser')# 提取页面标题title = soup.title.string if soup.title else '无标题'# 构造URL,这里使用index作为页码url = self.base_url.format(self.kw, index)# 保存HTML内容到文件with open(f'tieba-{index}.html', 'wb') as f:f.write(content)# 返回包含URL和标题的字典return {'url': url, 'title': title}# def save_items(self, items):#     '''#     保存数据#     :param items:#     :return:#     '''def save_items(self, items):'''保存提取的页面标题和URL到JSON文件:param items: 字典,包含URL和标题:return:'''# 检查items是否为Noneif items is not None:# 保存到JSON文件with open(f'tieba-{items["url"].split("&pn=")[1]}.json', 'w', encoding='utf-8') as f:json.dump(items, f, ensure_ascii=False, indent=4)def run(self):# 1. 获取 url 列表url_list = self.get_url_list()for url in url_list:# 2. 发送请求获取响应content = self.get_content(url)# 3. 从响应中提取数据items = self.get_items(content, url_list.index(url) + 1)# 4. 保存数据self.save_items(items)passif __name__ == '__main__':spider = TiebaSpider("英雄联盟", 150)spider.run()

具体解析

1. 导入模块
import requests
import json
from bs4 import BeautifulSoup

这部分代码导入了三个库:requests用于发送HTTP请求,json用于处理JSON数据,BeautifulSoup用于解析HTML。

2. 定义爬虫类
class TiebaSpider():

定义了一个名为TiebaSpider的类,它将包含爬取数据的方法。

3. 初始化方法
def __init__(self, kw, max_pn):self.max_pn = max_pnself.kw = kwself.base_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"  # 注意这里修复了HTML实体self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}

__init__方法初始化爬虫的关键词kw,最大页码max_pn,基础URLbase_url(修复了HTML实体"),以及包含User-Agent的请求头。

4. 获取URL列表
def get_url_list(self):return [self.base_url.format(self.kw, pn) for pn in range(0, self.max_pn, 50)]

get_url_list方法生成一个包含所有请求URL的列表。它使用列表推导式,根据页码范围生成URL。

5. 获取页面内容
def get_content(self, url):response = requests.get(url=url, headers=self.headers)return response.content

get_content方法通过requests.get发送GET请求,获取指定URL的页面内容。

6. 提取页面数据
def get_items(self, content, index):soup = BeautifulSoup(content, 'html.parser')title = soup.title.string if soup.title else '无标题'url = self.base_url.format(self.kw, index)with open(f'tieba-{index}.html', 'wb') as f:f.write(content)return {'url': url, 'title': title}

get_items方法使用BeautifulSoup解析页面内容,提取页面标题,并保存HTML到文件。然后返回一个包含URL和标题的字典。

7. 保存数据
def save_items(self, items):if items is not None:with open(f'tieba-{items["url"].split("&pn=")[1]}.json', 'w', encoding='utf-8') as f:json.dump(items, f, ensure_ascii=False, indent=4)

save_items方法检查items是否为None,然后尝试将items字典保存为JSON文件。

8. 运行爬虫
def run(self):url_list = self.get_url_list()for url in url_list:content = self.get_content(url)items = self.get_items(content, url_list.index(url) + 1)self.save_items(items)

run方法是爬虫的主要逻辑,依次调用其他方法执行爬取任务。

9. 主程序
if __name__ == '__main__':spider = TiebaSpider("英雄联盟", 150)spider.run()

主程序创建TiebaSpider的实例,传入关键词和最大页码,然后调用run方法启动爬虫。

总结

这个爬虫程序通过发送HTTP请求获取页面内容,然后解析HTML以提取页面标题,并将页面内容保存为HTML文件。最后,它将每个页面的URL和标题保存为JSON文件。但是后续尝试将其中每篇文章的标题和url提取出来,有点翻车,明天再琢磨一下怎么解决。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter-beanshell学习-try处理异常

有时候代码执行过程中,出现一些不能处理的情况,就会报错,还影响之后的代码执行,就需要跳过异常。 上面这情况报错了,还影响了下面的打印。beanshell用try和catch处理异常,下面是try的用法,和if有…

PHP哈希签名方式sha1和sha256用于API对接签名验证

sha1 &#xff08;长度40字节&#xff09; -------------------------------------------------------------- $str 203fpid; $sha1 sha1($str); echo $sha1.<br>; php sha256加密 &#xff08;长度64&#xff09; --------------------------------…

技术守护尊严||Chat GPT在抵抗性骚扰的作用分析

就在本周&#xff0c;中国人民大学女博士实名举报导师性骚扰的事情&#xff0c;引发全网关注&#xff01; 性骚扰&#xff0c;无论在线上还是线下&#xff0c;无论在职场还是校园&#xff0c;都是对个人尊严与权益的严重侵犯。 幸运的是&#xff0c;随着人工智能技术的飞速发…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

[网络通信原理]——TCP/IP模型—网络层

网络层 网络层概述 网络层位于OSI模型的第三层&#xff0c;它定义网络设备的逻辑地址&#xff0c;也就是我们说的IP地址&#xff0c;能够在不同的网段之间选择最佳数据转发路径。在网络层中有许多协议&#xff0c;其中主要的协议是IP协议。 IP数据包格式 IP数据报是可变长度…

区块链——代码格式检查(prettier、solhint)

一、引入依赖 // 导入prettier prettier-plugin-solidity yarn add --dev prettier prettier-plugin-solidity yarn add --dev solhint二、创建.prettierrc文件 {"tabWidth": 2,"semi": false,"useTabs": false,"singleQuote": fals…

《最新出炉》系列入门篇-Python+Playwright自动化测试-55- 上传文件 (非input控件)- 中篇

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在实际工作中&#xff0c;我们进行web自动化的时候&#xff0c;文件上传是很常见的操作&#xff0c;例如上传用户头像&#xff0c;上传身份证信息等。所以宏哥打算按上传文件…

100个Python基本语法知识(一)

1. 基本语法结构 缩进 Python使用缩进来定义代码块&#xff0c;而不是像其他语言那样使用大括号{}。通常&#xff0c;每个缩进级别使用4个空格。 注释 单行注释以#开头。多行注释可以使用三引号或"""。 变量 Python是动态类型语言&#xff0c;变量无需事先…

模块与组件、模块化与组件化的理解

在React或其他现代JavaScript框架中&#xff0c;模块与组件、模块化与组件化是核心概念&#xff0c;它们对于提高代码的可维护性、复用性和开发效率具有重要意义。以下是对这些概念的理解&#xff1a; 模块与组件 模块&#xff08;Module&#xff09; 定义&#xff1a;模块是…

Java从入门到精通(十二)~ 动态代理

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能&#xff1a; 应用场景&#xff1a; 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

OSPF Type2 Message / DBD Packet (Database Descriptor)

注&#xff1a;机翻&#xff0c;未校对。 OSPF Type2 Message / DBD Packet (Database Descriptor) DBD (Database Description or Type2 OSPF Packet) is a sort of summary of the OSPF Database in a router. DBD is used to check if the LSDB between 2 routers is the s…

Linux---make/makefile工具

目录 基本了解 makefile基础语法 依赖关系 依赖方法 makefile文件内容格式 make执行机制 补充知识 机制解释 PHONY关键字 makefile补充语法 基本了解 在Linux中&#xff0c;make/makefile是项目自动化构建工具。如果我们没有make/makefile&#xff0c;那我们要编译一…

基于Java的模拟写字板的设计与实现

点击下载链接 基于Java的模拟写字板的设计与实现 摘要&#xff1a;目前&#xff0c;很多新的技术领域都涉及到了Java语言&#xff0c;Java语言是面向对象编程&#xff0c;并且涉及到网络、多线程等重要的基础知识&#xff0c;因此Java语言也是学习面向对象编程和网络编程的首…

Linux系统编程——生产者消费者模型

目录 一&#xff0c;模型介绍 1.1 预备知识&#xff08;超市买东西的例子&#xff09; 1.2 模型介绍 1.3 CP模型特点 二&#xff0c;基于阻塞队列的CP模型 2.1 介绍 2.2 阻塞队列的实现 2.3 主函数实现 2.4 效果展示 三&#xff0c;POSIX信号量 3.1 信号量原理 3…

一篇文章带你学完Java所有的时间与日期类

目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 定义两个指针&#xff0c;一快一慢。慢指针每次只移动一步&#xff0c;而快指针每次移动两步。初始时&#xff0c;慢指针和快指针都在位置 head&#xff0c;这样一来&#xff0c;如果在移动的过程中&#x…

05。拿捏ArkTS 第 3 天 --- 对象、联合类型、枚举

1&#xff0c;什么是对象&#xff1f;对象是干什么的&#xff1f; &#xff5e;用来存储不同类型数据的容器 &#xff5e;用来描述物体的特征和行为 //特征就是属性&#xff0c;行为就是方法&#xff08;对象内的函数&#xff09; 2&#xff0c;对象的基本样式是&#xff1f; …

Noah-MP陆面生态水文模拟与多源遥感数据同化技术

了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;熟悉模型的发展历程&#xff0c;常见模型及各自特点&#xff1b;理解Noah-MP模型的原理&#xff0c;掌握Noah-MP模型在单站和区域的模拟、模拟结果的输出和后续分析及可视化等方法&#xff1b;…

OpenGL入门第六步:材质

目录 结果显示 材质介绍 函数解析 具体代码 结果显示 材质介绍 当描述一个表面时&#xff0c;我们可以分别为三个光照分量定义一个材质颜色(Material Color)&#xff1a;环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting)。通过为每…