假如,我是说假如,我能够看免费的VIP小说,阁下该如何应对?

 在信息时代,网络上涌现了大量的小说资源,让人们可以随时随地享受阅读的乐趣。然而,有时候我们可能会遇到一些小说网站上要付费的情况,或许,付费阅读已成常态,但身为不知钱为何物的我却犯了难,或许,我们可以试试爬取小说内容!然而,实际操作中我们会面临各种各样的困难,让人望而却步。本文将会分享我在爬取小说网站时遇到的困难,以及最终我是如何解决这些问题的。


## 第一步:选择合适的爬取工具

我最初的尝试是使用Python中的BeautifulSoup模块。这是一个非常强大的HTML解析库,能够方便地从网页中提取出需要的信息。然而,在爬取小说网站时,我很快发现了问题。这些小说网站通常会使用JavaScript动态加载内容,而BeautifulSoup并不能很好地处理这种情况。

## 第二步:尝试Selenium

为了应对动态加载的问题,我转而使用了Selenium库。Selenium可以模拟浏览器的行为,包括执行JavaScript代码,从而能够获取到完整的页面内容。我发现,通过Selenium,我可以获取到想要的小说内容,但是又遇到了新的问题。

## 第三步:Webdriver变量路径安装问题

在使用Selenium时,我需要指定一个Webdriver,它相当于一个浏览器的实例,用于加载网页并执行操作。然而,我在安装过程中遇到了Webdriver变量路径的问题。我尝试了多种方法,但始终无法成功地将Webdriver正确地配置到我的环境中。

## 最终解决方案

在经过一番搜索和尝试之后,我终于找到了解决方案。原来,Webdriver的路径问题可以通过将Webdriver的路径添加到系统环境变量中来解决。具体步骤如下:

1. 下载合适版本的Webdriver,并将其解压到一个目录中。(我是解压到python安装目录下,记住复制一份并改名,添加变量才能成功)
2. 将Webdriver的路径添加到系统的环境变量中。这样,无论在哪个目录下,系统都能够找到Webdriver的位置。

通过这个解决方案,我终于成功地配置好了Webdriver,并且可以使用Selenium来爬取小说网站的内容了。我感到非常兴奋,终于克服了这些困难,不容易呀!终于成功地获取到了我想要的小说内容。

这是源码:(一次只能下一本,下一本你需要把txt文本提到一个文件夹中,清空,注意,你可以改延迟,注意防封)(还有一定要安装相应的库)

import os
import re
from selenium import webdriver
from bs4 import BeautifulSoup
import time
from tqdm import tqdm

# 作者信息
from termcolor import colored

author_name = "作者:O2Ethereal"
author_url = "https://gitee.com/o2ethereal"

print(f"{author_name}\n{author_url}")
print("网站举例:\nhttps://www.biqukan8.cc/38_38836/")

# 用户输入小说目录下载地址
directory_url = input("请输入小说目录下载地址(回车键继续):")

# 创建 Edge WebDriver,使用无痕模式
options = webdriver.EdgeOptions()
options.add_argument('--inprivate')
driver = webdriver.Edge(options=options)

# 打开小说目录页面
driver.get(directory_url)
time.sleep(5)  # 等待页面加载

# 获取页面源码
directory_html = driver.page_source
soup = BeautifulSoup(directory_html, 'html.parser')

# 获取章节链接和标题
chapter_data = []
in_content_div = False
for element in soup.find_all(['dt', 'dd']):
   if "正文卷" in element.get_text():
       in_content_div = True
   elif in_content_div and element.name == 'dd':
       link = element.a.get('href')
       if link.startswith("/"):
           link = link[1:]  # 去除开头的斜杠
       chapter_url = f"https://www.biqukan8.cc/{link}"
       title = element.a.get_text()
       chapter_data.append((title, chapter_url))

# 创建文件夹
output_folder = "novel_chapters"
os.makedirs(output_folder, exist_ok=True)

# 正则表达式模式
pattern = re.compile(r'(我们会尽快处理\.举报后请耐心等待,并刷新页面。|\(\)章节错误,点此举报\(免注册\)我们会尽快处理\.举报后请耐心等待,并刷新页面。|笔趣阁手机版阅读网址:m\.biqukan8\.cc|请记住本书首发域名:www.biqukan8.cc。)')

# 保存每个章节的内容到文件
for idx, (title, link) in enumerate(
       tqdm(chapter_data, desc="Downloading", ncols=100, bar_format="{l_bar}%s{bar:10}{r_bar} {percentage:3.0f}%",
            colour="cyan"), start=1):
   # 打开章节页面
   driver.get(link)
   time.sleep(0.5)  # 等待页面加载
   chapter_soup = BeautifulSoup(driver.page_source, 'html.parser')

   # 获取章节内容
   content_div = chapter_soup.find('div', class_='showtxt')
   if content_div:
       chapter_content = content_div.get_text()

       # 去除章节链接
       chapter_content = chapter_content.replace(link, "")

       # 使用正则表达式清理文本
       chapter_content = re.sub(pattern, '', chapter_content)

       # 去除空行
       lines = [line.strip() for line in chapter_content.split('\n') if line.strip()]
       cleaned_content = '\n'.join(lines)

       # 保存到文件
       file_name = os.path.join(output_folder, f"{title}.txt")
       with open(file_name, "w", encoding="utf-8") as file:
           file.write(cleaned_content)

       print(f"Downloading:   {idx / len(chapter_data) * 100:.0f}%|▏ {title}  已下载")

# 关闭 WebDriver
driver.quit()

## 总结

在爬取小说网站的过程中,我们可能会遇到各种各样的困难,特别是在处理动态加载内容的情况下。虽然最初的尝试可能会失败,但是只要持续探索和尝试,总会找到解决问题的方法。本文分享了我在这个过程中遇到的困难,以及最终我是如何解决问题的。希望这些经验能够对那些面临类似问题的人提供一些帮助和启示。

## 效果

好东西,偷偷的用别忘了点赞偶 !

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
如果你的数据是从数据库中读取出来的,那么可以将 ResultSet 中的数据逐行读取出来,然后将其存放在一个二维数组中,最后使用这个二维数组来创建 JTable 对象。 下面是一个示例代码,它演示了如何将 ResultSet 中的数据存放在一个二维数组中,并使用这个数组来创建一个包含四个字段的表格: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; public class MyTable { public static void main(String[] args) { // 连接数据库 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) { // 执行查询 String sql = "SELECT * FROM users"; ResultSet rs = stmt.executeQuery(sql); // 将结果集转换成二维数组 Object[][] data = new Object[100][4]; int i = 0; while (rs.next()) { data[i][0] = rs.getString("first_name"); data[i][1] = rs.getString("last_name"); data[i][2] = rs.getInt("age"); data[i][3] = rs.getString("gender"); i++; } // 创建表头 String[] columnNames = {"First Name", "Last Name", "Age", "Gender"}; // 创建表格 JTable table = new JTable(data, columnNames); // 创建滚动条 JScrollPane scrollPane = new JScrollPane(table); // 创建窗口 JFrame frame = new JFrame("My Table"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(scrollPane); frame.pack(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们首先连接了数据库,并执行了一个查询操作,将结果集存放在 ResultSet 对象 rs 中。然后,我们使用 while 循环逐行读取结果集中的数据,并将其存放在一个二维数组 data 中。最后,我们使用这个二维数组来创建 JTable 对象,并将其添加到窗口中,以显示出表格。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值