Python如何爬取51cto数据并存入MySQL
实验环境
1.安装Python3.7
2.安装requests,bs4,pymysql模块
实验步骤1.安装环境及模块
可参考https://www.nhooo.com/article/194104.htm
2.编写代码
#51cto博客页面数据插入mysql数据库
#导入模块
importre
importbs4
importpymysql
importrequests
#连接数据库账号密码
db=pymysql.connect(host='172.171.13.229',
user='root',passwd='abc123',
db='test',port=3306,
charset='utf8')
#获取游标
cursor=db.cursor()
defopen_url(url):
#连接模拟网页访问
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)'
'Chrome/57.0.2987.98Safari/537.36'}
res=requests.get(url,headers=headers)
returnres
#爬取网页内容
deffind_text(res):
soup=bs4.BeautifulSoup(res.text,'html.parser')
#博客名
titles=[]
targets=soup.find_all("a",class_="tit")
foreachintargets:
each=each.text.strip()
if"置顶"ineach:
each=each.split('')[0]
titles.append(each)
#阅读量
reads=[]
read1=soup.find_all("p",class_="readflon")
read2=soup.find_all("p",class_="readfl")
foreachinread1:
reads.append(each.text)
foreachinread2:
reads.append(each.text)
#评论数
comment=[]
targets=soup.find_all("p",class_='commentfl')
foreachintargets:
comment.append(each.text)
#收藏
collects=[]
targets=soup.find_all("p",class_='collectfl')
foreachintargets:
collects.append(each.text)
#发布时间
dates=[]
targets=soup.find_all("a",class_='timefl')
foreachintargets:
each=each.text.split(':')[1]
dates.append(each)
#插入sql语句
sql="""insertintoblog(blog_title,read_number,comment_number,collect,dates)
values('%s','%s','%s','%s','%s');"""
#替换页面\xa0
fortitles,reads,comment,collects,datesinzip(titles,reads,comment,collects,dates):
reads=re.sub('\s','',reads)
comment=re.sub('\s','',comment)
collects=re.sub('\s','',collects)
cursor.execute(sql%(titles,reads,comment,collects,dates))
db.commit()
pass
#统计总页数
deffind_depth(res):
soup=bs4.BeautifulSoup(res.text,'html.parser')
depth=soup.find('li',class_='next').previous_sibling.previous_sibling.text
returnint(depth)
#主函数
defmain():
host="https://blog.51cto.com/13760351"
res=open_url(host)#打开首页链接
depth=find_depth(res)#获取总页数
#爬取其他页面信息
foriinrange(1,depth+1):
url=host+'/p'+str(i)#完整链接
res=open_url(url)#打开其他链接
find_text(res)#爬取数据
#关闭游标
cursor.close()
#关闭数据库连接
db.close()
if__name__=='__main__':
main()
3..MySQL创建对应的表
CREATETABLE`blog`( `row_id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键', `blog_title`varchar(52)DEFAULTNULLCOMMENT'博客标题', `read_number`varchar(26)DEFAULTNULLCOMMENT'阅读数量', `comment_number`varchar(16)DEFAULTNULLCOMMENT'评论数量', `collect`varchar(16)DEFAULTNULLCOMMENT'收藏数量', `dates`varchar(16)DEFAULTNULLCOMMENT'发布日期', PRIMARYKEY(`row_id`) )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;
4.运行代码,查看效果:
改进版:
改进内容:
1.数据库里面的某些字段只保留数字即可
2.默认爬取的内容都是字符串,存放数据库的某些字段,最好改为整型,方便后面数据库操作
1.代码如下:
importre
importbs4
importpymysql
importrequests
#连接数据库
db=pymysql.connect(host='172.171.13.229',
user='root',passwd='abc123',
db='test',port=3306,
charset='utf8')
#获取游标
cursor=db.cursor()
defopen_url(url):
#连接模拟网页访问
headers={
'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)'
'Chrome/57.0.2987.98Safari/537.36'}
res=requests.get(url,headers=headers)
returnres
#爬取网页内容
deffind_text(res):
soup=bs4.BeautifulSoup(res.text,'html.parser')
#博客标题
titles=[]
targets=soup.find_all("a",class_="tit")
foreachintargets:
each=each.text.strip()
if"置顶"ineach:
each=each.split('')[0]
titles.append(each)
#阅读量
reads=[]
read1=soup.find_all("p",class_="readflon")
read2=soup.find_all("p",class_="readfl")
foreachinread1:
reads.append(each.text)
foreachinread2:
reads.append(each.text)
#评论数
comment=[]
targets=soup.find_all("p",class_='commentfl')
foreachintargets:
comment.append(each.text)
#收藏
collects=[]
targets=soup.find_all("p",class_='collectfl')
foreachintargets:
collects.append(each.text)
#发布时间
dates=[]
targets=soup.find_all("a",class_='timefl')
foreachintargets:
each=each.text.split(':')[1]
dates.append(each)
#插入sql语句
sql="""insertintoblogs(blog_title,read_number,comment_number,collect,dates)
values('%s','%s','%s','%s','%s');"""
#替换页面\xa0
fortitles,reads,comment,collects,datesinzip(titles,reads,comment,collects,dates):
reads=re.sub('\s','',reads)
reads=int(re.sub('\D',"",reads))#匹配数字,转换为整型
comment=re.sub('\s','',comment)
comment=int(re.sub('\D',"",comment))#匹配数字,转换为整型
collects=re.sub('\s','',collects)
collects=int(re.sub('\D',"",collects))#匹配数字,转换为整型
dates=re.sub('\s','',dates)
cursor.execute(sql%(titles,reads,comment,collects,dates))
db.commit()
pass
#统计总页数
deffind_depth(res):
soup=bs4.BeautifulSoup(res.text,'html.parser')
depth=soup.find('li',class_='next').previous_sibling.previous_sibling.text
returnint(depth)
#主函数
defmain():
host="https://blog.51cto.com/13760351"
res=open_url(host)#打开首页链接
depth=find_depth(res)#获取总页数
#爬取其他页面信息
foriinrange(1,depth+1):
url=host+'/p'+str(i)#完整链接
res=open_url(url)#打开其他链接
find_text(res)#爬取数据
#关闭游标
cursor.close()
#关闭数据库连接
db.close()
#主程序入口
if__name__=='__main__':
main()
2.创建对应表
CREATETABLE`blogs`( `row_id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'主键', `blog_title`varchar(52)DEFAULTNULLCOMMENT'博客标题', `read_number`int(26)DEFAULTNULLCOMMENT'阅读数量', `comment_number`int(16)DEFAULTNULLCOMMENT'评论数量', `collect`int(16)DEFAULTNULLCOMMENT'收藏数量', `dates`varchar(16)DEFAULTNULLCOMMENT'发布日期', PRIMARYKEY(`row_id`) )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;
3.运行代码,验证
升级版
为了能让小白就可以使用这个程序,可以把这个项目打包成exe格式的文件,让其他人,使用电脑就可以运行代码,这样非常方便!
1.改进代码:
#末尾修改为:
if__name__=='__main__':
main()
print("\n\t\t所有数据已成功存放数据库!!!\n")
time.sleep(5)
2.安装打包模块pyinstaller(cmd安装)
pipinstallpyinstaller-ihttps://pypi.tuna.tsinghua.edu.cn/simple/
3.Python代码打包
1.切换到需要打包代码的路径下面
2.在cmd窗口运行pyinstaller-Ftest03.py(test03为项目名称)
4.查看exe包
在打包后会出现dist目录,打好包就在这个目录里面
5.运行exe包,查看效果
检查数据库
总结:
1.这一篇博客,是在上一篇的基础上改进的,步骤是先爬取首页的信息,再爬取其他页面信息,最后在改进细节,打包exe文件
2.我们爬取网页数据大多数还是存放到数据库的,所以这种方法很实用。
3.其实在此博客的基础上还是可以改进的,重要的是掌握方法即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。