推荐一款小众且好用的 Python 爬虫库

1. 前言

大家好,我是安果!

今天再推荐一款小众轻量级的爬虫库:MechanicalSoup

MechanicalSoup,也是一款爬虫神器!它使用纯 Python 开发,底层基于 Beautiful Soup 和 Requests,实现网页自动化及数据爬取

项目地址:

https://github.com/MechanicalSoup/MechanicalSoup

2. 安装及常见用法

首先安装依赖库

# 安装依赖库
pip3 install MechanicalSoup

常见操作如下:

2-1  实例化浏览器对象

使用 mechanicalsoup 内置的 StatefulBrowser() 方法可以实例化一个浏览器对象

import mechanicalsoup

# 实例化浏览器对象
browser = mechanicalsoup.StatefulBrowser(user_agent='MechanicalSoup')

PS:实例化的同时,参数可以执行 User Agent 及数据解析器,默认解析器为 lxml

2-2  打开网站及返回值

使用浏览器实例对象的 open(url) 即可以打开一个网页,返回值类型为:requests.models.Response

# 打开一个网站
result = browser.open("http://httpbin.org/")

print(result)

# 返回值类型:requests.models.Response
print(type(result))

通过返回值可以发现,使用浏览器对象打开网站相当于使用 requests 库对网站进行了一次请求

2-3  网页元素及当前 URL

使用浏览器对象的「url」属性可以获取当前页面的 URL 地址;浏览器的「 page 」属性用于获取页面的所有网页元素内容

由于 MechanicalSoup 底层基于 BS4,因此 BS4 的语法都适用于 MechanicalSoup

# 当前网页URL地址
url = browser.url
print(url)

# 查看网页的内容
page_content = browser.page
print(page_content)

2-4  表单操作

浏览器对象内置的 select_form(selector) 方法用于获取当前页面的 Form 表单元素

如果当前网页只有一个 Form 表单,则参数可以省略

# 获取当前网页中某个表单元素
# 利用action来过滤
browser.select_form('form[action="/post"]')

# 如果网页只有一个Form表单,参数可以省略
browser.select_form()

form.print_summary() 用于将表单内全部元素打印出来

form = browser.select_form()

# 打印当前选定表单内部全部元素
form.print_summary()

至于表单内的 input 普通输入框、单选框 radio、复选框 checkbox

# 1、普通输入框
# 通过input的name属性直接设置值,模拟输入
browser["norm_input"] = "普通输入框的值"

# 2、单元框radio
# 通过name属性值,选择某一个value值
# <input name="size" type="radio" value="small"/>
# <input name="size" type="radio" value="medium"/>
# <input name="size" type="radio" value="large"/>
browser["size"] = "medium"

# 3、复选框checkbox
# 通过name属性值,选择某几个值
# <input name="topping" type="checkbox" value="bacon"/>
# <input name="topping" type="checkbox" value="cheese"/>
# <input name="topping" type="checkbox" value="onion"/>
# <input name="topping" type="checkbox" value="mushroom"/>
browser["topping"] = ("bacon", "cheese")

浏览器对象的 submit_selected(btnName) 方法用于提交表单

需要注意的是,提交表单后的返回值类型为:requests.models.Response

# 提交表单(模拟单击“提交”按钮)
response = browser.submit_selected()

print("结果为:",response.text)

# 结果类型:requests.models.Response
print(type(response))

2-5  调试利器

浏览器对象 browser 提供了一个方法:launch_browser()

用于启动一个真实的 Web 浏览器,可视化展示当前网页的状态,在自动化操作过程中非常直观有用

PS:它不会真实打开网页,而是创建一个包含页面内容的临时页面,并将浏览器指向这个文件

更多功能可以参考:

https://mechanicalsoup.readthedocs.io/en/stable/tutorial.html

3. 实战一下

我们以「 微信文章搜索,爬取文章标题及链接地址 」为例

3-1  打开目标网站,并指定随机 UA

由于很多网站对 User Agent 做了反爬,因此这里随机生成了一个 UA,并设置进去

PS:从 MechanicalSoup 源码会发现,UA 相当于设置到 Requests 的请求头中

import mechanicalsoup
from faker import Factory

home_url = 'https://weixin.sogou.com/'

# 实例化一个浏览器对象
# user_agent:指定UA
f = Factory.create()
ua = f.user_agent()
browser = mechanicalsoup.StatefulBrowser(user_agent=ua)

# 打开目标网站
result = browser.open(home_url)

3-2  表单提交,搜索一次

使用浏览器对象获取网页中的表单元素,然后给表单中的 input 输入框设置值,最后模拟表单提交

# 获取表单元素
browser.select_form()

# 打印表单内所有元素信息
# browser.form.print_summary()

# 根据name属性,填充内容
browser["query"] = "Python"

# 提交
response = browser.submit_selected()

3-3  数据爬取

数据爬取的部分很简单,语法与 BS4 类似,这里就不展示说明了

search_results = browser.get_current_page().select('.news-list li .txt-box')

print('搜索结果为:', len(search_results))

# 网页数据爬取
for result in search_results:
    # a标签
    element_a = result.select('a')[0]

# 获取href值
    # 注意:这里的地址经过调转才是真实的文章地址
    href = "https://mp.weixin.qq.com" + element_a.attrs['href']

text = element_a.text

print("标题:", text)
    print("地址:", href)

# 关闭浏览器对象
browser.close()

3-4  反反爬

MechanicalSoup 除了设置 UA,还可以通过浏览器对象的「 session.proxies 」设置代理 IP

# 代理ip
proxies = {
    'https': 'https_ip',
    'http': 'http_ip'
}

# 设置代理ip
browser.session.proxies = proxies

4. 最后

(0)

相关推荐

  • 再推荐一款小众且好用的 Python 爬虫库

    再推荐一款小众且好用的 Python 爬虫库

  • 推荐13款小众类型游戏,最后一款甚至没人知道

    在海量的游戏中,玩过惯了3A级游戏大作,你们还体验过额外的小众类型游戏吗?那么本期就为广大游戏爱好者们,推荐13款小众类型的冷门游戏,而且最后一款甚至都没有人见过. <劳拉与光明守护者> ...

  • 推荐4款小众且实用的软件工具!

    今天小乔给大家推荐几款比较小众的软件,不出名但是都很实用,一起来看看有咩有你们喜欢的! 一.OSD note OSD note是一款基于神奇编程语言 AutoHotkey 的文本编辑器,也有管理标签的 ...

  • 推荐两款比较小众的蓝色花卉,它们不但花色相近且还有很多共同点……

    蓝色花系的花卉本身就不多见,今天给大家推荐这两款相信大部分朋友没有栽培过.这两款开蓝色花的草本花卉同属小清新类型的,花朵清新淡雅,别具一格.无论是栽在盆里还是种到院落中都是不错的选择,一起来看看吧! ...

  • 拒绝烂大街款式,3款小众品牌女生手表推荐

    持续的高温天气令人烦躁,这个时候,唯有养眼的配饰和清凉的美衣才能唤回好心情.今天给大家介绍3款小众品牌女生手表和搭配方式,这个夏天照着搭,保你时髦好看不出错,轻松彰显不俗好品味. 知性气质风 聚利时小 ...

  • 推荐一款冷门的小众浏览器

    浏览器作为手机电脑必备的工具,相信在座百分之九十九点九九的小伙伴经常都在用,普通用户可能就是用浏览器上上网下载点东西,然后进阶的用户可能就会开始对浏览器有些要求了,得安全.无广告.简洁好用. 但关注小 ...

  • 5款小众高级又好闻的护手霜推荐!过年一定要备上

    春节马上就到啦,各位的护手霜囤好了吗?没有囤护手霜的赶紧囤啦! 咦,一般过年囤的不是年货吗?为什么要囤护手霜? 疫情反复,出门和回家最重要的一件事就是洗手!秋冬季节频繁洗手,我们手部肌肤就容易水分流失 ...

  • 强烈推荐这几款小众但实用的法务效率工具

    朋友圈有一法务吐槽去年审核了近500份的合同,而其他工作的处理,经常是合同审查.案件诉讼.公司事务的交叉进行,忙的焦头烂额. 因此幂律君为法务朋友们找了一些比较好用的工具,希望能够帮助大家提高工作效率 ...

  • 推荐时间 | 越小众越美丽!盘点15款不出名但却超好玩的手游

    最近你们都在玩些什么游戏呢?有没有觉得王者农药打厌烦了?如果想开发一些新的游戏,又不知道玩什么,不如来看看这些很有意思的小众手游吧! 方块历险记  这是一款国外非常火爆的益智游戏,讲述的是盒子先生和盒 ...