Python爬虫之MechanicalSoup框架的应用详解

news/2024/7/19 12:09:13 标签: python, 爬虫, 开发语言

MechanicalSoup是一个简单而实用的Python爬虫框架,可以模拟一个完整的浏览器会话(包括认证、填写和提交表单)并爬取网页中的各种数据。该框架的功能非常强大,支持自动管理cookie,支持SSL/TLS加密,支持Web表单提交,还可以与BeatifulSoup解析库配合使用,支持CSS和XPath选择器等等特性。

使用MechanicalSoup,可以轻松地抓取数据并以各种格式导出,例如CSV,Excel和MySQL数据库等。在本文中,将详细介绍MechanicalSoup的使用,以及一些实际应用场景的演示。

MechanicalSoup的安装和基本用法

-安装

请在命令行中输入以下命令以安装MechanicalSoup:

pip install MechanicalSoup

-使用
MechanicalSoup包含了一个Browser类用于模拟一个完整的浏览器会话,内部还包含了requests和BeatifulSoup模块,这样可以很方便地进行页面解析。下面我们来看一个基本的使用示例,使用MechanicalSoup打开百度首页并搜索“python”:

python">import mechanicalsoup

# 创建Browser对象
browser = mechanicalsoup.Browser()

# 打开百度首页并获取搜索框
page = browser.get("https://www.baidu.com")
search_form = page.soup.select("#form2")[0]

# 将关键词“python”填入搜索框中并提交表单
search_input = search_form.select("#kw")[0]
search_input["value"] = "python"
page = browser.submit(search_form, page.url)

# 使用BeatifulSoup解析搜索结果并输出
for result in page.soup.select("#content_left h3.t a"):
    print(result.text)
    print(result.attrs["href"])

以上代码展示了如何使用MechanicalSoup模拟一个浏览器会话,打开百度首页,填写关键词并提交Web表单,最后使用BeatifulSoup解析搜索结果。

MechanicalSoup中常用类和方法

1、Browser类

Browser是MechanicalSoup的核心类,可以模拟一个完整的浏览器会话,包括处理cookie、SSL/TLS加密和处理Web表单。Browser提供了以下常用方法:

  • .get(url):打开指定的URL并返回响应对象。
  • .open(url):打开指定的URL并返回所在页面的HTML文本。
  • .submit(form, url):提交表单并返回响应对象或HTML文本。
  • .session():返回内部的requests session对象,可以进行自定义设置,例如添加代理或修改请求头等。
  • .get_current_page():返回当前浏览器会话中打开的页面的BeautifulSoup对象。

2、Page类

Page表示一个正在打开或已经打开的网页,在MechanicalSoup中仅仅是一个BeatifulSoup对象和一个URL。Page提供以下常用方法:

  • .select(selector):使用CSS或XPath选择器在页面中查找元素。
  • .find(name, attrs):搜索页面中的单个元素。
  • .find_all(name, attrs):搜索页面中的多个元素。

以上方法均返回BeautifulSoup对象。此外,Page也是一个以字典形式存储的对象,可以使用Page[key]访问存储结果,例如获取cookie和响应头等。

3、Form类

Form表示一个HTML表单,在MechanicalSoup中,由Browser对象的get()或submit()方法返回页面时,会自动解析其表单并返回Form对象。Form提供以下常用方法:

  • .inputs[name]:返回表单指定name属性的输入元素。
  • .set(name, value):设置表单输入元素的值。
  • .print_summary():输出表单的摘要信息。

以上方法均为便于用户进行表单处理而提供的简单方法。在表单字段数量较多或需要进行复杂的表单处理时,建议使用表单的普通属性和方法。

MechanicalSoup的应用

现在,我们可以通过一个实际应用场景来演示MechanicalSoup的使用。在这个例子中,我们将实现一个简单的数据爬取程序,从某个知名科技新闻网站中抓取新闻标题、链接和摘要,然后将其保存为CSV文件。

首先,我们需要使用MechanicalSoup打开该网站并登录。在本例中,我们访问mayukh.dev网站,并使用已有的认证信息完成登录。

python">import mechanicalsoup

# 创建Browser对象并打开登录页面
browser = mechanicalsoup.Browser()
login_page = browser.get("https://mayukh.dev/login")

# 获取登录表单并填写认证信息
login_form = login_page.soup.select("#loginForm")[0]
login_form.select("#username")[0]["value"] = "my_username"
login_form.select("#password")[0]["value"] = "my_password"

# 提交表单并登录
page = browser.submit(login_form, login_page.url)


现在我们已经成功登录,接下来需要抓取网站中的新闻数据。

python"># 使用Browser对象打开新闻页面并解析HTML代码
news_page = browser.get(“https://mayukh.dev/news”)
news_soup = news_page.soup
#定位新闻数据的页面元素并解析数据
news_list = news_soup.select(“#newsList > .card”)
data_list = []
for news in news_list:
# 获取新闻标题、URL和摘要
title = news.select(“.card-title a”)[0].text.strip()
url = news.select(“.card-title a”)[0][“href”]
summary = news.select(“.card-text”)[0].text.strip()
# 添加新闻数据到列表中
data_list.append({"title": title, "url": url, "summary": summary})

通过使用 CSS 选择器,我们定位到 <div> 元素的列表,这包含新闻数据的所有内容。然后,迭代每个 <div> 元素,获取新闻标题、URL 和摘要,并将其添加到列表中。

最后,我们将数据列表存储为 CSV 文件的内容。这里我们使用 Pandas 库来完成数据存储操作:

python">import pandas as pd

# 将数据列表转换为 Pandas 数据框
df = pd.DataFrame(data_list)

# 将数据框保存为 CSV 文件
df.to_csv("news_data.csv", index=False)

完成数据处理之后,我们就可以看到输出了一个名为 news_data.csv 的文件,其中包含所有新闻的标题、链接和摘要。

结论

虽然MechanicalSoup这个爬虫框架不像其他流行的爬虫框架如Scrapy那样拥有强大的弹性和语言支持,但它仍然是一款实用的框架,适合处理简单的爬取任务。如果您的爬取任务只需要处理登录和填写表单等入门级别任务,那么MechanicalSoup是非常好的选择。在减小成本和加速开发时间方面,它比其他框架都要具有竞争优势。


http://www.niftyadmin.cn/n/329425.html

相关文章

LitCTF2023 wp re最后一道 cry misc

本来不打算放了&#xff0c;但是比赛打都打了留个纪念社工有佬&#xff0c;与我无关&#xff0c;misc只会隐写虽然我是逆向手&#xff0c;但因为队友tql&#xff0c;所以只留给我最后一道~~我的wp向来以简述思路为主&#xff0c;习惯就好 Crypto Hex&#xff1f;Hex&#xff…

Docker容器的内核调优

ocker容器的内核调优&#xff1a;https://segmentfault.com/a/1190000009225126 https://cloud.tencent.com/developer/article/1583736 探讨Docker容器中修改系统变量的方法 https://www.cnblogs.com/junneyang/p/5278482.html Docker容器是利用宿主机上的底层资源来运行的…

【Vue】路由

文章目录 一、路由的概念1.后端路由2.前端路由3.单页面应有程序 二、路由的实例化1.路由实例化步骤2.声明式的路由跳转3.函数式路由跳转传参4.路由的重定向 redirect5.路由高亮6.组件的嵌套7.命名视图 components: { }8.代码 一、路由的概念 1.后端路由 对于普通的网站&#…

关于对自动化测试的理解:目的与本质!(新手必看)

其实自动化测试很好理解&#xff0c;由两部分组成&#xff0c;“自动化”和“测试”&#xff0c;所以我们要理解自动化测试&#xff0c;就必须理解“自动化”和“测试”&#xff0c;只有理解了这些概念&#xff0c;才能更轻松的做好的自动化测试。其中“自动化”可以想象成通过…

面经历大盘点

1.concurrenthashmap底层存储结构 ConcurrentHashMap1.8底层数据结构是数组链表红黑树。由CASSynchronized实现线程安全。代替1.7的分段锁segement put原理&#xff1a; 判断数组是否为null&#xff0c;是则CAS初始化。key计算得出hash值&#xff0c;得到要添加的数组位置判断…

【高危】Apache Spark UI shell 命令注入漏洞(POC)

漏洞描述 该漏洞是针对此前CVE-2022-33891漏洞的修订&#xff0c;原有漏洞通告中认为3.1.3版本已修复该漏洞&#xff0c;后发现仍受到影响&#xff0c;3.1.3版本已不再维护&#xff0c;官方建议升级至3.4.0版本。 Apache Spark是美国阿帕奇&#xff08;Apache&#xff09;软件…

Java-SpringBoot与SpringCloud微服务-基础介绍

SpringBoot配置 SpringBoot基于约定&#xff0c;有很多默认配置值&#xff0c;需要修改则要使用约定好的名称并写上想要设定的值。 application.properties&#xff1a; server.port8080application.yml/application.yaml&#xff1a; server:port: 8080三个配置文件都存在时…

APP测试常见功能测试点汇总,赶紧来记笔记

目录 1、安装和卸载 2、运行 3、注册和登录 4、日历控件 5、权限设置 6、软件更新  7、网络环境 8、兼容性测试&#xff1a;   9、异常测试   1、安装和卸载 安装和卸载是任何一款APP中都属于最基本功能。一旦出错&#xff0c;就属于优先级为紧要的BUG。因此APP…