爬虫新宠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。可今天plus选手将它们的功能合二为一了,模块名为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有多简单!

高三网.png

分析下下网站结构,清楚明白,数据包裹在<div id="data249708">内部,从第三个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:
            # 每个城市会显示为 <p><strong>北京:151所</strong></p>
            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的人,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • Python上有一个非常著名的HTTP库——requests,相比大家都听说过,用过的人都说好!现在request...
    乐百川阅读 6,460评论 4 18
  • 概要 了解了爬虫原理和网页构造后,我们知道了爬虫的任务就是两件事:请求网页和解析提取信息。 主要涉及的知识点如下:...
    OzanShareing阅读 752评论 0 0
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,965评论 1 3
  • 《思夜》/ 红尘落燕 我平躺河的北方 柔软的月亮 化为思念的马 走进你所住的梦乡 泪水不知何时婆娑了眼眶 ...
    红尘落燕阅读 316评论 11 15
  • 灵性彩油:用色彩与自我对话的自选体系,有116支美丽的双色瓶构成。 解读:这是一个与内在使命有关的创造力的表现。我...
    南乔木贞阅读 248评论 0 0