Python如何爬取51cto数据并存入MySQL


Posted in Python onAugust 25, 2020

实验环境

1.安装Python 3.7

2.安装requests, bs4,pymysql 模块

实验步骤1.安装环境及模块

可参考https://3water.com/article/194104.htm

2.编写代码

# 51cto 博客页面数据插入mysql数据库
# 导入模块
import re
import bs4
import pymysql
import requests

# 连接数据库账号密码
db = pymysql.connect(host='172.171.13.229',
           user='root', passwd='abc123',
           db='test', port=3306,
           charset='utf8')
# 获取游标
cursor = db.cursor()

def open_url(url):
  # 连接模拟网页访问
  headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
           'Chrome/57.0.2987.98 Safari/537.36'}
  res = requests.get(url, headers=headers)
  return res

# 爬取网页内容
def find_text(res):
  soup = bs4.BeautifulSoup(res.text, 'html.parser')

  # 博客名
  titles = []
  targets = soup.find_all("a", class_="tit")
  for each in targets:
    each = each.text.strip()
    if "置顶" in each:
      each = each.split(' ')[0]
    titles.append(each)

  # 阅读量
  reads = []
  read1 = soup.find_all("p", class_="read fl on")
  read2 = soup.find_all("p", class_="read fl")
  for each in read1:
    reads.append(each.text)
  for each in read2:
    reads.append(each.text)

  # 评论数
  comment = []
  targets = soup.find_all("p", class_='comment fl')
  for each in targets:
    comment.append(each.text)

  # 收藏
  collects = []
  targets = soup.find_all("p", class_='collect fl')
  for each in targets:
    collects.append(each.text)

   # 发布时间
  dates=[]
  targets = soup.find_all("a", class_='time fl')
  for each in targets:
    each = each.text.split(':')[1]
    dates.append(each)

  # 插入sql 语句
  sql = """insert into blog (blog_title,read_number,comment_number, collect, dates)
  values( '%s', '%s', '%s', '%s', '%s');"""
  # 替换页面 \xa0
  for titles, reads, comment, collects, dates in zip(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

# 统计总页数
def find_depth(res):
  soup = bs4.BeautifulSoup(res.text, 'html.parser')
  depth = soup.find('li', class_='next').previous_sibling.previous_sibling.text
  return int(depth)

# 主函数
def main():
  host = "https://blog.51cto.com/13760351"
  res = open_url(host) # 打开首页链接
  depth = find_depth(res) # 获取总页数

  # 爬取其他页面信息
  for i in range(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创建对应的表

CREATE TABLE `blog` (
 `row_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `blog_title` varchar(52) DEFAULT NULL COMMENT '博客标题',
 `read_number` varchar(26) DEFAULT NULL COMMENT '阅读数量',
 `comment_number` varchar(16) DEFAULT NULL COMMENT '评论数量',
 `collect` varchar(16) DEFAULT NULL COMMENT '收藏数量',
 `dates` varchar(16) DEFAULT NULL COMMENT '发布日期',
 PRIMARY KEY (`row_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Python如何爬取51cto数据并存入MySQL

4.运行代码,查看效果:

Python如何爬取51cto数据并存入MySQL

改进版:

改进内容:

1.数据库里面的某些字段只保留数字即可

2.默认爬取的内容都是字符串,存放数据库的某些字段,最好改为整型,方便后面数据库操作

1.代码如下:

import re
import bs4
import pymysql
import requests

# 连接数据库
db = pymysql.connect(host='172.171.13.229',
           user='root', passwd='abc123',
           db='test', port=3306,
           charset='utf8')
# 获取游标
cursor = db.cursor()

def open_url(url):
  # 连接模拟网页访问
  headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
           'Chrome/57.0.2987.98 Safari/537.36'}
  res = requests.get(url, headers=headers)
  return res

# 爬取网页内容
def find_text(res):
  soup = bs4.BeautifulSoup(res.text, 'html.parser')

  # 博客标题
  titles = []
  targets = soup.find_all("a", class_="tit")
  for each in targets:
    each = each.text.strip()
    if "置顶" in each:
      each = each.split(' ')[0]
    titles.append(each)

  # 阅读量
  reads = []
  read1 = soup.find_all("p", class_="read fl on")
  read2 = soup.find_all("p", class_="read fl")
  for each in read1:
    reads.append(each.text)
  for each in read2:
    reads.append(each.text)

  # 评论数
  comment = []
  targets = soup.find_all("p", class_='comment fl')
  for each in targets:
    comment.append(each.text)

  # 收藏
  collects = []
  targets = soup.find_all("p", class_='collect fl')
  for each in targets:
    collects.append(each.text)

  # 发布时间
  dates=[]
  targets = soup.find_all("a", class_='time fl')
  for each in targets:
    each = each.text.split(':')[1]
    dates.append(each)

  # 插入sql 语句
  sql = """insert into blogs (blog_title,read_number,comment_number, collect, dates)
  values( '%s', '%s', '%s', '%s', '%s');"""
  # 替换页面 \xa0
  for titles, reads, comment, collects, dates in zip(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

# 统计总页数
def find_depth(res):
  soup = bs4.BeautifulSoup(res.text, 'html.parser')
  depth = soup.find('li', class_='next').previous_sibling.previous_sibling.text
  return int(depth)

# 主函数
def main():
  host = "https://blog.51cto.com/13760351"
  res = open_url(host) # 打开首页链接
  depth = find_depth(res) # 获取总页数

  # 爬取其他页面信息
  for i in range(1, depth + 1):
    url = host + '/p' + str(i) # 完整链接
    res = open_url(url) # 打开其他链接
    find_text(res) # 爬取数据

  # 关闭游标
  cursor.close()
  # 关闭数据库连接
  db.close()

#主程序入口
if __name__ == '__main__':
  main()

2.创建对应表

CREATE TABLE `blogs` (
 `row_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `blog_title` varchar(52) DEFAULT NULL COMMENT '博客标题',
 `read_number` int(26) DEFAULT NULL COMMENT '阅读数量',
 `comment_number` int(16) DEFAULT NULL COMMENT '评论数量',
 `collect` int(16) DEFAULT NULL COMMENT '收藏数量',
 `dates` varchar(16) DEFAULT NULL COMMENT '发布日期',
 PRIMARY KEY (`row_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

3.运行代码,验证

Python如何爬取51cto数据并存入MySQL

升级版

为了能让小白就可以使用这个程序,可以把这个项目打包成exe格式的文件,让其他人,使用电脑就可以运行代码,这样非常方便!

1.改进代码:

#末尾修改为:
if __name__ == '__main__':
  main()
  print("\n\t\t所有数据已成功存放数据库!!! \n")
  time.sleep(5)

2.安装打包模块pyinstaller(cmd安装)

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple/

3.Python代码打包

1.切换到需要打包代码的路径下面

2.在cmd窗口运行 pyinstaller -F test03.py (test03为项目名称)

Python如何爬取51cto数据并存入MySQL

4.查看exe包

在打包后会出现dist目录,打好包就在这个目录里面

Python如何爬取51cto数据并存入MySQL

5.运行exe包,查看效果

Python如何爬取51cto数据并存入MySQL

检查数据库

Python如何爬取51cto数据并存入MySQL

总结:

1.这一篇博客,是在上一篇的基础上改进的,步骤是先爬取首页的信息,再爬取其他页面信息,最后在改进细节,打包exe文件

2.我们爬取网页数据大多数还是存放到数据库的,所以这种方法很实用。

3.其实在此博客的基础上还是可以改进的,重要的是掌握方法即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
Python实现网站文件的全备份和差异备份
Nov 30 Python
python单元测试unittest实例详解
May 11 Python
python使用分治法实现求解最大值的方法
May 12 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python web基础之加载静态文件实例
Mar 20 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
django admin后台添加导出excel功能示例代码
May 15 Python
python根据字典的键来删除元素的方法
Aug 16 Python
python urllib库的使用详解
Apr 13 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 #Python
Python使用requests模块爬取百度翻译
Aug 25 #Python
Python爬虫使用bs4方法实现数据解析
Aug 25 #Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 #Python
Python Selenium实现无可视化界面过程解析
Aug 25 #Python
一文读懂Python 枚举
Aug 25 #Python
详解python变量与数据类型
Aug 25 #Python
You might like
有关 PHP 和 MySQL 时区的一点总结
2008/03/26 PHP
php xml实例 留言本
2009/03/20 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
js href的用法
2010/05/13 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
[01:31]完美与DOTA2历程
2014/07/31 DOTA
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
python中time.ctime()实例用法
2021/02/03 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
软件测试常见笔试题
2012/02/04 面试题
运动会解说词50字
2014/01/18 职场文书
授权委托书
2014/09/17 职场文书
售房协议书范本2014
2014/10/23 职场文书
英语教师个人工作总结
2015/02/09 职场文书
《月光曲》教学反思
2016/02/16 职场文书
初中信息技术教学反思
2016/02/16 职场文书
2016年教师党员承诺书范文
2016/03/24 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
css3带你实现3D转换效果
2022/02/24 HTML / CSS