<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4872字,需瀏覽 10分鐘

           ·

          2021-05-16 13:38




          ??本文轉(zhuǎn)載自公眾號【AirPython】,詳情可以點擊上方卡片,關(guān)注該公眾號,獲取更多好文推薦。


          1. 前言

          今天給大家推薦一款小眾輕量級的爬蟲庫:MechanicalSoup

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

          項目地址:

          https://github.com/MechanicalSoup/MechanicalSoup

          2. 安裝及常見用法

          首先安裝依賴庫

          # 安裝依賴庫
          pip3 install MechanicalSoup

          常見操作如下:

          2-1  實例化瀏覽器對象

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

          import mechanicalsoup

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

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

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

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

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

          print(result)

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

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

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

          使用瀏覽器對象的「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  表單操作

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

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

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

          # 如果網(wǎng)頁只有一個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屬性值,選擇某一個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屬性值,選擇某幾個值
          # <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("結(jié)果為:",response.text)

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

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

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

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

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

          更多功能可以參考:

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

          3. 實戰(zhàn)一下

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

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

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

          PS:從 MechanicalSoup 源碼會發(fā)現(xiàn),UA 相當(dāng)于設(shè)置到 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)

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

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

          使用瀏覽器對象獲取網(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)才是真實的文章地址
              href = "https://mp.weixin.qq.com" + element_a.attrs['href']

              text = element_a.text

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

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

          3-4  反反爬

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

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

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

          4. 最后

          文中結(jié)合微信文章搜索實例,使用 MechanicalSoup 完成了一次自動化及爬蟲操作

          相比 Selenium,最大的區(qū)別是 Selenium 可以和 JS 進(jìn)行交互;而 MechanicalSoup 不行

          但是對于一些簡單的自動化場景,MechanicalSoup 是一種簡單、輕量級的解決方案



          · 推薦閱讀 ·

          純Python輕松開發(fā)在線留言板!

          jupyter中那些神奇的第三方拓展魔術(shù)命令

          高級,這個Python庫助力pandas智能可視化分析


          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一级在线观看 | 无码国精品一区二区免费蜜桃 | 伊人狠狠操 | 天堂中文资源库 | 黄片大全在线免费观看 |