使用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)