当前位置: 首页 > news >正文

爬虫项目(12):正则、多线程抓取腾讯动漫,Flask展示数据

文章目录

    • 书籍推荐
    • 正则抓取腾讯动漫数据
    • Flask展示数据

书籍推荐

如果你对Python网络爬虫感兴趣,强烈推荐你阅读《Python网络爬虫入门到实战》。这本书详细介绍了Python网络爬虫的基础知识和高级技巧,是每位爬虫开发者的必读之作。详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍

正则抓取腾讯动漫数据

import requests
import re
import threading
from queue import Queuedef format_html(html):li_pattern = re.compile('<li class="ret-search-item clearfix">[\s\S]+?</li>')title_pattern = re.compile('title="(.*?)"')img_src_pattern = re.compile('data-original="(.*?)"')update_pattern = re.compile('<span class="mod-cover-list-text">(.*?)</span>')tags_pattern = re.compile('<span href="/Comic/all/theme/.*?" target="_blank">(.*?)</span>')popularity_pattern = re.compile('<span>人气:<em>(.*?)</em></span>')items = li_pattern.findall(html)for item in items:title = title_pattern.search(item).group(1)img_src = img_src_pattern.search(item).group(1)update_info = update_pattern.search(item).group(1)tags = tags_pattern.findall(item)popularity = popularity_pattern.search(item).group(1)data_queue.put(f'{title},{img_src},{update_info},{"#".join(tags)},{popularity}\n')def run(index):try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}response = requests.get(f"https://ac.qq.com/Comic/index/page/{index}", headers=headers)html = response.textformat_html(html)except Exception as e:print(f"Error occurred while processing page {index}: {e}")finally:semaphore.release()if __name__ == "__main__":data_queue = Queue()semaphore = threading.BoundedSemaphore(5)lst_record_threads = []for index in range(1, 3):print(f"正在抓取{index}")semaphore.acquire()t = threading.Thread(target=run, args=(index,))t.start()lst_record_threads.append(t)for rt in lst_record_threads:rt.join()with open("./qq_comic_data.csv", "a+", encoding="gbk") as f:while not data_queue.empty():f.write(data_queue.get())print("数据爬取完毕")

Flask展示数据

上面能够实现爬取数据,但是我希望展示在前端。

main.py代码如下:

# coding= gbk
from flask import Flask, render_template
import csvapp = Flask(__name__)def read_data_from_csv():with open("qq_comic_data.csv", "r", encoding="utf-8") as f:reader = csv.reader(f)data = list(reader)[1:]  # 跳过标题行# 统一转换人气数据为浮点数(单位:亿)for row in data:popularity = row[4]if '亿' in popularity:row[4] = float(popularity.replace('亿', ''))elif '万' in popularity:row[4] = float(popularity.replace('万', '')) / 10000  # 将万转换为亿# 按人气排序并保留前10条记录data.sort(key=lambda x: x[4], reverse=True)return data[:10]@app.route('/')
def index():comics = read_data_from_csv()return render_template('index.html', comics=comics)if __name__ == '__main__':app.run(debug=True)

templates/index.html如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>漫画信息</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;color: #333;line-height: 1.6;padding: 20px;}.container {width: 80%;margin: auto;overflow: hidden;}h1 {text-align: center;color: #333;}.comic {background: #fff;margin-bottom: 20px;padding: 15px;border-radius: 10px;box-shadow: 0 5px 10px rgba(0,0,0,0.1);}.comic h2 {margin-top: 0;}.comic p {line-height: 1.25;}.comic:nth-child(even) {background: #f9f9f9;}</style>
</head>
<body><div class="container"><h1>人气前10的漫画</h1>{% for comic in comics %}<div class="comic"><h2>{{ comic[0] }}</h2><p><strong>更新信息:</strong>{{ comic[2] }}</p><p><strong>类型:</strong>{{ comic[3] }}</p><p><strong>人气:</strong>{{ comic[4] }}</p></div>{% endfor %}</div>
</body>
</html>

效果如下:
在这里插入图片描述

相关文章:

  • 为什么数据安全很重要?哪些措施保护数据安全?
  • FEC的RED
  • Unity 跑酷游戏全部脚本(完结)
  • SpringBoot项目集成发邮件功能
  • 【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用
  • WorldView 1 2 3 4卫星影像
  • RHCE8 资料整理(五-2)
  • 使用Jmeter进行http接口性能测试
  • 不使用宝塔面板 安装 EasyImage 简单图床
  • ISP图像处理Pipeline
  • 爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)
  • maven配置自定义下载路径,以及阿里云下载镜像
  • 【Python+requests+unittest+excel】实现接口自动化测试框架
  • 【STM32】FreeModbus 移植Modbus-RTU从机协议到STM32详细过程
  • SQL之回炉重造
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • C++类中的特殊成员函数
  • emacs初体验
  • Flex布局到底解决了什么问题
  • flutter的key在widget list的作用以及必要性
  • iOS编译提示和导航提示
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java超时控制的实现
  • laravel 用artisan创建自己的模板
  • Mac转Windows的拯救指南
  • magento2项目上线注意事项
  • PHP那些事儿
  • spring boot 整合mybatis 无法输出sql的问题
  • Spring框架之我见(三)——IOC、AOP
  • TypeScript实现数据结构(一)栈,队列,链表
  • ubuntu 下nginx安装 并支持https协议
  • V4L2视频输入框架概述
  • Vue小说阅读器(仿追书神器)
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 区块链共识机制优缺点对比都是什么
  • 使用 Docker 部署 Spring Boot项目
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个完整Java Web项目背后的密码
  • puppet连载22:define用法
  • 阿里云服务器如何修改远程端口?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​queue --- 一个同步的队列类​
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​业务双活的数据切换思路设计(下)
  • # 计算机视觉入门
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #{} 和 ${}区别
  • #include<初见C语言之指针(5)>
  • (2)MFC+openGL单文档框架glFrame
  • (9)目标检测_SSD的原理
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx