Python爬虫——爬取中国高校排名前100名并写入MySQL

  本篇分享讲爬取中国高校排名前100名并将其写入MySQL,这样做的好处是:1.将数据存入数据库,能永久利用;2.能利用数据库技术做一些其他操作。爬取的网页是:http://gaokao.xdf.cn/201702/10612921.html, 截图如下(部分):
  Python爬虫——爬取中国高校排名前100名并写入MySQL_第1张图片
  我们的程序在Linux平台上运行,需要用到MySQL和Python中的MySQLdb模块,其中MySQLdb 是封装MySQL访问和操作的模块。我们的思路是:先利用urllib和BeautifulSoup爬取前100名的表格,返回list形式,再利用MySQLdb将list写入数据中。
  

def get_html(url):
        html = urllib.request.urlopen(url)  
        content = html.read()  
        html.close()
        soup = BeautifulSoup(content, "lxml")      
        table = soup.find('tbody')
        count = 0 
        lst = []
        for tr in table.children:
            if isinstance(tr, bs4.element.Tag):
                td = tr('td')
                if count >= 2:
                    lst.append([td[i]('p')[0].string.replace('\n','').replace('\t','') for i in range(8) if i != 3])
                count += 1

        return lst

  该段代码实现了爬取中国高校前100名的表格,并保留了名次、学校名称、地区、总分、办学类型、星级排名、办学层次这7个字段。其中的url即为开始提到的网站网址。

    url = 'http://gaokao.xdf.cn/201702/10612921.html'
    universities_lst = get_html(url)
    # 打开数据库连接
    db = MySQLdb.connect("localhost","root","147369","test",charset='utf8')
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # 使用execute方法执行SQL语句
    cursor.execute("SET NAMES utf8");
    cursor.execute("""create table university_rank(排名 int(3),高校 varchar(20),地区 varchar(10),总分 decimal(9,2),办学类型 varchar(10),
                                        星级排名 varchar(8),办学层次 varchar(40)) default charset = utf8""")
    for x in universities_lst:
        sql = "insert into university_rank values('%s','%s','%s','%s','%s','%s','%s')"%(x[0],x[1],x[2],x[3],x[4],x[5],x[6])
        cursor.execute(sql)
    db.commit()

    # 关闭数据库连接
    db.close()  
    print("Create table already! Please check Mysql!")

  该段代码将上述爬取的表格写入MySQL数据库中,先新建一张university_rank表格,再讲值插入。我们可以去MySQL中查看。
  Python爬虫——爬取中国高校排名前100名并写入MySQL_第2张图片
  这说明我们确实将爬取的高校排名写入了MySQL,接下来我们就只需要对数据库进行操作了,比如说我想知道在这前100中,每个省份的学校数量,可以通过以下命令实现:
  Python爬虫——爬取中国高校排名前100名并写入MySQL_第3张图片
  从中我们可以,前100名中的高校中,北京最多,有19所,江苏其次,11所,上海第三,有9所。当然,我们还可以用该数据库做一些其他有趣的事情~~
  



  本次分享到此结束,如有不足之处,还往批评指正。
  P.S.附上本篇分享的整个程序:
  

'''
Created on Aug 16, 2017

@author: vagrant
'''
# -*- coding: UTF-8 -*-
import bs4
import MySQLdb
import urllib.request  
from bs4 import BeautifulSoup 

def get_html(url):
        html = urllib.request.urlopen(url)  
        content = html.read()  
        html.close()
        soup = BeautifulSoup(content, "lxml")      
        table = soup.find('tbody')
        count = 0 
        lst = []
        for tr in table.children:
            if isinstance(tr, bs4.element.Tag):
                td = tr('td')
                if count >= 2:
                    lst.append([td[i]('p')[0].string.replace('\n','').replace('\t','') for i in range(8) if i != 3])
                count += 1

        return lst

if __name__ == '__main__':
    url = 'http://gaokao.xdf.cn/201702/10612921.html'
    universities_lst = get_html(url)
    # 打开数据库连接
    db = MySQLdb.connect("localhost","root","147369","test",charset='utf8')
    # 使用cursor()方法获取操作游标 
    cursor = db.cursor()
    # 使用execute方法执行SQL语句
    cursor.execute("SET NAMES utf8");
    cursor.execute("""create table university_rank(排名 int(3),高校 varchar(20),地区 varchar(10),总分 decimal(9,2),办学类型 varchar(10),
                                        星级排名 varchar(8),办学层次 varchar(40)) default charset = utf8""")
    for x in universities_lst:
        sql = "insert into university_rank values('%s','%s','%s','%s','%s','%s','%s')"%(x[0],x[1],x[2],x[3],x[4],x[5],x[6])
        cursor.execute(sql)
    db.commit()

    # 关闭数据库连接
    db.close()  
    print("Create table already! Please check Mysql!")

你可能感兴趣的:(Python爬虫)