一、安装python

官网

下载python3.9及以上版本

二、安装playwright

playwright是微软公司2020年初发布的新一代自动化测试工具,相较于目前最常用的Selenium,它仅用一个API即可自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作。

(1)安装Playwright依赖库

  1. 1 pip install playwright

(2)安装Chromium、Firefox、WebKit等浏览器的驱动文件(内置浏览器)

  1. 1 python -m playwright install

三、分析网站的HTML结构

魔笔小说网是一个轻小说下载网站,提供了mobi、epub等格式小说资源,美中不足的是,需要跳转城通网盘下载,无会员情况下被限速且同一时间只允许一个下载任务。

当使用chrome浏览器时点击键盘的F12进入开发者模式。

(一)小说目录

HTML内容

通过href标签可以获得每本小说的详细地址,随后打开该地址获取章节下载地址。

(二)章节下载目录

HTML内容

遍历每本小说的地址并保存到单独的txt文件中供后续下载。

(三)代码

  1. 1 import time,re
  2. 2
  3. 3 from playwright.sync_api import Playwright, sync_playwright, expect
  4. 4
  5. 5 def cancel_request(route,request):
  6. 6 route.abort()
  7. 7 def run(playwright: Playwright) -> None:
  8. 8 browser = playwright.chromium.launch(headless=False)
  9. 9 context = browser.new_context()
  10. 10 page = context.new_page()
  11. 11 # 不加载图片
  12. 12 # page.route(re.compile(r"(\.png)|(\.jpg)"), cancel_request)
  13. 13 page.goto("https://mobinovels.com/")
  14. 14 # 由于魔笔小说首页是动态加载列表,因此在此处加30s延迟,需手动滑动页面至底部直至加载完全部内容
  15. 15 for i in range(30):
  16. 16 time.sleep(1)
  17. 17 print(i)
  18. 18 # 定位至列表元素
  19. 19 novel_list = page.locator('[class="post-title entry-title"]')
  20. 20 # 统计小说数量
  21. 21 total = novel_list.count()
  22. 22 # 遍历获取小说详情地址
  23. 23 for i in range(total):
  24. 24 novel = novel_list.nth(i).locator("a")
  25. 25 title = novel.inner_text()
  26. 26 title_url = novel.get_attribute("href")
  27. 27 page1 = context.new_page()
  28. 28 page1.goto(title_url,wait_until='domcontentloaded')
  29. 29 print(i+1,total,title)
  30. 30 try:
  31. 31 content_list = page1.locator("table>tbody>tr")
  32. 32 # 保存至单独txt文件中供后续下载
  33. 33 with open('./novelurl/'+title+'.txt', 'a') as f:
  34. 34 for j in range(content_list.count()):
  35. 35 if content_list.nth(j).locator("td").count() > 2:
  36. 36 content_href = content_list.nth(j).locator("td").nth(3).locator("a").get_attribute("href")
  37. 37 f.write(title+str(j+1)+'分割'+content_href + '\n')
  38. 38 except:
  39. 39 pass
  40. 40 page1.close()
  41. 41 # 程序结束后手动关闭程序
  42. 42 time.sleep(50000)
  43. 43 page.close()
  44. 44
  45. 45 # ---------------------
  46. 46 context.close()
  47. 47 browser.close()
  48. 48
  49. 49
  50. 50 with sync_playwright() as playwright:
  51. 51 run(playwright)

(四)运行结果

四、开始下载

之所以先将下载地址保存到txt再下载而不是立即下载,是防止程序因网络等原因异常崩溃后记录进度,下次启动避免重复下载。

(一)获取cookies

城通网盘下载较大资源时需要登陆,有的轻小说文件较大时,页面会跳转到登陆页面导致程序卡住,因此需利用cookies保存登陆状态,或增加延迟手动在页面登陆。

chrome浏览器可以通过cookies editor插件获取cookies,导出后即可使用。

(二)分析下载地址

下载地址有三种类型,根据判断条件分别处理:

(1)文件的访问密码统一为6195,当域名为 https://url74.ctfile.com/ 地址后缀带有 ?p=6195 时,页面自动填入访问密码,我们需要在脚本中判断后缀是否为 ?p=6195 ,如不是则拼接字符串后访问;

(2)有后缀时无需处理;

(3)当域名为 https://t00y.com/ 时无需密码;

  1. 1 if "t00y.com" in new_url:
  2. 2 page.goto(new_url)
  3. 3 elif "?p=6195" not in new_url:
  4. 4 page.goto(new_url+"?p=6195")
  5. 5 page.get_by_placeholder("文件访问密码").click()
  6. 6 page.get_by_role("button", name="解密文件").click()
  7. 7 else:
  8. 8 page.goto(new_url)
  9. 9 page.get_by_placeholder("文件访问密码").click()
  10. 10 page.get_by_role("button", name="解密文件").click()

(三)开始下载

playWright下载资源需利用 page.expect_download 函数。

下载完整代码如下:

  1. 1 import time,os
  2. 2
  3. 3 from playwright.sync_api import Playwright, sync_playwright, expect
  4. 4
  5. 5
  6. 6 def run(playwright: Playwright) -> None:
  7. 7 browser = playwright.chromium.launch(channel="chrome", headless=False) # 此处使用的是本地chrome浏览器
  8. 8 context = browser.new_context()
  9. 9 path = r'D:\PycharmProjects\wxauto\novelurl'
  10. 10 dir_list = os.listdir(path)
  11. 11 # 使用cookies
  12. 12 # cookies = []
  13. 13 # context.add_cookies(cookies)
  14. 14 page = context.new_page()
  15. 15 for i in range(len(dir_list)):
  16. 16 try:
  17. 17 novel_url = os.path.join(path, dir_list[i])
  18. 18 print(novel_url)
  19. 19 with open(novel_url) as f:
  20. 20 for j in f.readlines():
  21. 21 new_name,new_url = j.strip().split("分割")
  22. 22 if "t00y.com" in new_url:
  23. 23 page.goto(new_url)
  24. 24 elif "?p=6195" not in new_url:
  25. 25 page.goto(new_url+"?p=6195")
  26. 26 page.get_by_placeholder("文件访问密码").click()
  27. 27 page.get_by_role("button", name="解密文件").click()
  28. 28 else:
  29. 29 page.goto(new_url)
  30. 30 page.get_by_placeholder("文件访问密码").click()
  31. 31 page.get_by_role("button", name="解密文件").click()
  32. 32
  33. 33 with page.expect_download(timeout=100000) as download_info:
  34. 34 page.get_by_role("button", name="立即下载").first.click()
  35. 35 print(new_name,"开始下载")
  36. 36 download_file = download_info.value
  37. 37 download_file.save_as("./novel/"+dir_list[i][:-4]+"/"+download_file.suggested_filename)
  38. 38 time.sleep(3)
  39. 39 os.remove(novel_url)
  40. 40 print(i+1,dir_list[i],"下载结束")
  41. 41 except:
  42. 42 print(novel_url,"出错")
  43. 43 time.sleep(60)
  44. 44 page.close()
  45. 45
  46. 46 # ---------------------
  47. 47 context.close()
  48. 48 browser.close()
  49. 49
  50. 50
  51. 51 with sync_playwright() as playwright:
  52. 52 run(playwright)

(四)运行结果

使用playwright爬取魔笔小说网站并下载轻小说资源的更多相关文章

  1. python入门学习之Python爬取最新笔趣阁小说

    Python爬取新笔趣阁小说,并保存到TXT文件中      我写的这篇文章,是利用Python爬取小说编写的程序,这是我学习Python爬虫当中自己独立写的第一个程序,中途也遇到了一些困难,但是最后 ...

  2. python之如何爬取一篇小说的第一章内容

    现在网上有很多小说网站,但其实,有一些小说网站是没有自己的资源的,那么这些资源是从哪里来的呢?当然是“偷取”别人的数据咯.现在的问题就是,该怎么去爬取别人的资源呢,这里便从简单的开始,爬取一篇小说的第 ...

  3. 如何用python爬虫从爬取一章小说到爬取全站小说

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  4. 用scrapy爬取亚马逊网站项目

    这次爬取亚马逊网站,用到了scrapy,代理池,和中间件: spiders里面: # -*- coding: utf-8 -*- import scrapy from scrapy.http.requ ...

  5. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  6. 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据

    为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...

  7. 使用requests+BeautifulSoup爬取龙族V小说

    这几天想看龙族最新版本,但是搜索半天发现 没有网站提供 下载, 我又只想下载后离线阅读(写代码已经很费眼睛了).无奈只有自己 爬取了. 这里记录一下,以后想看时,直接运行脚本 下载小说. 这里是从   ...

  8. scrapy进阶(CrawlSpider爬虫__爬取整站小说)

    # -*- coding: utf-8 -*- import scrapy,re from scrapy.linkextractors import LinkExtractor from scrapy ...

  9. Python的scrapy之爬取6毛小说网的圣墟

    闲来无事想看个小说,打算下载到电脑上看,找了半天,没找到可以下载的网站,于是就想自己爬取一下小说内容并保存到本地 圣墟 第一章 沙漠中的彼岸花 - 辰东 - 6毛小说网  http://www.6ma ...

  10. 使用scrapy爬取金庸小说目录和章节url

    刚接触使用scrapy的时候,如果一开始就想实现特别复杂的配置,显然是不太现实的,用一些小的例子可以帮助自己理解各个模块. 今天的目标:爬取http://www.luoxia.com/shendiao ...

随机推荐

  1. 一文解开主流开源变更数据捕获技术之Flink CDC的入门使用

    @ 目录 概述 定义 什么是CDC? CDC的分类 特性 应用场景 支持数据源 实战 Flink DataStream方式代码示例 FlinkSQL方式代码示例 概述 定义 flink-cdc-con ...

  2. 创建属于自己的github、使用git提交、更新代码至github、写好readme

    1. 在github上创建一个Repository 点击github网站,你可以用你的邮箱先注册一个账号. 点击New,转到创建一个repository的界面,如下图所示,你可以填写你的Reposit ...

  3. Codeforces Round #885 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  4. SSH远程主机执行命令:s2c

    #!/bin/bash ip=$1 ip_num=$(echo $ip | awk -F\. '{print NF}') if [ $ip_num -eq 2 ]; then ip=192.168.$ ...

  5. Java8 函数式编程stream流

    1.初始环境准备 ​ 场景:现在有一个公司,公司部门有一级部门,二级部门甲和二级部门乙(其中二级部门甲和二级部门乙是一级部门的子部门), 一级部门下面有有001号员工小明,二级部门甲下面有002号员工 ...

  6. 一条命令突破Windows限制,暂定更新时间至3000天

    在系统界面上最长也就只能延期 35 天,而且 35 天以后一定要更新了才能继续暂停.不过,我找到了一段能延长暂停时间的代码 reg add "HKEY_LOCAL_MACHINE\SOFTW ...

  7. don't be shy to use reshape

    don't be shy to use reshape

  8. [selenium]相对定位器

    前言 Relative Locators,相对定位器,是Selenium 4引入的一个新的定位器,相对定位器根据源点元素去定位相对位置的其它元素. 相对定位方法其实是基于JavaScript的 get ...

  9. 从数据库方向getshell方法总结

    前提 拿到数据库权限,可以执行sql语句,或者进入到phpmyadmin界面,或pmd界面 phpstudy 对应phpmyadmin界面 phpmyadmin.php upupw 对应pmd界面 u ...

  10. 浏览器Xbox 云游戏教程

    我这里使用的是韩国的地方因为延迟和网速会比较快 Xbox 云游戏韩国网站 Xbox.com에서 Xbox Cloud Gaming(베타) 首先插件商店下载一个油猴插件 在系统语言和时区改为韩国 在  ...