Python项目实战之-爬取全网小说资源

python爬虫实战-小说爬取

在这里插入图片描述

基于requests模块与lxml模块编写的爬虫

基本思路
  • 主要内容分为三个部分
    1. 使用requests模块获取网页内容
    2. 使用lxml模块进行网页解析
    3. 将解析出来的数据存储进MySQL数据库中
  1. 获取网页内容

    • 网站分析

      获取各个分类的href标签

      红袖小说爬虫

    • 代码如下

          def novel_sort_link(self):novel_website = requests.get(self.url).text# print(novel_website)novel_classification_link = etree.HTML(novel_website)novel_classification = novel_classification_link.xpath('/html/body/div[1]/div[2]/div[2]/div/div/div[1]/div/ul/li/a')classification_href_list = list()for classification in set(novel_classification):href = self.url + classification.xpath('./@href')[0].replace('/category/', '')classification_href_list.append(href)return classification_href_list
  2. 解析数据

    • 获取书名、作者、状态、热度、简介等数据

      红袖小说爬虫2

    • 代码如下:

          def analysis(self, classification_url_link):for classification_url in classification_url_link:# print(classification_url)for num in range(1, 51):url = classification_url.replace(classification_url[-1], str(num))novel_response_text = requests.get(url).text# print(novel_response_text)novel_response_html = etree.HTML(novel_response_text)novel_response = novel_response_html.xpath('/html/body/div[1]/div[2]/div[3]/div[2]/div[1]/ul/li')for novel in novel_response:novel_dict = dict()novel_dict['novel_name'] = novel.xpath('./div[2]/h3/a/@title')[0]novel_dict['author'] = novel.xpath('./div[2]/h4/a/text()')[0]novel_dict['classify'] = novel.xpath('./div[2]/p[1]/span[1]/text()')[0]novel_dict['state'] = novel.xpath('./div[2]/p[1]/span[2]/text()')[0]novel_dict['number'] = novel.xpath('./div[2]/p[1]/span[3]/text()')[0]novel_dict['synopsis'] = novel.xpath('./div[2]/p[2]/text()')[0].replace('\r\n', '').replace(' ', '')# print(novel_dict)
  3. 将数据存储进数据库中

    • 调用将数据存储进mysql数据库的类

      MySQL().main(table_name='hongxiu_novel', data=novel_dict)
    • 连接数据库

       def connect_to_database(self):"""连接到MySQL数据库"""self.connection = pymysql.connect(host='localhost',user='root',password='password',database='reptile_text',port=3306)def disconnect_from_database(self):"""断开与MySQL数据库的连接"""if self.connection:self.connection.close()
    • 判断数据表是否存在

          def table_exists(self, table_name):"""检查数据表是否存在"""self.connect_to_database()cursor = self.connection.cursor()cursor.execute("SHOW TABLES LIKE '{}'".format(table_name))result = cursor.fetchone()cursor.close()self.disconnect_from_database()if result:return Trueelse:return False
    • 数据表不存在则根据提供的数据字典键来进行创建新数据表

          def create_table(self, table_name, data):"""创建包含文本列的数据表"""self.connect_to_database()cursor = self.connection.cursor()columns = []for key, value in data.items():column_type = 'TEXT'columns.append(f'{key} {column_type}')create_table_sql = f"CREATE TABLE IF NOT EXISTS {table_name} ({', '.join(set(columns))})"cursor.execute(create_table_sql)print('数据表创建成功')cursor.close()self.disconnect_from_database()
    • 将数据插入进数据库中

          def insert_data(self, table_name, data):"""在表中插入数据"""self.connect_to_database()cursor = self.connection.cursor()keys = ', '.join(data.keys())values = ', '.join([f"'{value}'" for value in data.values()])one_key = list(data.keys())[0]select_sql = f"SELECT * FROM {table_name} WHERE {one_key} ='{data[one_key]}'"cursor.execute(select_sql)result = cursor.fetchone()if result:print(f"数据已存在: {data}")else:insert_sql = f"INSERT INTO {table_name} ({keys}) VALUES ({values})"cursor.execute(insert_sql)print(f"插入数据: {data}")
完整代码
  1. hongxiu_novel.py完整代码

    # coding:utf-8
    import requests
    from lxml import etree
    from reptile_text.mysql_data import MySQLclass HongXiu(object):def __init__(self):self.url = 'https://www.hongxiu.com/category/'def novel_sort_link(self):novel_website = requests.get(self.url).text# print(novel_website)novel_classification_link = etree.HTML(novel_website)novel_classification = novel_classification_link.xpath('/html/body/div[1]/div[2]/div[2]/div/div/div[1]/div/ul/li/a')classification_href_list = list()for classification in set(novel_classification):href = self.url + classification.xpath('./@href')[0].replace('/category/', '')classification_href_list.append(href)return classification_href_listdef analysis(self, classification_url_link):for classification_url in classification_url_link:# print(classification_url)for num in range(1, 51):url = classification_url.replace(classification_url[-1], str(num))novel_response_text = requests.get(url).text# print(novel_response_text)novel_response_html = etree.HTML(novel_response_text)novel_response = novel_response_html.xpath('/html/body/div[1]/div[2]/div[3]/div[2]/div[1]/ul/li')for novel in novel_response:novel_dict = dict()novel_dict['novel_name'] = novel.xpath('./div[2]/h3/a/@title')[0]novel_dict['author'] = novel.xpath('./div[2]/h4/a/text()')[0]novel_dict['classify'] = novel.xpath('./div[2]/p[1]/span[1]/text()')[0]novel_dict['state'] = novel.xpath('./div[2]/p[1]/span[2]/text()')[0]novel_dict['number'] = novel.xpath('./div[2]/p[1]/span[3]/text()')[0]novel_dict['synopsis'] = novel.xpath('./div[2]/p[2]/text()')[0].replace('\r\n', '').replace(' ', '')# print(novel_dict)MySQL().main(table_name='hongxiu_novel', data=novel_dict)def main(self):classification_url_link = self.novel_sort_link()self.analysis(classification_url_link)if __name__ == '__main__':HongXiu().main()
  2. mysql_data.py完整代码

    # -*- coding:utf-8 -*-
    import pymysqlclass MySQL(object):def __init__(self):self.connection = Nonedef connect_to_database(self):"""连接到MySQL数据库"""self.connection = pymysql.connect(host='localhost',user='root',password='password',database='reptile_text',port=3306)def disconnect_from_database(self):"""断开与MySQL数据库的连接"""if self.connection:self.connection.close()def create_table(self, table_name, data):"""创建包含文本列的数据表"""self.connect_to_database()cursor = self.connection.cursor()columns = []for key, value in data.items():column_type = 'TEXT'columns.append(f'{key} {column_type}')create_table_sql = f"CREATE TABLE IF NOT EXISTS {table_name} ({', '.join(set(columns))})"cursor.execute(create_table_sql)print('数据表创建成功')cursor.close()self.disconnect_from_database()def table_exists(self, table_name):"""检查数据表是否存在"""self.connect_to_database()cursor = self.connection.cursor()cursor.execute("SHOW TABLES LIKE '{}'".format(table_name))result = cursor.fetchone()cursor.close()self.disconnect_from_database()if result:return Trueelse:return Falsedef insert_data(self, table_name, data):"""在表中插入数据"""self.connect_to_database()cursor = self.connection.cursor()keys = ', '.join(data.keys())values = ', '.join([f"'{value}'" for value in data.values()])one_key = list(data.keys())[0]select_sql = f"SELECT * FROM {table_name} WHERE {one_key} ='{data[one_key]}'"cursor.execute(select_sql)result = cursor.fetchone()if result:print(f"数据已存在: {data}")else:insert_sql = f"INSERT INTO {table_name} ({keys}) VALUES ({values})"cursor.execute(insert_sql)print(f"插入数据: {data}")self.connection.commit()cursor.close()self.disconnect_from_database()def main(self, table_name, data):if self.table_exists(table_name):print('数据表已存在')self.insert_data(table_name, data)else:print('数据表不存在')self.create_table(table_name, data)self.insert_data(table_name, data)

在这里插入图片描述

本文转自 https://www.cnblogs.com/moyiwang/p/17828959.html,如有侵权,请联系删除。

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

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

相关文章

JMeter接口测试之文件上传(参数提取与传递)

参考文档: Jmeter接口测试-文件上传(全网最详细的教程)_jmeter 文件上传-CSDN博客 1、首先通过fiddler抓取文件上传接口,在Raw的tab页中查看默认请求头以及请求参数 如图所示 2、在jmeter中导入抓取的接口,首先需要配…

ctfshow~菜狗杯 损毁的压缩包

题目给了一个.zip的压缩包,解压报错 用010Editor打开看一下,发现文件头是png的 把文件后缀改成png看一下,得到flag ctfshow{e19efe2eb86f10ccd7ca362110903c05}

【生命游戏】python刷题记录

目录 题目: 代码: 结果: 总结: 题目: 代码: class Solution:def gameOfLife(self, board: List[List[int]]) -> None:"""Do not return anything, modify board in-place instead.&…

rocky9.3操作系统安装记录

文章目录 一、镜像源二、安装的过程选择安装过程中语言安装信息摘要页面设置安装目的地设置管理员密码调整网络开始部署 一、镜像源 Rocky-9.3-x86_64-minimal.iso 二、安装的过程 选择安装过程中语言 安装信息摘要页面 设置安装目的地 不做操作,直接使用自动分…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…

LoadRunner12通过代理录制脚本。

1、目前LR12录制脚本比较简单的方式有两种,还有一种是失败率太高 我这边基本没有成功过就不赘述了,这边写的是通过LR的代理服务器来进行录制。 2、首选配置LR的录制界面点击录制按钮,会显示出录制配置界面 3、在录制配置界面录制模式选择’通…

【C++刷题】[UVA 489]Hangman Judge 刽子手游戏

题目描述 题目解析 这一题看似简单其实有很多坑,我也被卡了好久才ac。首先题目的意思是,输入回合数,一个答案单词,和一个猜测单词,如果猜测的单词里存在答案单词里的所有字母则判定为赢,如果有一个字母是答…

性能测试工具原理与架构

在性能测试的学习过程中,坚持思想与工具(分开)并行,当前面世面上的性能测试书籍大多把理论与loadrunner融为一体讲解,这样做是正确的,因为有一些性能名词概念也源于工具。但是,性能测试不是load…

生物安全柜验证:气流流型、粒子、浮游菌等参考标准

生物安全柜也是制药行业常见设备,根据GMP的要求,需对生物安全柜定期进行验证确认,确保生物安全柜的性能满足GMP洁净厂房的相关要求。 生物安全柜是实验室的基本设备,也是生物安全实验室的一级安全隔离屏障。其最重要的作用就是气流…

简过网:公务员面试考什么?抓紧时间收藏!

你知道吗?在公务员考试中,其实笔试不是最难的,难的是面试,那么,公务员的面试都考什么呢?这篇文章告诉你答案! ​ 对于公务员的面试一般可分为三种形式: 一、无领导: 什…

Unity | Shader基础知识(第十八集:Stencil应用-透视立方盒子)

目录 一、前言 二、场景布置 三、 shader部分 1.图片的部分 2.图片部分纯净代码 3.遮罩部分复习 4.深度写入 ZWrite 5.颜色遮罩ColorMask 6.遮罩纯净代码 四、场景中shader使用 五、作者的碎碎念 一、前言 因为这个内容稍微有点多,我尽力讲清楚了&#x…

Windows安装Nacos【超详细图解】

目录 一、下载 Nacos 二、解压 Nacos 三、编辑配置文件 四、创建数据库 五、启动 Nacos 六、进入控制台 一、下载 Nacos Nacos v2.3.2 官方网址 二、解压 Nacos 三、编辑配置文件 主要修改数据库用户名、密码、鉴权是否开启、key value和token # # Copyright 1999-2021 …

Fiddler抓包过滤host及js、css等地址

1、如上图所示 在Filter页面中勾选Hide if URL contains;输入框输入 REGEX:\.(js|css|png|google|favicon\?.*) 隐藏掉包含js、css、png、google等的地址: Hide if URL contains: REGEX:\.(js|css|png|google|favicon\?.*) 2、使Filters设置生效 A…

用Python实现学生信息管理系统

用Python来实现学生信息管理系统 学生信息管理系统(Python) 简介:基本信息管理和学生成绩管理。基本信息管理模块的主要功能有学生信息的添加、删除、修改、显示和学生数据的导入导出,学生成绩管理模块的主要功能有统计课程最高分…

面向 AI 而生的香橙派 AIpro 开发板开箱实测

前几天搞到一块很牛掰的开发板,是香橙派联合华为精心打造的高性能 AI 开发板 – OrangePi AIpro 开发板。 其搭载了昇腾 AI 处理器,可提供 8TOPS INT8 的计算能力,作为单板硬件设备来说,算力杠杠的了,至于跑 AI 模型性…

liunx面试题目

如何看当前Linux系统有几颗物理CPU和每颗CPU的核数? 查看物理cup: cat /proc/cpuinfo|grep -c ‘physical id’ 查看每颗cup核数 cat /proc/cpuinfo|grep -c ‘processor’ 若希望自动实现软件包的更新,可以使用yum-cron并启动该服务 yum -y …

C++ :友元函数

什么是友元函数 外部函数访问类内成员 (1)写一个Person类,内部有private、protected、public的三类访问权限的成员 (2)写一个外部函数disp_info来打印这三类成员 (3)代码实战 (4)总结:可以访问public的,但是protected和private的无法访问 (5…

8.FreeRTOS_队列集

队列集使用在系统需要支持多个输入设备的情况,这是每个输入设备的数据都存放在一个队列中,队列集将他们管理起来,可以实现实时识别哪一个队列中有数据并将数据读取出来。 相关配置 使用队列集的函数,需要先开启宏开关。具体操作…

Office动态水印终于来了

在信息安全日益重要的今天,保护敏感信息变得尤为关键。目前,动态水印甚至是盲水印技术已经在各种企业软件中广泛应用,常见的钉钉和企业微信等都已经支持此类技术,用户查看消息时画面会显示对应用户的姓名和工号等,而作…

服务器清除BIOS之后引导不了,如何解决??

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…