MechanicalSoup,一个强悍的python库

MechanicalSoup,一个强悍的python库

大家好,我是木木。今天给大家分享一个超强的python库,MechanicalSoup

MechanicalSoup是一个基于Python的库,旨在自动化和模拟浏览器行为。这个库结合了BeautifulSoup和requests库的功能,允许用户编写脚本来执行网页浏览中的各种操作,如填写表单、模拟点击和页面跳转,非常适合于网页数据抓取和自动化测试。

MechanicalSoup,一个强悍的python库
图源网络

特点

  1. 易用性:MechanicalSoup提供了一个简单易用的API,让用户可以轻松地模拟浏览器行为。
    1. 它通过封装requests和BeautifulSoup,使得处理HTTP请求和解析HTML文档变得异常简单。用户无需关心底层细节,即可实现复杂的网络操作。
  2. 灵活性:能够处理复杂的网页交互。
    1. 无论是处理重定向、会话维持还是Cookie管理,MechanicalSoup都能妥善处理,甚至可以应对JavaScript生成的动态内容(通过模拟表单提交等方式)。
  3. 轻量级:不依赖浏览器,资源占用小。
    1. 相比于Selenium等需要启动实际浏览器的自动化测试工具,MechanicalSoup运行在纯Python环境下,对系统资源的消耗更少,特别适合于轻量级爬虫项目或自动化脚本。

最佳实践

  • 安装方法

    安装MechanicalSoup非常简单,只需使用pip命令即可完成安装。

pip install MechanicalSoup

功能示例

  1. 填写并提交表单
    1. 利用MechanicalSoup,我们可以轻松填写网页表单并提交。以下是一个简单的示例,展示如何在google浏览器添加内容。
  2. 抓取网页内容
    1. 通过MechanicalSoup,我们可以获取网页的HTML内容,并利用BeautifulSoup进行解析,以下示例演示了如何将搜索结果全部展示出来。

示例代码

import re

import mechanicalsoup


# 打开谷歌搜索
browser = mechanicalsoup.StatefulBrowser()
browser.open("https://www.google.com/")

# 填写表单
browser.select_form('form[action="/search"]')
browser["q"] = "MechanicalSoup"
# 注意: 实际上按钮的名称应该是btnK,btnG是给机器人用的
browser.submit_selected(btnName="btnG")

# 展示结果
for link in browser.links():
    target = link.attrs['href']
    # 从点击跟踪里面过滤掉不相关的内容
    if (target.startswith('/url?'and not
            target.startswith("/url?q=http://webcache.googleusercontent.com")):
        target = re.sub(r"^/url?q=([^&]*)&.*"r"1", target)
        print(target)

高级功能示例

  • 处理重定向和会话管理
    • MechanicalSoup能够自动处理重定向和会话,下面的代码展示了如何在登录后保持会话状态,访问需要认证的页面。
import argparse

import mechanicalsoup


parser = argparse.ArgumentParser(description="Login to GitHub.")
parser.add_argument("username")
parser.add_argument("password")
args = parser.parse_args()

browser = mechanicalsoup.Browser(soup_config={'features''lxml'})

# 请求guthub的登录页面. 结果是一个requests.Response对象
# http://docs.python-requests.org/en/latest/user/quickstart/#response-content
login_page = browser.get("https://github.com/login")

# 类似于断言登录的成功,不过是所有完整状态以防出现失败情况
login_page.raise_for_status()

# login_page.soup是一个BeautifulSoup对象
# http://www.crummy.com/software/BeautifulSoup/bs4/doc/#beautifulsoup
# 获取登录的form表单
login_form = mechanicalsoup.Form(login_page.soup.select_one('#login form'))

# 输入账号密码
login_form.input({"login": args.username, "password": args.password})

# 提交表单
page2 = browser.submit(login_form, login_page.url)

# 验证我们是否已经登录
messages = page2.soup.find("div", class_="flash-messages")
if messages:
    print(messages.text)
assert page2.soup.select(".logout-form")

print(page2.soup.title.text)

# 确认我们任然在登录(感谢有cookie功能),之后可以访问其他站点了
page3 = browser.get("https://github.com/MechanicalSoup/MechanicalSoup")
assert page3.soup.select(".logout-form")
MechanicalSoup,一个强悍的python库
图源网络

小结

MechanicalSoup是一个强大且灵活的库,适合于执行各种网页自动化任务。它的轻量级和易用性使得它成为处理网页数据抓取和自动化测试的理想选择。通过上述示例,您可以开始探索MechanicalSoup的强大功能,并将其应用于自己的项目中。



原文始发于微信公众号(木木夕咦):MechanicalSoup,一个强悍的python库

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/228783.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!