Pymysql将爬取到的信息存储到数据库中

news2024/11/25 12:57:58

爬取平台为电影天堂

获取到的数据仅为测试学习而用

爬取内容为电影名和电影的下载地址

创建表时需要建立三个字段即可

import urllib.request
import re
import pymysql


def film_exists(film_name, film_link):
    """判断插入的数据是否已经存在"""
    sql = "select id from movie_link where film_name=%s and film_link=%s limit 1"
    result_num = my_cur.execute(sql, [film_name, film_link])
    # 使用sql语句查询获取到的电影名和下载地址,如果查询到有一条数据就表示数据已经存在,返回True
    if result_num:
        return True
    else:
        return False


def create_date_table():
    """创建数据库和数据表"""
    # 查看数据库是否存在,存在不创建,继续创建数据表。不存在创建,并创建表。
    exits = my_cur.execute("SHOW DATABASES LIKE 'movie_db';")
    if not exits:
        my_cur.execute("create database movie_db charset=utf8;")
        print("数据库建立成功")
        my_cur.execute("use movie_db;")
        my_cur.execute("""create table if not exists movie_link(id int(11) primary key auto_increment,
        film_name varchar(255) not null,
        film_link varchar(255) not null
        )charset=utf8;""")
        print("数据表建立成功")
    else:
        print("数据库已经存在,继续创建数据表")
        my_cur.execute("use movie_db;")
        my_cur.execute("""create table if not exists movie_link(id int(11) primary key auto_increment,
                film_name varchar(255) not null,
                film_link varchar(255) not null
                )charset=utf8;""")
        print("数据表建立成功")


def add_films(film_name, film_link):
    """向数据表中插入数据"""
    sql = "insert into movie_link values (null,%s,%s);"
    result_insert = my_cur.execute(sql, [film_name, film_link])
    # 如果插入成功返回值应该为影响的行数,不为零就代表插入成功
    if result_insert:
        print("插入成功:", film_name)


def down_view():
    # 打开网页
    respon_data = urllib.request.urlopen("https://dy2018.com/0/")
    # 解码
    respon_decode = respon_data.read().decode("gbk")
    # 正则表达式获取下载页面网址
    films_data = re.findall(r"<a href=\"(.*)\" class=\"ulink\" title=\"(.*)\">", respon_decode)
    # 创建字典存储当前页的电影名和下载页面网址
    films_dict = {}
    count = 1
    # 将电影名和下载页网址从列表中拆包
    for films_url, films_name in films_data:
        # 拼接下载页面网站
        films_url = "https://www.dy2018.com/" + films_url
        # 打开下载页面
        respon_films_data = urllib.request.urlopen(films_url)
        # 解码
        respon_deown = respon_films_data.read().decode("gbk")
        # 使用正则提取下载地址
        down_url = re.search(r">(magnet:.*\.mp4)</a>", respon_deown)
        # 将电影名和下载地址存入字典
        films_dict[films_name] = down_url.group(1)
        print("已爬取第%s个资源" % count)
        count += 1
    return films_dict


def main():
    # 爬取信息并用字典介接收
    down_dict = down_view()
    # 创建数据库和数据表
    create_date_table()
    my_cur.execute("use movie_db;")
    # 将字典中的数据遍历取出,进行判断、添加
    for film_name, film_link in down_dict.items():
        if film_exists(film_name, film_link):
            print("电影[%s]保存失败" % film_name)
            continue
        add_films(film_name, film_link)


if __name__ == '__main__':
    # 建立连接
    my_sql = pymysql.connect(host="localhost", user="root", password="123456")
    # 创建游标对象
    my_cur = my_sql.cursor()
    main()
    # 一定要提交,否则数据不会被保存
    my_sql.commit()
    my_cur.close()
    my_sql.close()

将数据库中的数据当作固定页面返回

import socket
import pymysql


def request_headler(new_client_socket, ip_port):
    request_data = new_client_socket.recv(1024).decode()
    # 接收客户端浏览器发送的请求
    # 判断协议是否为空
    if not request_data:
        print("%s用户已下线" % str(ip_port))
        new_client_socket.close()
        return
    # 拼接响应的报文
    # 响应行
    respon_line = "HTTP/1.1 200 OK\r\n"
    # 响应头
    respon_header = "Server:Python\r\n"
    respon_header += "Content-Type:text/html; charset=utf-8\r\n"
    # 响应空行
    respon_blank = "\r\n"
    # 响应主体
    respon_body=""
    result = my_cur.execute("select * from movie_link;")
    result_data = my_cur.fetchall()
    for data in result_data:
        respon_body += ("%s、%s   <a href=%s>%s</a><br>" % (data[0], data[1], data[2],data[2]))
    # 发送响应报文

    respon_data = (respon_line + respon_header + respon_blank + respon_body).encode()
    new_client_socket.send(respon_data)


def main():
    # 创建套接字
    tcp_sderver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口重用、
    tcp_sderver_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口
    tcp_sderver_socket.bind(("", 8080))
    # 设置监听,让套接字由主动变为被动接收
    tcp_sderver_socket.listen(128)
    # 接受客户端的请求  定义函数request_handler()
    while True:
        new_client_socket, ip_port = tcp_sderver_socket.accept()
        print("新用户%s来了" % str(ip_port))
        request_headler(new_client_socket, ip_port)
    # 关闭操作


if __name__ == "__main__":
    my_db = pymysql.connect(host="localhost", user="root", password="123456", database="movie_db")
    my_cur = my_db.cursor()
    main()
    my_cur.close()
    my_db.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop3.x基础(3)- MapReduce

来源: B站尚硅谷 目录 MapReduce概述MapReduce定义MapReduce优缺点优点缺点 MapReduce核心思想MapReduce进程常用数据序列化类型MapReduce编程规范WordCount案例实操本地测试提交到集群测试 Hadoop序列化序列化概述自定义bean对象实现序列化接口&#xff08;Writable&#xff…

C++ 之LeetCode刷题记录(二十五)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[…

数学建模比赛中,chatgpt、文心一言如何提问更有效?

在数学建模的战场上&#xff0c;ChatGPT和文心一言可是我们的“神助攻”&#xff01;但想让它们发挥出最大威力&#xff0c;提问可是个技术活。问题问得好&#xff0c;答案跑不了&#xff1b;问题问得妙&#xff0c;解决没烦恼&#xff01; 下面我就一个实际的对话为例&#x…

2024美赛数学建模E题思路分析 - 财产保险的可持续性

1 赛题 问题E&#xff1a;财产保险的可持续性 极端天气事件正成为财产所有者和保险公司面临的危机。“近年来&#xff0c;世界已经遭受了1000多起极端天气事件造成的超过1万亿美元的损失”。[1]2022年&#xff0c;保险业的自然灾害索赔人数“比30年的平均水平增加了115%”。[…

AI 原生时代的云计算

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛&#xff0c;百度副总裁谢广军的主题演讲《AI 原生时代的云计算》。 &#xff08;视频回放链接&#xff1a;https://cloud.baidu.com/summit/aicomputing_2023/index.html&#xff09; 大模型的到来&…

elk之基本crud

写在前面 本文看下工作中用的最多的CRUD。让我们一起来做一个帅帅的CRUD BOY吧&#xff01;&#xff01;&#xff01; 1&#xff1a;基本操作 Create 格式1(指定ID)&#xff1a;PUT 索引名称/_create/文档ID {文档json} 格式2&#xff08;不指定ID&#xff09;:POST 索引名称…

gitlab操作手册

git操作篇 1. 项目克隆 git clone gitgitlab.test.cn:pro/project1.git2. 项目的提交 注&#xff1a;如果要查看文件的状态可以用git status命令&#xff1a; 如上图所示&#xff0c;文件已经修改了。 3. 项目的推送 git push origin feature/test01注&#xff1a;如果要查…

语义分割:从早期探索到深度学习的突破

语义分割&#xff1a;从早期探索到深度学习的突破 语义分割的端倪&#xff1a;从早期探索到深度学习的突破引言早期技术&#xff1a;图像处理与模式识别边缘检测区域生长图割(Graph Cut)聚类方法 深度学习的兴起&#xff1a;CNN革命2012年 AlexNet的突破全卷积网络&#xff08;…

深入解剖指针篇(2)

目录 指针的使用 strlen的模拟实现 传值调用和传址调用 数组名的理解 使用指针访问数组 一维数组传参的本质 冒泡排序 个人主页&#xff08;找往期文章&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 指针的使用 strlen的模拟实现 库函数strlen的功能是求字符串…

校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

JAVA操作Rabbitmq-原理讲的很详细

这篇文章来源于稀土掘金&#xff0c;来源&#xff1a;https://juejin.cn/post/7132268340541653005&#xff0c;主要用来收藏学习。 常见的消息队列很多&#xff0c;主要包括 RabbitMQ、Kafka、RocketMQ 和 ActiveMQ&#xff0c;相关的选型可以看我之前的系列&#xff0c;这篇文…

菜鸡后端的前端学习记录-2

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 忘了记一下…

【蓝桥杯51单片机入门记录】LED

目录 一、基础 &#xff08;1&#xff09;新建工程 &#xff08;2&#xff09;编写前准备 二、LED &#xff08;1&#xff09;点亮LED灯 &#xff08;2&#xff09;LED闪烁 延时函数的生成&#xff08;stc-isp中生成&#xff09; 实现 &#xff08;3&#xff09;流水灯…

无法在 word 中登录 Grammarly

目录 1. 情况描述 2. 解决方法 3. 原因分析 1. 情况描述 在浏览器中可以登录 Grammarly&#xff0c;但是在 word 中登录失败&#xff0c;大致如下图所示&#xff1a; 我自己没有截图&#xff0c;这是网上别人的图&#xff0c;但差不多都长这个样子。 2. 解决方法 我点击了…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

正点原子--STM32中断系统学习笔记(2)

引言 上篇帖子STM32中断系统学习笔记(1)是理论&#xff0c;这篇帖子开始实战&#xff0c;目标是通过按键实现LED的控制。 1.工程建立 以正点原子HAL库 实验1 跑马灯实验为基础&#xff0c;复制工程&#xff0c;在“Drivers--BSP”目录下建立EXTI文件夹&#xff0c;并创建ext…

mfc140.dll丢失的几种修复方式,有效的解决文件丢失问题

mfc140.dll是Microsoft Foundation Class (MFC)库中的一个非常重要的DLL文件。它承载了许多被执行程序使用的函数和资源。这个库主要被广泛应用于开发Windows操作系统上的应用程序。然而&#xff0c;有时候我们可能会遭遇到mfc140.dll缺失或损坏的情况&#xff0c;这会导致依赖…

力扣hot100 二叉树的右视图 DFS BFS 层序遍历 递归

Problem: 199. 二叉树的右视图 文章目录 思路&#x1f496; BFS&#x1f496; DFS 思路 &#x1f469;‍&#x1f3eb; 甜姨 &#x1f496; BFS ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public List<Integer&…

探究HMAC算法:消息认证与数据完整性的完美结合

Hash-based Message Authentication Code&#xff08;基于哈希的消息认证码&#xff0c;简称HMAC&#xff09;算法作为一种广泛应用的消息认证码&#xff08;MAC&#xff09;算法&#xff0c;在现代信息安全领域起着至关重要的作用。本文将从算法原理、优缺点、实际应用等方面&…

linux中vim的操作

(码字不易&#xff0c;关注一下吧w~~w) 命令模式&#xff1a; 当我们按下esc键时&#xff0c;我们会进入命令模式&#xff1b;当使用vi打开一个文件时也是进入命令模式。 光标移动&#xff1a; 1 保存退出&#xff1a;ZZ 2 代码格式化&#xff1a;ggG 3 光标移动&#xff…