专栏首页Python乱炖python爬取考研网的信息

python爬取考研网的信息

今天我们使用python来爬取考研网站的信息。

目标网站:

https://yz.chsi.com.cn/zsml/queryAction.do

使用的库:

requests,bs4,pandas

这些库统一可以使用pip进行统一安装

pip install requests

pip install bs4

pip install pandas

安装完之后我们便可以进行信息的爬取了

首先,我们去考研网上查看一下网站的头部信息:

使用开发者模式,在请求里面找到请求头部的信息。

我们需要把user-agent提取出来:

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKi"
              "t/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"

首先我们需要获取三个字段的接口数据,分别是:省份,学科,专业编号

http://yz.chsi.com.cn/zsml/pages/getSs.jsp
http://yz.chsi.com.cn/zsml/pages/getMl.jsp
http://yz.chsi.com.cn/zsml/pages/getZy.jsp

下面我们来获取一个学校的网址:

url = "http://yz.chsi.com.cn/zsml/queryAction.do"
data = {
    "ssdm": self.province,
    "yjxkdm": self.category,
}
response = requests.post(url, data=data, headers=self.head)
html = response.text
reg = re.compile(r'(<tr>.*? </tr>)', re.S)
content = re.findall(reg, html)
schools_url = re.findall('<a href="(.*?)" target="_blank">.*?</a>', str(content))

我们使用正则表达式获取tr标签里面的内容

对于获取的内容,我们统一只获取a标签中的超链接,这就是对应的学校的网址

(.*?万能匹配表达式,匹配目标元素0次或者多次,懒惰模式)

下面我们要干的事情是获取一个学校的所有数据

拿到学校的url之后,我们可以再次通过正则表达式获取学校网站上所有的有用的内容。

response = requests.get(url, headers=self.head)
html = response.text
colleges_url = re.findall('<td class="ch-table-center"><a href="(.*?)" '
                          'target="_blank">查看</a>', html)

下面我们通过已经获取的school_url和colleges_url去获取所有学校的数据

url = "http://yz.chsi.com.cn"
schools_url = self.get_school_url()
amount = len(schools_url)
i = 0
for school_url in schools_url:
    i += 1
    url_ = url + school_url
    # 找到一个学校对应所有满足学院网址
    colleges_url = self.get_college_data(url_)
    print("已完成第" + str(i) + "/" + str(amount) + "学院爬取")
    time.sleep(1)
    for college_url in colleges_url:
        _url = url + college_url
        get_final_data(_url)

最后利用pandas将获取的数据转化成csv格式存储:

data = DataFrame(self.data)
data.to_csv("查询招生信息.csv", encoding="utf_8_sig")

这样我们就可以获取所有的学校的考研专业的数据啦!

对于北京的一些大学,就有近900条信息

对于自己想看哪个学校,只需要给定相应的省份编号和专业代码就可以查询。

现在我们可以优化一下代码,我们将之前的代码都封装在方法里面。

import requests
from bs4 import BeautifulSoup
from pandas.core.frame import DataFrame
import re
import time

class Graduate:
    def __init__(self, province, category):
        self.head = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKi"
                          "t/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
        }
        self.data = []
        self.province = province
        self.category = category

    def get_list_fun(self, url, name):
        """获取提交表单代码"""
        response = requests.get(url, headers=self.head)
        province = response.json()
        with open("{}.txt".format(name), "w") as f:
            for x in province:
                f.write(str(x))
                f.write("\n")

    def get_list(self):
        self.get_list_fun("http://yz.chsi.com.cn/zsml/pages/getSs.jsp", "province")
        self.get_list_fun('http://yz.chsi.com.cn/zsml/pages/getMl.jsp', "category")
        self.get_list_fun('http://yz.chsi.com.cn/zsml/pages/getZy.jsp', 'major')

    def get_school_url(self):
        url = "http://yz.chsi.com.cn/zsml/queryAction.do"
        data = {
            "ssdm": self.province,
            "yjxkdm": self.category,
        }
        response = requests.post(url, data=data, headers=self.head)
        html = response.text
        reg = re.compile(r'(<tr>.*? </tr>)', re.S)
        content = re.findall(reg, html)
        schools_url = re.findall('<a href="(.*?)" target="_blank">.*?</a>', str(content))
        return schools_url

    def get_college_data(self, url):
        """返回一个学校所有学院数据"""
        response = requests.get(url, headers=self.head)
        html = response.text
        colleges_url = re.findall('<td class="ch-table-center"><a href="(.*?)" '
                                  'target="_blank">查看</a>', html)
        return colleges_url

    def get_final_data(self, url):
        """输出一个学校一个学院一个专业的数据"""
        temp = []
        response = requests.get(url, headers=self.head)
        html = response.text
        soup = BeautifulSoup(html, features='lxml')
        summary = soup.find_all('td', {"class": "zsml-summary"})
        for x in summary:
            temp.append(x.get_text())
        self.data.append(temp)

    def get_schools_data(self):
        """获取所有学校的数据"""
        url = "http://yz.chsi.com.cn"
        schools_url = self.get_school_url()
        amount = len(schools_url)
        i = 0
        for school_url in schools_url:
            i += 1
            url_ = url + school_url
            # 找到一个学校对应所有满足学院网址
            colleges_url = self.get_college_data(url_)
            print("已完成第" + str(i) + "/" + str(amount) + "学院爬取")
            time.sleep(1)
            for college_url in colleges_url:
                _url = url + college_url
                self.get_final_data(_url)

    def get_data_frame(self):
        """将列表形数据转化为数据框格式"""
        data = DataFrame(self.data)
        data.to_csv("查询招生信息.csv", encoding="utf_8_sig")


if __name__ == '__main__':
    # province = input("请输入查询学校省份编号:")
    # category = input("请输入查询专业代码:")
    province = "11"
    category = "0812"
    spyder = Graduate(province, category)
    spyder.get_schools_data()
    spyder.get_data_frame()

所有代码都放在GitHub,代码地址:

https://github.com/johnturingwu/helloworld/blob/master/kaoyan.py

点击阅读原文可直达。

本文分享自微信公众号 - Python乱炖(Cooking_python),作者:我被狗咬了

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Tensorflow学习笔记---人脸识别DEMO实现

    我被狗咬了
  • 答疑《python的CLS》

    这两天有个朋友看到这样的一个代码,问我啥意思,我第一眼看上去也是比较懵的(原谅我比较菜,见识短),cls后面竟然多了个括号???,直接开始用了????

    我被狗咬了
  • python实现秒杀商品的微信提醒

    我们需要找到它的商品信息,需要打开浏览器的开发者模式,之后我们需要选择自己的配送地址,这个时候里面就发送一些接口请求:

    我被狗咬了
  • [接口测试_B] 13 pytest+requests实战练习

    找不到免费的接口,所以依然以requests官方文档中出现的httpbin为示例,为了保持网络的稳定,可以把httpbin搭建在本地。

    苦叶子
  • ​Python程序员因为和女朋友斗图斗输了,一怒之下爬取了网站30页表情包

    *声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

    python学习教程
  • Tomcat自带的Session共享方案实施记录

    一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到...

    洗尽了浮华
  • Zabbix监控调用map.get并且下载图文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 17/8/28 上午9:09 # @Aut...

    98k
  • StreamCQL : 实时计算系统 ( CEP ) 中的持续查询语言 CQL

    StreamCQL : 实时计算系统中的持续查询语言 CQL  ( Continuous Query Language )  是一个针对流式数据的查询语言。相对...

    田春峰-JCJC错别字检测
  • 使用代码获得Hybris Commerce里显示的产品图片

    https://<host>:9002/rest/v2/electronics/products/300938?fields=FULL

    Jerry Wang
  • Django rest-framework视图家族

    总结:GenericAPIView就是在APIView基础上额外提供了三个方法和三个类属性,如果不配合视图工具类,则体现不出来优势所在

    GH

扫码关注云+社区

领取腾讯云代金券