代码-功能-python-爬取博客网标题作者发布时间

环境:

python 3.8

代码:

# 爬取博客园内容
# https://www.cnblogs.com/import re
from lxml import etree
import requests
import json
import threading
from queue import Queue
import pymysql  
import timeclass HeiMa:def __init__(self):# 请求头self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) ''AppleWebKit/537.36 (KHTML, like Gecko)''Chrome/90.0.4430.212 Safari/537.36'}self.url_queue = Queue()  # 网址队列self.html_queue = Queue()  # 网页源代码队列self.content_queue = Queue()  # 网页数据队列# 创建连接对象self.conn= pymysql.connect(host='127.0.0.1',  # 本机就写:localhostport=3306,  # 要连接到的数据库端口号,MySQL是3306user='root',  # 数据库的用户名password='root',  # 数据库的密码database='boke',  # 要操作的数据库charset='utf8'  # 码表)# 创建游标 - -可执行SQL语句的对象self.cursor = self.conn.cursor()#开始事务self.conn.begin()def get_url_queue(self):url_temp = "https://www.cnblogs.com/sitehome/p/{}"# 构造请求URLurl_list = [url_temp.format(i) for i in range(1, 100)]for url in url_list:# print(url)self.url_queue.put(url)  # 将构造的请求URL添加到网址队列中def get_html_queue(self):while True:# 从网址队列中取出请求URLurl = self.url_queue.get()html_source_page = requests.get(url, headers=self.headers).textself.html_queue.put(html_source_page)# 向网址队列发送完成信号self.url_queue.task_done()def parse_html(self):while True:content_list = []html = self.html_queue.get()html_str = etree.HTML(html)node_list = html_str .xpath('//div[@id="post_list"]')title_num = 0for node in node_list:# 文章标题title = node.xpath('./article/section/div/a/text()')[0]# 文章链接url = node.xpath('./article/section/div/a/@href')[0]# 文章作者author = node.xpath('./article/section/footer/a[@class="post-item-author"]/span/text()')[0]# 发布时间(具体日期)release_time = node.xpath('./article/section/footer/span[@class="post-meta-item"]/span/text()')[0]item = {"文章标题": title,"文章链接": url,"文章作者": author,'发布时间': release_time,}content_list.append(item)title_num += 1self.content_queue.put(content_list)self.html_queue.task_done()def save_data(self):while True:content_list = self.content_queue.get()with open("thread-heima.json", "a+", encoding='utf-8')as f:f.write(json.dumps(content_list, ensure_ascii=False, indent=2))self.content_queue.task_done()def save_data_mysql(self):while True:content_list = self.content_queue.get()for item in content_list:pattern = "[\',\"]"title = re.sub(pattern, '-', item['文章标题'])# title = item['文章标题']url = item['文章链接']author = re.sub(pattern, '-', item['文章作者'])# author = item['文章作者']release_time = item['发布时间']# 添加到数据库sql=f'insert into news VALUES (NULL,"{title}","{url}","{author}","{release_time}")'print(sql)self.cursor.execute(sql)self.content_queue.task_done()def run(self):thread_list = []# 构造URL地址线程t_url = threading.Thread(target=self.get_url_queue)thread_list.append(t_url)# 获取网页源代码for page in range(9):t_content = threading.Thread(target=self.get_html_queue)thread_list.append(t_content)# 解析网页数据队列for j in range(9):t_content = threading.Thread(target=self.parse_html)thread_list.append(t_content)# t_save = threading.Thread(target=self.save_data)t_save = threading.Thread(target=self.save_data_mysql)thread_list.append(t_save)for t in thread_list:t.setDaemon(True)t.start()for q in [self.url_queue, self.html_queue, self.content_queue]:# join():在子线程完成运行之前,这个子线程的父类进程一直被阻塞.# 让join()的子线程先执行,暂时不执行主线程的代码,主线程一直被阻塞,直到join()的子线程完成之后才开始执行主线程# print(q)q.join()if __name__ == '__main__':heima = HeiMa()heima.run()try:# 提交事务,把插入的数据写入到数据库heima.conn.commit()except:# 发生异常就回滚事务,保证所有数据都不插入,保证数据的一致性heima.conn.rollback()# 释放数据库资源heima.cursor.close()heima.conn.close()print("抓取完毕!")

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

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

相关文章

k8s 部署 ruoyi 前后端分离项目

本文视频版 https://www.bilibili.com/video/BV17ugkePEeN 参考 https://blog.csdn.net/qq_50247813/article/details/136934090 https://gitee.com/nasaa/RuoYi-Vue-cloud https://www.itsgeekhead.com/tuts/kubernetes-129-ubuntu-22-04-3/ https://kubernetes.io/docs/se…

【漏洞复现】畅捷通T+ keyEdit.aspx SQL漏洞

0x01 产品简介 畅捷通 T 是一款灵动,智慧,时尚的基于互联网时代开发的管理软件,主要针对中小型工贸与商贸企业,尤其适合有异地多组织机构(多工厂,多仓库,多办事处,多经销商)的企业,…

用户态协议栈06-TCP三次握手

最近由于准备软件工程师职称考试,然后考完之后不小心生病了,都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。 什么是TCP 百度百科:TCP即传输控制协议(Transmission Control Protocol)是…

LabVIEW程序退出后线程仍在运行问题

LabVIEW程序退出后,线程仍在运行的问题可能源于资源管理不当、未正确终止循环、事件结构未处理、并发编程错误以及外部库调用未结束等方面。本文将从这些角度详细分析,探讨可能的原因和解决方案,并提供预防措施,帮助开发者避免类似…

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地,利用代码为GitHub:https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接&…

已解决javax.management.BadStringOperationException异常的正确解决方法,亲测有效!!!

已解决javax.management.BadStringOperationException异常的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 分析错误日志 检查字符串值合法性 确认字符串格式 优化代码逻辑 增加…

Trimesh介绍及基本使用

Trimesh介绍及基本使用 Trimesh是一个纯Python 工具库(支持3.7版本以上),用于加载和使用三角形Mesh网格,支持多种常见的三维数据格式,如二进制/文本格式的STL、Wavefront OBJ、二进制/文本格式的PLY、GLTF/GLB 2.0、3…

Leetcode 2713. 矩阵中严格递增的单元格数(DFS DP)

Leetcode 2713. 矩阵中严格递增的单元格数 DFS 容易想到,枚举每个点作为起点,向同行同列的可跳跃点dfs,维护全局变量记录可达的最远距离 超时,通过样例193 / 566 class Solution {int res 0;public void dfs(int[][] mat, in…

EtherCAT笔记(三) —— 主站与从站的硬件组成

1. EtherCAT 主站的硬件组成 EtherCAT主站使用标准以太网控制器,也即EtherCAT主站可以使用以太网控制器的任何设备。当我们有一台带网口的笔记本、工控机,甚至是树莓派也可以作为EtherCAT主站。 EtherCAT协议是对Ethernet协议在实时控制等方面的优化&am…

android关于源码编译简单的apk处理

文章目录 简述文件的添加 简述 创建AOSP源码可编译一个简单apk的过程,代码子目录结构图如下所示 文件的添加 1.com.custom.test目录下创建TestActivity.java文件 用于简单的界面显示类 package com.custom.test;import android.app.Activity; import android.o…

高考填报志愿不容易,压线考生怎么救?

每年的高考季 就是高考生们水深火热的一大月份,很多考生都会纠结要报考哪些学校,哪些专业好,并非每个学生从小就有明确的目标,很多人到6月份才深思这个问题,此时难免手慌脚乱,更别说一些考生的分数处于一本…

创建第一个Springboot项目(环境准备、环境存在的问题、启动时存在的问题、启动的方式)

一、环境准备 专业版创建springboot,直接有一个选项可以选择 社区版,需要下载一个spring的插件 不要直接点 install 因为这个插件是付费的,直接点安装只有30天使用期限 在里面找免费版本的下载 然后安装 安装完成后,这个插件名会变…

利用ChatGPT辅助撰写课题申报书中的研究框架与内容设计全攻略指南

欢迎关注EssayBot,为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥沟通:yida985 撰写课题申报书是启动科研项目的第一个步骤,而研究框架与内容设计又是这一过程中的关键要素&#xff0…

基于YOLOv5的PCB板缺陷检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

简介 随着电子设备的广泛应用,PCB(印刷电路板)作为其核心部件,其质量和可靠性至关重要。然而,PCB生产过程中常常会出现各种缺陷,如鼠咬伤、开路、短路、杂散、伪铜等。这些缺陷可能导致设备故障,甚至引发严重的安全问题。为了提高PCB检测的效率和准确性,我们基于YOLOv…

Go 三色标记法:一种高效的垃圾回收策略

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

C++基础知识——引用

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan.                        …

让你的Python代码更简洁:一篇文章带你了解Python列表推导式

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 列表推导式 📒📝 语法📝 条件筛选📝 多重循环📝 列表推导式的优点📝 使用场景📝 示例代码🎯 示例1🎯 示例2⚓️ 相关链接 ⚓️📖 介绍 📖 在Python编程中,列表推导式是一种强大且高效的语法,它允许你用…

Java程序之素数问题

题目: 判断101-200之间有多少个素数,并输出所有素数。 程序分析: 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。素数被利用在密码学上&#…

算法设计与分析 笔记

截图摘自湖南大学彭鹏老师的ppt。笔记也是根据他的ppt整理的。 动态规划 核心 用数组记录中间结果,避免重复计算 三角数塔问题 问题描述 给定一个三角形数塔,从顶部出发,每次只能移动到下一行的相邻元素。要求找到一条路径,…

VS Code安装及环境配置(超详细)

VS Code简介 Visual Studio Code(简称 VS Code )是 Microsoft 于2015年4月发布的一款代码编辑器,以界面简洁、轻量著称。 它是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流开发语言的语法高亮、智能代码补全、自定义…