目标网站

首先来看看我们排行榜的地址:

http://www.qu.la/paihangbang/

我们的目的很明确:找到各类排行旁的的每一部小说的名字和在该网站的链接。

网站分析

首先观察一下网页的结构:

我们很容易就能发现,每一个分类都是包裹在如下标签里

<div class="row row-rank">


这种调理清晰的网站,大大方便了我们爬虫的编写.

接着,我们在刚才那个div里寻找下小说的标题和链接

发现所有的小说都是在一个个列表里,并且里面清晰的定义了:

  • 标题:title = div.a.text
  • 链接:link = 'http://www.qu.la/' + div.a['href']

这样一来,我们只需要在当前页面找到所有小说的连接,并保存在列表就行了。

列表去重的小技巧:

细心的同学会发现,就算是不同类别的小说,也是会重复出现在排行榜的。
这样无形之间就会浪费我们很多资源,尤其是在面对爬大量网页的时候。
那么我们如何从抓取的url列表里去重呢?
刚学Python的小伙伴可能会去实现一个循环算法,来去重,
但是Python的强大之处就在于他可以通过及其优美的方式来解决很多问题,这里其实只要一行代码就能解决:

url_list = list(set(url_list))

这里我们调用了一个list的构造函数set:这样就能保证列表里没有重复的元素了。

单个小说所有章节链接:

首先我们从前面获取到的小说url连接选取一个做实验:
比如乾坤剑神:

https://www.qu.la/book/9118/

看下每个章节的网页结构,首先有翻页功能,可以点击【上一页】和【下一页】进行章节选择。
那么我们如何确定有多少章节,并且爬取每个章节的链接呢?

首先来看下每章节的链接,发现从第一章开始,往后每个章节链接中网页的数字依次递增,这样就不需要进行翻页(由于还没有讲到selenium,暂不考虑),只需要判断受首章节的链接和末尾章节的链接。

末尾章节的链接在哪里找到呢?其实在第一页上已经给出了,这样我们能只需遍历这之间的页数即可,找到全部章节的链接。

我们可以很容易的找到对应章节的连接:

link='http://www.qu.la/' + url.a['href']

好的,这样我们就能把一篇小说的所有章节的链接爬下来了。
剩下最后一步:爬取文章内容:

文章内容的爬取:

首先我们打开一章,并查看他的源代码:

我们能发现所有的正文内容,都保存在:

<div id='content'>

所有的章节名就更简单了:

<h1 class="title"> 第一章 我改主意了</h1>

那我们通过bs4库的各种标签的查找方法,就能很简单的找到啦
好了,让我们看看具体代码的实现:

代码的实现

模块化,函数式编程是一个非常好的习惯,我们坚持把每一个独立的功能都写成函数,这样会使你的代码简单又可复用。

网页抓取头:
def get_html(url):try:r = requests.get(url, timeout=30)r.raise_for_status# 我手动测试了编码。并设置好,这样有助于效率的提升r.encoding = ('utr-8')return r.textexcept:return "Someting Wrong!"
获取排行榜小说及其链接:
def get_content(url):'''爬取每一类型小说排行榜,按顺序写入文件,文件内容为 小说名字+小说链接将内容保存到列表并且返回一个装满url链接的列表'''url_list = []html = get_html(url)soup = bs4.BeautifulSoup(html, 'lxml')# 由于小说排版的原因,历史类和完本类小说不在一个div里category_list = soup.find_all('div', class_='index_toplist mright mbottom')history_finished_list = soup.find_all('div', class_='index_toplist mbottom')for cate in category_list:name = cate.find('div', class_='toptab').span.stringwith open('novel_list.csv', 'a+') as f:f.write("\n小说种类:{} \n".format(name))# 我们直接通过style属性来定位总排行榜general_list = cate.find(style='display: block;')# 找到全部的小说名字,发现他们全部都包含在li标签之中book_list = general_list.find_all('li')# 循环遍历出每一个小说的的名字,以及链接for book in book_list:link = 'http://www.qu.la/' + book.a['href']title = book.a['title']# 我们将所有文章的url地址保存在一个列表变量里url_list.append(link)# 这里使用a模式,防止清空文件with open('novel_list.csv', 'a') as f:f.write("小说名:{:<} \t 小说地址:{:<} \n".format(title, link))for cate in history_finished_list:name = cate.find('div', class_='toptab').span.stringwith open('novel_list.csv', 'a') as f:f.write("\n小说种类:{} \n".format(name))general_list = cate.find(style='display: block;')book_list = general_list.find_all('li')for book in book_list:link = 'http://www.qu.la/' + book.a['href']title = book.a['title']url_list.append(link)with open('novel_list.csv', 'a') as f:f.write("小说名:{:<} \t 小说地址:{:<} \n".format(title, link))return url_list
获取单本小说的所有章节链接:
def get_txt_url(url):'''获取该小说每个章节的url地址:并创建小说文件'''url_list = []html = get_html(url)soup = bs4.BeautifulSoup(html, 'lxml')lista = soup.find_all('dd')txt_name = soup.find('h1').textwith open('/Users/ehco/Documents/codestuff/Python-crawler/小说/{}.txt'.format(txt_name), "a+") as f:f.write('小说标题:{} \n'.format(txt_name))for url in lista:url_list.append('http://www.qu.la/' + url.a['href'])return url_list, txt_name
获取单页文章的内容并保存到本地:

这里有个小技巧:
我们从网上趴下来的文件很多时候都是带着
之类的格式化标签,
我们可以通过一个简单的方法把他过滤掉:

html = get_html(url).replace('<br/>', '\n')

我这里单单过滤了一种标签,并将其替换成‘\n’用于文章的换行,

def get_one_txt(url, txt_name):'''获取小说每个章节的文本并写入到本地'''html = get_html(url).replace('<br/>', '\n')soup = bs4.BeautifulSoup(html, 'lxml')try:txt = soup.find('div', id='content').text.replace('chaptererror();', '')title = soup.find('title').textwith open('/Users/ehco/Documents/codestuff/Python-crawler/小说/{}.txt'.format(txt_name), "a") as f:f.write(title + '\n\n')f.write(txt)print('当前小说:{} 当前章节{} 已经下载完毕'.format(txt_name, title))except:print('someting wrong')
缺点:

本次爬虫写的这么顺利,更多的是因为爬的网站是没有反爬虫技术,以及文章分类清晰,结构优美。
但是,按照我们的这篇文的思路去爬取小说,

我大概计算了一下:
一篇文章需要:0.5s
一本小说(1000张左右):8.5分钟
全部排行榜(60本): 8.5小时!

是的! 时间太长了!那么,这种单线程的爬虫,速度如何能提高呢?自己写个多线程模块?

其实还有更好的方式:下一个大的章节我们将一起学习Scrapy框架
学到那里的时候,我再把这里代码重构一边,
你会惊奇的发现,速度几十倍甚至几百倍的提高了!
这其实也是多线程的威力!

最后看一下结果吧:
排行榜结果:

小说结果:

学到这里是不是越来越喜欢爬虫这个神奇的东西了呢?
加油,更神奇的东西还在后面呢!

从零开始写Python爬虫 --- 1.5 爬虫实践: 笔趣阁小说批量下载相关推荐

  1. Python 爬虫复习之爬取笔趣阁小说网站(不用正则)

    前言 小说网站-笔趣阁:URL:https://www.qu.la/ 笔趣阁是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更新速度.并且该网站只支持在 ...

  2. Python学习笔记,爬取笔趣阁小说

    学习了基础的语法,然后网上看到有人分享利用python爬取小说,自己拷贝了代码尝试了一下. 1. 环境准备 安装 BeautifulSoup4 和 lxml & C:/Python39/pyt ...

  3. 爬虫新手入门实战项目(爬取笔趣阁小说并下载)

    网络爬虫是什么?简单来说就是一个脚本,他能帮助我们自动采集我们需要的资源. 爬虫步骤 获取数据 # 导入模块 import requests import re url = 'https://www. ...

  4. Python爬虫之爬取笔趣阁小说下载到本地文件并且存储到数据库

    学习了python之后,接触到了爬虫,加上我又喜欢看小说,所以就做了一个爬虫的小程序,爬取笔趣阁小说. 程序中一共引入了以下几个库: import requests import mysql.conn ...

  5. Python爬虫:笔趣阁小说搜索和爬取

    目录 0x00 写在前面 0x01 搜索页面 0x02 章节获取 0x03 章节内容获取 0x04 完整代码 0x00 写在前面 最近开始学习Python的爬虫,就试着写了写笔趣阁小说的爬虫,由于是初 ...

  6. Python爬虫--笔趣阁小说爬取

    Python爬虫–笔趣阁小说爬取 爬虫用到的插件 import requests from lxml import etree 小说目录页 以小说"我有百万技能点"为例,在笔趣阁搜 ...

  7. Python爬虫练习(一) 爬取新笔趣阁小说(搜索+爬取)

    爬取笔趣阁小说(搜索+爬取) 首先看看最终效果(gif): 实现步骤: 1.探查网站"http://www.xbiquge.la/",看看网站的实现原理. 2.编写搜索功能(获取每 ...

  8. python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)

    python3+re 爬虫爬取笔趣阁小说 斗罗大陆IV终极斗罗 爬取前准备 导入的模块 分析 正则的贪婪与非贪婪 附完整代码示例 爬取前准备 导入的模块 import redis #redis数据库 ...

  9. 爬虫练习-爬取笔趣阁小说

    练习一下爬虫,将笔趣阁的小说根据需求目标再爬取下来,本文仅仅学习爬虫技术,大家还是要支持一下正版网站的 思路: Created with Raphaël 2.2.0开始输入书名查询小说是否存在跳转页面 ...

最新文章

  1. 箭头函数参数和返回值
  2. 打印出系统所有即未被assign到business transaction和IBASE component的product ID列表
  3. 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)
  4. 这个代码应该怎么写???
  5. CWinThread
  6. 真壕!腾讯员工平均月薪 7 万!
  7. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、并且——queryset对象序列化...
  8. Java 如何抛出异常、自定义异常、手动或主动抛出异常
  9. each iteration和 each occurrunce的区别
  10. wⅰndows办公软件2003,办公软件2003
  11. python培训教程 ppt
  12. 阿里巴巴国际站组合标题的小技巧
  13. 【密码学】七、密钥管理
  14. 64位系统可以装python32位吗_Python - pyinstaller在64位系统下打包32位程序
  15. php提取字符串连接,如何从PHP中的字符串中提取URL?
  16. java面向对象与面向过程的区别
  17. dwg格式文件怎么打开
  18. 来自菜鸟的逆袭,闭关修炼一个月,出关后成功拿下阿里,蚂蚁金服,美团三个大厂意向书!
  19. 手把手教你一项Python爬虫接单(技术+渠道)
  20. 中国食品级磷酸盐市场深度评估及预测报告(2022版)

热门文章

  1. 怎样用键盘控制电脑的光标
  2. 【独家】防不胜防!默认勾选复燃,看刚上市的「同程艺龙」作恶勇气和相悖价值观 || 新芒X...
  3. Fast Reed-Solomon Interactive Oracle Proofs of Proximity学习笔记
  4. line-height含义
  5. HashMap灵魂26问
  6. C# winform中打开网页的方法
  7. webstorm/idea license server
  8. 练习:随机点名器案例
  9. 磨金石教育插画技能干货分享|学习插画可以从事什么工作?
  10. Speedoffice(word)如何设置分栏