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”:
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网站,并使用已有的认证信息完成登录。
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)
现在我们已经成功登录,接下来需要抓取网站中的新闻数据。
# 使用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 库来完成数据存储操作:
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是非常好的选择。在减小成本和加速开发时间方面,它比其他框架都要具有竞争优势。