首頁 > html教程 > HTML熱點 閱讀:0更新時間:2020-12-20 09:50:25

爬蟲新寵requests_html 帶你甄別2019虛假大學

知識有價

公眾號從5月31號開始第一次發文,到現在快一個月了。27天的時間里,更新了26篇文章。因為感覺每天更新身體有些扛不住,所以從上周開始,每周五給自己放個假,找朋友擼擼串,和同學懷念下10年前的dota1。

今天很開心,公司內部博客網站中,一個項目舉辦了相關的活動,具體活動的細節我也是今天才知道。大概評獎規則以作者文章獲取贊賞或者推薦次數進行排名。之前寫的flask制作美觀的網頁日歷,獲得了贊賞第一名,獎品為200塊的京東卡。
登陸系統看了下,除了這篇文章還有好幾篇獲得了同事們的打賞鼓勵,加起來差不多20多塊吧。
其實打賞這個東西,作者關注的的不是金額,你給一分也是愛。他們更在意的是獲得大家的肯定與鼓勵,所以在這里感謝那些陌生的朋友們對我文章的肯定。

今天說說requests-plus模塊

requests模塊為urllib(urllib3)的封裝模塊,它的存在使得網絡請求變得so easy!那么requests-plus模塊又是個什么鬼?朋友們要說了,你個大忽悠,我百度搜了哪里有這個模塊。是的,沒這個模塊,開局一個詞,其他全靠編,哈哈。
有接觸爬蟲的朋友們應該都知道,requests配合beautifulsoup,簡直是雙劍合璧。一個用于訪問網站并獲取html內容,另一個用來解析html??山裉靝lus選手將它們的功能合二為一了,模塊名為requests_html。

python模塊學習建議

學習python模塊,給大家個我自己不專業的建議

  1. 養成習慣,遇到一個模塊,先去github上看看開發者們關于它的說明,而不是直接百度看別人寫了什么東西。也許后者可以讓你很快入門,可那樣你更多的是在吃別人剩下的。而訪問Github,你可以在里面獲取到更多作者想告訴你的內容和相關的鏈接地址。怎么評估一個模塊好不好,最簡單的辦法就是看star,requests_html的star:9794,已經算很高的了。
    requests_html的Git地址:https://github.com/kennethreitz/requests-html。作者提供了官網http://html.python-requests.org/,用于更詳細的使用描述。
  2. python模塊下載,多數情況大家使用pip install xxxx輕松搞定。但請記住這個網址:https://pypi.org/。在你下載模塊前,先去搜索下它,看看pypi給你什么提示與要求。
    就比如requests_html,官方明確說明了,最新版本的requests-html 0.10.0 Requires: Python >=3.6.0。而支持3.5的最后一個版本是pip install requests-html==0.6.6
requests-html學習
安裝

python3.6+ pip install requests-html
python3.5 pip install requests-html==0.6.6
再強調一次,requests_html僅支持3.5+,且最新版本的requests_html僅支持3.6+ ,3.5的最后一個版本為0.6.6。
安裝時,你會發現,requests-html依賴了很多其他模塊,統一封裝后,讓開發變得更加無腦:

Successfully installed appdirs-1.4.3 bs4-0.0.1 certifi-2019.3.9 chardet-3.0.4
cssselect-1.0.3 fake-useragent-0.1.11 idna-2.8 lXML-4.3.3 parse-1.12.0
pyee-6.0.0 pyppeteer-0.0.25 pyquery-1.4.0 requests-2.22.0 requests-html-0.10.0
six-1.12.0 tqdm-4.32.1 w3lib-1.20.0 websockets-7.0

官網介紹

全面支持解析JavaScript!
CSS 選擇器 (jQuery風格, 感謝PyQuery).
XPath 選擇器, for the faint at heart.
自定義user-agent (就像一個真正的web瀏覽器).
自動追蹤重定向.
連接池與cookie持久化.
令人欣喜的請求體驗,魔法般的解析頁面.

舉幾個毛栗子

下面舉幾個官網的栗子,內容來自:http://html.python-requests.org/

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.baidu.com/')
  • 獲取網頁內容
    print(r.html.html)

  • 獲取鏈接
    print(r.html.links)
    print(r.html.absolute_links)
    links和absolute_links兩個屬性分別返回HTML對象所包含的所有鏈接和絕對鏈接(均不包含錨點)

  • 通過CSS選擇器獲取元素
    r.html.find([selector],[first=True])
    selector選擇器,使用jQuery風格。如果不熟悉,給你個jQuery的官網傳送門:https://api.jquery.com/category/selectors/
    添加first=True則為find ,不添加則為findAll,簡潔明了...
    但需要注意,如果沒有添加first=True,即便返回一個元素,結果也將是list類型

  • 通過xpath獲取元素
    r.html.xpath('//*[@id="su"]', first=True) # 獲取百度一下按鈕地址...

  • 元素具體內容

# 獲取網站html內容
r.html.html
# 獲取網站文本內容
r.html.text
# 上面倆內容太多就不打印了...
# 獲取元素的屬性
print(r.html.xpath('//*[@id="su"]', first=True).attrs)
output:
{'class': ('bg', 's_btn'), 'id': 'su', 'type': 'submit', 'value': '百度一下'}
  • JavaScript支持
    requests_html的js執行是亮點,但是毀在了默認安裝上...
    r.html.render() 首次執行該方法是,模塊會檢查依賴,并下載chromium,chromium是什么鬼,看起來很像chrome?
    搞過selenium的應該知道,這里簡單對比下chrome和chromium:
  1. Chromium是谷歌的開源項目,開發者們可以共同去改進它,然后谷歌會收集改進后的Chromium并發布改進后安裝包。Chrome不是開源項目,谷歌會把Chromium的東西更新到Chrome中。你也可以這么理解Chromium是體驗版,Chrome是正式版;
  2. Chromium不用安裝,下載下來的是壓縮包,解壓后直接就可以使用。Chrome需要安裝;
  3. Chromium功能比Chrome多,因為新功能都是先在Chromium中使用,等完善后才添加到Chrome中。相對的Chrome就要比Chromium穩定很多不容易出錯;
  4. Chromium不開放自動更新功能,所以用戶需手動下載更新,而Chrome則可自動連上Google的服務器更新,但新版的推出很慢。

但是,模塊在安裝的時候由于SSLCertVerificationError問題,沒辦法進行自動化安裝:

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)')))

好在模塊給出了地址,拼接host和uri即可進行下載:
http://storage.googleapis.com//chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip
我家里下載好慢,這點就不演示了,大家對這官網扭一扭吧...

requests-html示例

到了今天今天的重點了,使用requests-html獲取2019中國虛假大學!

“虛假大學”是未在教育部備案,不具備招生資格、沒有辦學資質、涉嫌非法招生和網絡詐騙的“虛假大學”。

這些虛假大學數據統計,來源于人民日報。其中還鬧過一個笑話,一個網站轉載人民日報的這條新聞時,誤將中國郵電大學寫成了北京郵電大學,結果北郵發飆要求該媒體即刻修改并致歉!然后,人民日報表示躺著也中槍.為人民日報獻上一首白智英的像中槍一樣。
好了不發散回正題,為了演示requests-html示例,找到了這個網站:
高三網:http://www.gaosan.com/gaokao/249708.html
網站以文本的格式,列出了392所虛假大學名單!那么,我們就用requests-html,獲取一下它的數據,讓你們看看requests-html有多簡單!

5847426-4bb210f52b8aaaf8.png 高三網.png
分析下下網站結構,清楚明白,數據包裹在 內部,從第三個p標簽開始為我們所需要的數據。

代碼實現:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清風Python
# @Date     : 2019/6/27 1:28
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : PseudoCollege.py

from requests_html import HTMLSession
import json


class PseudoCollege:
    def __init__(self, url):
        self.url = url
        self.headers = {"User-Agent": ("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 "
                                       "(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36")
                        }

    def get_response(self):
        session = HTMLSession()
        return session.get(self.url, headers=self.headers)

    def filter_info(self):
        html_data = self.get_response()
        # 從第三個P標簽開始,獲取虛假大學數據
        return html_data.html.find('div#data249708 p')[2:]

    @staticmethod
    def get_json(data):
        info = {}
        city = None
        for line in data:
            # 每個城市會顯示為 

北京:151所

if 'strong' in line.html: # 拆分城市與虛假大學數量 city, total_college = line.text.split(':') # 構造字典 info[city] = dict(total=total_college, data=[]) continue info[city]['data'].append(line.text) with open('colleges.json', 'w+', encoding='utf-8') as f: # ensure_ascii默認為True,json.dump后會被轉碼... f.write(json.dumps(info, ensure_ascii=False)) def run(): url = 'http://www.gaosan.com/gaokao/249708.html' main = PseudoCollege(url) data = main.filter_info() main.get_json(data) if __name__ == '__main__': run()

叫College感覺有點諷刺...最終將這些學校保存至colleges.json的文本中,我看看結果片段:

  ... ... ,
  "陜西": {
    "total": "16所",
    "data": [
      "西安電子信息學院",
      "西安理工學院",
      "西安工商學院",
      "西安科技師范大學",
      "西安信息技術學院",
      "西安工商管理學院",
      "西安工業科技技術學院",
      "西安工業科技學院",
      "陜西國防工業技術學院",
      "陜西瀚林醫科學院",
      "西安工業工程學院",
      "陜西工貿職業學院",
      "西安科技職業學院",
      "西安經濟技術學院",
      "西安機電工程學院",
      "陜西科技管理學院"
    ]
  },
  "福建": {
    "total": "5所",
    "data": [
      "廈門師范學院",
      "福建海峽經貿技術學院",
      "福建經濟貿易大學",
      "福建科技學院",
      "福建省輕工業學院"
    ]
  },
  ... ...
The End

一個不留神又搞到二半夜了,哎...
快將這392所虛假大學名單,傳播給你身邊有孩子高考的朋友吧。
OK,今天的內容就到這里,如果覺得有幫助,歡迎將文章或我的微信公眾號【清風Python】分享給更多喜歡python的人,謝謝。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩