使用python中的requests爬取软科大学排名并存储在本地MySql数据库

使用python的requests和lxml库来实现爬虫功能

使用requerts和lxml来连接到网页并且获取到网页内容,requests用来连接网页。lxml用来解析格式。然后把需要的获取的东西 比如软科排名里的 大学名称、logo、英文名称、描述爬取下来并且放在自己本地的MySql数据库里

先使用MySql建立好数据库,我用的5.7版本

数据库建立样式
下面是我成功添加到数据库的内容
在这里插入图片描述

下面是我查询的内容

分页查询

下面是主函数。

import Sprider as sr
from MySQlDBHelper import DBConnect
if __name__ == "__main__":
    url = "https://www.shanghairanking.cn/rankings/bcur/202111"
    header = {
        "User - Agent":"",  #使用自己浏览器的User -agent 自己填
        'Referer':"https://www.shanghairanking.cn/"

    }
	
	#下面的代码用来连接网页并且获取网页内容
    content = sr.getContent(url,header)
    tul = sr.getInfo(content)
    conn = DBConnect()

	'''
    往数据库里添加网页里夫区的内容
    '''
    sql = "insert into tb_univ(title,logo,enmae,type) values (%s,%s,%s,%s)" #预处理sql 能防sql注入

    for j in range(0,len(tul[0])): #大学名称.logo.英文名称.描述
            title = tul[0][j]
            logo  = tul[1][j]
            ename = tul[2][j]
            type  = tul[3][j]
            print(title,logo,ename,type)
            tul1 =(title,logo,ename,type)
            conn.executeCUD(sql,tul1)


    '''
    查询数据库里添加好的网页内容 
    '''
    sql_query = "select * from tb_univ limit %s,%s"
    print("*" * 40)
    rs = conn.executeQuery(sql_query,(2*5,5))
    for index,item in enumerate(rs):
        print(index,"-",item[1])
    print("*"*40)
    conn.close()
    

上面是主函数里面的内容。我们把爬虫的代码和连接数据库的任务放在其他的file里

下面是把爬虫代码单独写成方法

import requests
from lxml import etree
def getContent(url,header):
    req = requests.get(url=url,headers=header)
    html_content = req.content.decode('utf-8')
    return html_content

def getInfo(con):
    base_path = '//*[@id="content-box"]/div[2]/table/tbody/tr'
    title_flag = '/td[2]/div/div[2]/div[1]/div/div/a/text()'
    logo_flag = '/td[2]/div/div[1]/img/@src'
    english_name = '/td[2]/div/div[2]/div[2]/div/div/a/text()'
    evg_type = '/td[2]/div/div[2]/p/text()'
    ht = etree.HTML(con)

    title_info = ht.xpath(base_path[1]+title_flag)
    logo_info = ht.xpath(base_path[1]+logo_flag)
    english_name = ht.xpath(base_path[1]+english_name)
    evg_type = ht.xpath(base_path[1]+evg_type)
    return title_info,logo_info,english_name,evg_type

下面是连接数据库的工具类,封装成类。方便通用,使用了面向对象的方法

import pymysql as pm
'''
通用的数据库操作工具类
'''
class DBConnect():

    def __init__(self):
        #连接数据库
        try:
            self.conn = pm.connect(host="localhost",port=3306,user="root",password="root")#里面的参数是我自己的MySql数据库的参数。自己填自己的
            self.conn.select_db("univ_db") #这是我自己创建的数据库。
            print("数据库连接成功")
        except Exception as e:
            print("数据库连接失败")



    def executeQuery(self,sql,args):
        self.curr = self.conn.cursor()
        self.curr.execute(sql,args)
        rs = self.curr.fetchall()
        return rs
    def executeCUD(self,sql,args):
        try:
            self.curr = self.conn.cursor();
            i = self.curr.execute(sql,args)
            self.conn.commit()
            print("影响"+i+"条")
            return i
        except Exception as e:
            print("操作数据库")

    def close(self):
        try:
            self.curr.close()
            self.conn.close()
            print("关闭数据库成功")
        except Exception as e:
            print("关闭数据库失败",e)



# dbm = DBConnect()
# sql = "insert into tb_univ(title,enmae,type) values (%s,%s,%s)"
# dbm.executeCUD(sql,('北京大学','PeKing','985/211'))#用来测试插入功能是否实现。

既然把上面的连接数据库的方法封装成了工具类。那我们实现别的功能需要用到数据库的时候也就可以直接使用那个工具类了。比如,我下面的代码是用来实现往数据库添加随机10个英文字母和数字

import random
import string

from MySQlDBHelper import DBConnect
def addInfo(sql,args):
    db = DBConnect()
    i = db.executeCUD(sql,args)
    db.close()
    return i
def query(sql,args):
    db = DBConnect()
    rs = db.executeQuery(sql,args)
    db.close()
    return rs

if __name__ =="__main__": #下面被我注释的代码是我已经插入成功了。第一次的话把注释给解除掉
    # sql = "insert into tb_user(uname,age) values(%s,%s)"
    # for i in range(100):
    #     str1 = list(string.ascii_letters)
    #     random.shuffle(str1)
    #     temp_str = "".join(str1)
    #     args =(temp_str[0:10],random.randint(1,100))
    #     i = addInfo(sql,args)
    #     print("数据插入成功:",i)


    queryStr = "select * from tb_user"
    rs = query(queryStr, ())
    items = [repr(index) + "-" + item[1] + ":" + repr(item[2]) for index, item in enumerate(rs)]
    for i in items:
        print(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值