爬蟲新寵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模塊,給大家個我自己不專業的建議:
- 養成習慣,遇到一個模塊,先去github上看看開發者們關于它的說明,而不是直接百度看別人寫了什么東西。也許后者可以讓你很快入門,可那樣你更多的是在吃別人剩下的。而訪問Github,你可以在里面獲取到更多作者想告訴你的內容和相關的鏈接地址。怎么評估一個模塊好不好,最簡單的辦法就是看star,requests_html的star:9794,已經算很高的了。
requests_html的Git地址:https://github.com/kennethreitz/requests-html。作者提供了官網http://html.python-requests.org/,用于更詳細的使用描述。 - 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:
- Chromium是谷歌的開源項目,開發者們可以共同去改進它,然后谷歌會收集改進后的Chromium并發布改進后安裝包。Chrome不是開源項目,谷歌會把Chromium的東西更新到Chrome中。你也可以這么理解Chromium是體驗版,Chrome是正式版;
- Chromium不用安裝,下載下來的是壓縮包,解壓后直接就可以使用。Chrome需要安裝;
- Chromium功能比Chrome多,因為新功能都是先在Chromium中使用,等完善后才添加到Chrome中。相對的Chrome就要比Chromium穩定很多不容易出錯;
- 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有多簡單!

分析下下網站結構,清楚明白,數據包裹在
內部,從第三個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%的其他從業者!