码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python爬虫


    一、保存数据到Excel

    from bs4 import BeautifulSoup  # 网页解析,获取数据
    import re  # 正则表达式,进行文字匹配
    import urllib.request, urllib.error  # 制定URL,获取网页数据
    import xlwt  # 进行excel操作
    import sqlite3  # 进行SQLite数据库操作
    
    
    def main():
        baseurl = "https://movie.douban.com/top250?start="
        # 1.爬取网页
        datalist = getData(baseurl)
        savepath = "豆瓣电影Top250.xls"
        dbpath = "movie.db"
        # 3.保存数据
        saveData(datalist,savepath)
        #saveData2DB(datalist, dbpath)
    
        # askURL("https://movie.douban.com/top250?start=")
    
    
    # 影片详情链接的规则
    findLink = re.compile(r'')  # 创建正则表达式对象,表示规则(字符串的模式)
    # 影片图片
    findImgSrc = re.compile(r', re.S)  # re.S 让换行符包含在字符中
    # 影片片名
    findTitle = re.compile(r'(.*)')
    # 影片评分
    findRating = re.compile(r'(.*)')
    # 找到评价人数
    findJudge = re.compile(r'(\d*)人评价')
    # 找到概况
    findInq = re.compile(r'(.*)')
    # 找到影片的相关内容
    findBd = re.compile(r'

    (.*?)

    '
    , re.S) # 爬取网页 def getData(baseurl): datalist = [] for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表 # print(item) #测试:查看电影item全部信息 data = [] # 保存一部电影的所有信息 item = str(item) # 影片详情的链接 link = re.findall(findLink, item)[0] # re库用来通过正则表达式查找指定的字符串 data.append(link) # 添加链接 imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) # 添加图片 titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名 if (len(titles) == 2): ctitle = titles[0] # 添加中文名 data.append(ctitle) otitle = titles[1].replace("/", "") # 去掉无关的符号 data.append(otitle) # 添加外国名 else: data.append(titles[0]) data.append(' ') # 外国名字留空 rating = re.findall(findRating, item)[0] data.append(rating) # 添加评分 judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) # 提加评价人数 inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") # 去掉句号 data.append(inq) # 添加概述 else: data.append(" ") # 留空 bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', " ", bd) # 去掉
    bd = re.sub('/', " ", bd) # 替换/ data.append(bd.strip()) # 去掉前后的空格 datalist.append(data) # 把处理好的一部电影信息放入datalist return datalist # 得到指定一个URL的网页内容 def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容) request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") # print(html) except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html # 保存数据 def saveData(datalist, savepath): print("save....") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) # 创建工作表 col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息") for i in range(0, 8): sheet.write(0, i, col[i]) # 列名 for i in range(0, 250): print("第%d条" % (i + 1)) data = datalist[i] for j in range(0, 8): sheet.write(i + 1, j, data[j]) # 数据 book.save(savepath) # 保存 if __name__ == "__main__": # 当程序执行时 # 调用函数 main() # init_db("movietest.db") print("爬取完毕!")
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136

    爬取结果:
    在这里插入图片描述

    二、保存数据到数据库

    2.1数据库操作练习:

    #-*- codeing = utf-8 -*-
    
    
    import sqlite3
    
    #1.连接数据库
    conn = sqlite3.connect("test.db")       #打开或创建数据库文件
    
    print("Opened database successfully")
    
    
    #2.创建数据表
    
    # conn = sqlite3.connect("test.db")       #打开或创建数据库文件
    #
    # print("成功打开数据库")
    #
    # c = conn.cursor()       #获取游标
    #
    # sql = '''
    #     create table company
    #         (id int primary key not null,
    #         name text not null,
    #         age int not null,
    #         address char(50),
    #         salary real);
    #
    # c.execute(sql)          #执行sql语句
    # conn.commit()           #提交数据库操作
    # conn.close()            #关闭数据库连接
    #
    # print("成功建表")
    
    
    #3.插入数据
    
    # conn = sqlite3.connect("test.db")       #打开或创建数据库文件
    #
    # print("成功打开数据库")
    #
    # c = conn.cursor()       #获取游标
    #
    # sql1 = '''
    #    insert into company (id,name,age,address,salary)
    #     values (1,'张三',32,"成都",8000);
    # '''
    #
    # sql2 = '''
    #    insert into company (id,name,age,address,salary)
    #     values (2,'李四',30,"重庆",15000);
    # '''
    #
    # c.execute(sql1)          #执行sql语句
    # c.execute(sql2)          #执行sql语句
    # conn.commit()           #提交数据库操作
    # conn.close()            #关闭数据库连接
    #
    # print("插入数据完毕")
    
    
    
    
    #4.查询数据
    
    conn = sqlite3.connect("test.db")       #打开或创建数据库文件
    
    print("成功打开数据库")
    
    c = conn.cursor()       #获取游标
    
    sql = "select id,name,address,salary from company"
    
    cursor = c.execute(sql)          #执行sql语句
    
    for row in cursor:
        print("id = ",row[0])
        print("name = ",row[1])
        print("address = ",row[2])
        print("salary = ",row[3],"\n")
    
    
    conn.close()            #关闭数据库连接
    
    print("查询完毕")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    2.2 爬取到Sqlite数据库

    # -*- codeing = utf-8 -*-
    
    
    from bs4 import BeautifulSoup  # 网页解析,获取数据
    import re  # 正则表达式,进行文字匹配
    import urllib.request, urllib.error  # 制定URL,获取网页数据
    import xlwt  # 进行excel操作
    import sqlite3  # 进行SQLite数据库操作
    
    
    def main():
        baseurl = "https://movie.douban.com/top250?start="
        # 1.爬取网页
        datalist = getData(baseurl)
        # savepath = "豆瓣电影Top250.xls"
        dbpath = "movie.db"
        # 3.保存数据
        # saveData(datalist,savepath)
        saveData2DB(datalist, dbpath)
    
        # askURL("https://movie.douban.com/top250?start=")
    
    
    # 影片详情链接的规则
    findLink = re.compile(r'')  # 创建正则表达式对象,表示规则(字符串的模式)
    # 影片图片
    findImgSrc = re.compile(r', re.S)  # re.S 让换行符包含在字符中
    # 影片片名
    findTitle = re.compile(r'(.*)')
    # 影片评分
    findRating = re.compile(r'(.*)')
    # 找到评价人数
    findJudge = re.compile(r'(\d*)人评价')
    # 找到概况
    findInq = re.compile(r'(.*)')
    # 找到影片的相关内容
    findBd = re.compile(r'

    (.*?)

    '
    , re.S) # 爬取网页 def getData(baseurl): datalist = [] for i in range(0, 10): # 调用获取页面信息的函数,10次 url = baseurl + str(i * 25) html = askURL(url) # 保存获取到的网页源码 # 2.逐一解析数据 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串,形成列表 # print(item) #测试:查看电影item全部信息 data = [] # 保存一部电影的所有信息 item = str(item) # 影片详情的链接 link = re.findall(findLink, item)[0] # re库用来通过正则表达式查找指定的字符串 data.append(link) # 添加链接 imgSrc = re.findall(findImgSrc, item)[0] data.append(imgSrc) # 添加图片 titles = re.findall(findTitle, item) # 片名可能只有一个中文名,没有外国名 if (len(titles) == 2): ctitle = titles[0] # 添加中文名 data.append(ctitle) otitle = titles[1].replace("/", "") # 去掉无关的符号 data.append(otitle) # 添加外国名 else: data.append(titles[0]) data.append(' ') # 外国名字留空 rating = re.findall(findRating, item)[0] data.append(rating) # 添加评分 judgeNum = re.findall(findJudge, item)[0] data.append(judgeNum) # 提加评价人数 inq = re.findall(findInq, item) if len(inq) != 0: inq = inq[0].replace("。", "") # 去掉句号 data.append(inq) # 添加概述 else: data.append(" ") # 留空 bd = re.findall(findBd, item)[0] bd = re.sub('(\s+)?', " ", bd) # 去掉
    bd = re.sub('/', " ", bd) # 替换/ data.append(bd.strip()) # 去掉前后的空格 datalist.append(data) # 把处理好的一部电影信息放入datalist return datalist # 得到指定一个URL的网页内容 def askURL(url): head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息 "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36" } # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容) request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") # print(html) except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html # 保存数据 def saveData(datalist, savepath): print("save....") book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 创建workbook对象 sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) # 创建工作表 col = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息") for i in range(0, 8): sheet.write(0, i, col[i]) # 列名 for i in range(0, 250): print("第%d条" % (i + 1)) data = datalist[i] for j in range(0, 8): sheet.write(i + 1, j, data[j]) # 数据 book.save(savepath) # 保存 def saveData2DB(datalist, dbpath): init_db(dbpath) conn = sqlite3.connect(dbpath) cur = conn.cursor() for data in datalist: for index in range(len(data)): if index == 4 or index == 5: #下标4的score和5的rated为整数,其他添加双引号变为字符串类型 continue data[index] = '"' + data[index] + '"' sql = ''' insert into movie250 ( info_link,pic_link,cname,ename,score,rated,instroduction,info) values(%s)''' % ",".join(data) print(sql) cur.execute(sql) conn.commit() cur.close() conn.close() def init_db(dbpath): sql = ''' create table movie250 ( id integer primary key autoincrement, info_link text, pic_link text, cname varchar, ename varchar, score numeric , rated numeric , instroduction text, info text ) ''' # 创建数据表 conn = sqlite3.connect(dbpath) cursor = conn.cursor() cursor.execute(sql) conn.commit() conn.close() if __name__ == "__main__": # 当程序执行时 # 调用函数 main() print("爬取完毕!")
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179

    爬取结果:
    在这里插入图片描述

    扩展

    异步请求:
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    攻防世界Running
    【C语言程序设计】--C语言(一)计算机思维导论
    推荐一个适合App、小程序等所有前端应用的图表库
    Worthington丨Worthington 中性蛋白酶说明书
    Map集合的entrySet()方法
    微信小程序报request:fail url not in domain list的解决方法
    C++属性说明符序列
    边缘检测生成(伪)手绘线稿风格的视频简易版教程
    如何使用 docker 部署前端
    electron前端开启局域网接口
  • 原文地址:https://blog.csdn.net/qq_53906512/article/details/132921060
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号