一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

再推薦一款小眾且好用的 Python 爬蟲庫

 AirPython 2021-10-28

1. 前言

大家好,我是安果!

今天再推薦一款小眾輕量級(jí)的爬蟲庫:MechanicalSoup

MechanicalSoup,也是一款爬蟲神器!它使用純 Python 開發(fā),底層基于 Beautiful Soup 和 Requests,實(shí)現(xiàn)網(wǎng)頁自動(dòng)化及數(shù)據(jù)爬取

項(xiàng)目地址:

https://github.com/MechanicalSoup/MechanicalSoup

2. 安裝及常見用法

首先安裝依賴庫

# 安裝依賴庫
pip3 install MechanicalSoup

常見操作如下:

2-1  實(shí)例化瀏覽器對(duì)象

使用 mechanicalsoup 內(nèi)置的 StatefulBrowser() 方法可以實(shí)例化一個(gè)瀏覽器對(duì)象

import mechanicalsoup

# 實(shí)例化瀏覽器對(duì)象
browser = mechanicalsoup.StatefulBrowser(user_agent='MechanicalSoup')

PS:實(shí)例化的同時(shí),參數(shù)可以執(zhí)行 User Agent 及數(shù)據(jù)解析器,默認(rèn)解析器為 lxml

2-2  打開網(wǎng)站及返回值

使用瀏覽器實(shí)例對(duì)象的 open(url) 即可以打開一個(gè)網(wǎng)頁,返回值類型為:requests.models.Response

# 打開一個(gè)網(wǎng)站
result = browser.open("http:///")

print(result)

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

通過返回值可以發(fā)現(xiàn),使用瀏覽器對(duì)象打開網(wǎng)站相當(dāng)于使用 requests 庫對(duì)網(wǎng)站進(jìn)行了一次請(qǐng)求

2-3  網(wǎng)頁元素及當(dāng)前 URL

使用瀏覽器對(duì)象的「url屬性可以獲取當(dāng)前頁面的 URL 地址;瀏覽器的「 page 」屬性用于獲取頁面的所有網(wǎng)頁元素內(nèi)容

由于 MechanicalSoup 底層基于 BS4,因此 BS4 的語法都適用于 MechanicalSoup

# 當(dāng)前網(wǎng)頁URL地址
url = browser.url
print(url)

# 查看網(wǎng)頁的內(nèi)容
page_content = browser.page
print(page_content)

2-4  表單操作

瀏覽器對(duì)象內(nèi)置的 select_form(selector) 方法用于獲取當(dāng)前頁面的 Form 表單元素

如果當(dāng)前網(wǎng)頁只有一個(gè) Form 表單,則參數(shù)可以省略

# 獲取當(dāng)前網(wǎng)頁中某個(gè)表單元素
# 利用action來過濾
browser.select_form('form[action="/post"]')

# 如果網(wǎng)頁只有一個(gè)Form表單,參數(shù)可以省略
browser.select_form()

form.print_summary() 用于將表單內(nèi)全部元素打印出來

form = browser.select_form()

# 打印當(dāng)前選定表單內(nèi)部全部元素
form.print_summary()

至于表單內(nèi)的 input 普通輸入框、單選框 radio、復(fù)選框 checkbox

# 1、普通輸入框
# 通過input的name屬性直接設(shè)置值,模擬輸入
browser["norm_input"] = "普通輸入框的值"

# 2、單元框radio
# 通過name屬性值,選擇某一個(gè)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、復(fù)選框checkbox
# 通過name屬性值,選擇某幾個(gè)值
# <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")

瀏覽器對(duì)象的 submit_selected(btnName) 方法用于提交表單

需要注意的是,提交表單后的返回值類型為:requests.models.Response

# 提交表單(模擬單擊“提交”按鈕)
response = browser.submit_selected()

print("結(jié)果為:",response.text)

# 結(jié)果類型:requests.models.Response
print(type(response))

2-5  調(diào)試?yán)?/span>

瀏覽器對(duì)象 browser 提供了一個(gè)方法:launch_browser()

用于啟動(dòng)一個(gè)真實(shí)的 Web 瀏覽器,可視化展示當(dāng)前網(wǎng)頁的狀態(tài),在自動(dòng)化操作過程中非常直觀有用

PS:它不會(huì)真實(shí)打開網(wǎng)頁,而是創(chuàng)建一個(gè)包含頁面內(nèi)容的臨時(shí)頁面,并將瀏覽器指向這個(gè)文件

更多功能可以參考:

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

3. 實(shí)戰(zhàn)一下

我們以「 微信文章搜索,爬取文章標(biāo)題及鏈接地址 」為例

3-1  打開目標(biāo)網(wǎng)站,并指定隨機(jī) UA

由于很多網(wǎng)站對(duì) User Agent 做了反爬,因此這里隨機(jī)生成了一個(gè) UA,并設(shè)置進(jìn)去

PS:從 MechanicalSoup 源碼會(huì)發(fā)現(xiàn),UA 相當(dāng)于設(shè)置到 Requests 的請(qǐng)求頭中

import mechanicalsoup
from faker import Factory

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

# 實(shí)例化一個(gè)瀏覽器對(duì)象
# user_agent:指定UA
f = Factory.create()
ua = f.user_agent()
browser = mechanicalsoup.StatefulBrowser(user_agent=ua)

# 打開目標(biāo)網(wǎng)站
result = browser.open(home_url)

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

使用瀏覽器對(duì)象獲取網(wǎng)頁中的表單元素,然后給表單中的 input 輸入框設(shè)置值,最后模擬表單提交

# 獲取表單元素
browser.select_form()

# 打印表單內(nèi)所有元素信息
# browser.form.print_summary()

# 根據(jù)name屬性,填充內(nèi)容
browser["query"] = "Python"

# 提交
response = browser.submit_selected()

3-3  數(shù)據(jù)爬取

數(shù)據(jù)爬取的部分很簡單,語法與 BS4 類似,這里就不展示說明了

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

print('搜索結(jié)果為:', len(search_results))

# 網(wǎng)頁數(shù)據(jù)爬取
for result in search_results:
    # a標(biāo)簽
    element_a = result.select('a')[0]

    # 獲取href值
    # 注意:這里的地址經(jīng)過調(diào)轉(zhuǎn)才是真實(shí)的文章地址
    href = "https://mp.weixin.qq.com" + element_a.attrs['href']

    text = element_a.text

    print("標(biāo)題:", text)
    print("地址:", href)

# 關(guān)閉瀏覽器對(duì)象
browser.close()

3-4  反反爬

MechanicalSoup 除了設(shè)置 UA,還可以通過瀏覽器對(duì)象的「 session.proxies 」設(shè)置代理 IP

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

# 設(shè)置代理ip
browser.session.proxies = proxies

4. 最后

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    内用黄老外示儒术出处| 国产精品日韩欧美一区二区| 久久综合狠狠综合久久综合| 日本少妇三级三级三级| 日韩aa一区二区三区| 亚洲内射人妻一区二区| 少妇淫真视频一区二区| 精品推荐久久久国产av| 欧美日韩精品一区二区三区不卡| 99久久国产精品免费| 欧美偷拍一区二区三区四区| 国产丝袜美女诱惑一区二区| 国产午夜福利一区二区| 人妻人妻人人妻人人澡| 亚洲夫妻性生活免费视频| 欧美日韩国产精品自在自线| 日韩在线中文字幕不卡| 美国欧洲日本韩国二本道| 精品一区二区三区免费看| 日韩精品综合福利在线观看| 在线观看免费视频你懂的| 视频一区二区黄色线观看| 精品人妻一区二区四区| 日本办公室三级在线观看| 亚洲中文字幕人妻系列| 亚洲日本加勒比在线播放| 插进她的身体里在线观看骚| 国产一区二区熟女精品免费| 午夜福利国产精品不卡| 国产二级一级内射视频播放| 久久经典一区二区三区| 在线视频三区日本精品| 91日韩欧美中文字幕| 色鬼综合久久鬼色88| 免费大片黄在线观看国语| 91超频在线视频中文字幕| 91精品欧美综合在ⅹ| 小黄片大全欧美一区二区| 老司机精品视频在线免费| 亚洲精品国男人在线视频| 国产精品不卡高清在线观看|