我们先来选定爬取目标,我爬取的网站是https://www.17k.com/ ,一些大型的网站(如起点、豆瓣等)做了反爬虫的部署,这会大大增加我们抓取的难度,所以尽量还是选一些不那么热门的网站。

爬虫的第一步,也是最重要的一步,就是分析网页的结构,定位到我们想要抓取的内容。首先点开一本书的某一章节,这里以小说《第九特区》的第一章《初来乍到》为例展开(https://www.17k.com/chapter/3038645/38755562.html),分析某一章的页面内容结构。

首先来看标题,这个非常简单,标题直接存在于<h1>标签中,我们指导html中<h1>通常是用来标记主标题的,那么理所当然<h1>标签应该只有一个,所以直接放心的用BeautifulSoup的select()方法将找到的第一个<h1>标签找到即可,里面的文本内容就是这一章的标题。主要代码如下:

title = bs.select('h1')[0]

得到了标题,我们再来看正文。

不难发现,所有的文章正文都被包裹在了一个class为“p"的<div>标签里,这个div应该就是用来封装所有正文内容的。所以,我们通过select方法找到CSS类名为”p“的<div>标签,在将里面所有的<p>标签找到,提取出文本内容即可。主要代码如下:

    body = bs.select('div.p')[0]paragraphs = body.find_all('p')content = []for p in paragraphs:content.append(p.text)content.append("\n")

这里用了一个列表来存储所有的段落,并且在每一段后面手动添加了换行"\n"。这样操作的好处是,后面保存文件的时候可以一次性写入,节省了IO的时间。

基于以上的核心代码,再配合上文件读写,url请求等常见操作,我们就可以写出得到一个章节的全部内容并保存的代码getASection,代码如下

def getASection(url,bookName):bookName+=".txt"f = open(bookName,"a",encoding='utf-8')#利用追加的方式打开文件,这样后面章节的内容不会覆盖前面章节rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')title = bs.select('h1')[0]f.write(title.text)f.write("\n")# print(title.text)body = bs.select('div.p')[0]paragraphs = body.find_all('p')content = []for p in paragraphs:content.append(p.text)content.append("\n")f.writelines(content)f.close()

测试以上代码,没有问题,这就完成了项目的第一步,得到得到一个章节的全部内容并保存成txt。那么接下来的任务是什么?就是将一本书的全部章节的链接获取,再分别对这些链接调用上面的函数getASection,就可以得到一本书的全部内容了。

为此,我们来分析一本书全部章节的页面,看看用怎样的方式,来得到每个章节的链接。

分析html代码,发现所有章节都包裹于类名为”Volume“的<dl>标签中

所以,我们可以先用select方法找到class为”Volume"的dl标签:

sections = bs.select('dl.Volume')[0]

然后,再在这里面找到所有的a标签,其中的链接就在href属性中。

    sections = bs.select('dl.Volume')[0]links = sections.select('a')

我们将每一个章节的url作为参数传入第一个函数getASection中,就可将一本书的全部内容保存了。得到一本书全部章节的函数getSections代码如下:

def getSections(url,bookName):rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')sections = bs.select('dl.Volume')[0]links = sections.select('a')del links[0]#第一个a标签为“收起”,将其删除for link in links:if link.attrs["href"] is not None:newUrl = urljoin(url,link.attrs['href'])getASection(newUrl,bookName)

分析我们之前构造的两个函数,第一个函数getASection可以保存一个章节的全部内容,第二个函数getSections可以得到所有的章节,并调用函数getASection分别保存每个章节,这样只需要调用第二个函数getSections,就可以得到一本小说的全部内容了。

那么,如果我们想保存全站(部分)的小说内容,需要怎么做?

基于相同的逻辑,如果找到一个页面,里面存有各个小说的链接,将这里链接分别作为参数,调用上一个函数getSections,不是就可以得到所有书的内容了?

在主页中,就保存着不同书的目录。

我们以“男生作品电击榜”为例,来分析这个目录下的书的链接如何得到。其余的目录同理可以获得。

观察html代码,可以发现,所有的书的链接被包裹在类名为“NS_CONT”  和 "Top1" 的ul标签下。在这个标签下,第二个<a>标签存放着书名和这本书相对应的链接。那么如何找到第二个<a>标签?我们可以先找到第一个<a>标签,然后通过find_next()方法找到第二个<a>结点即可。

    bookList = bs.select('ul.NS_CONT.Top1')[0]sorts = bookList.select('a.sign')for sort in sorts:book = sort.findNext('a')

获取一个目录下所有小说的函数getBooks()代码如下:

def getBooks(url):bookUrls = dict() #用字典来存放小说信息,键为书名,值为链接地址rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')bookList = bs.select('ul.NS_CONT.Top1')[0]sorts = bookList.select('a.sign')for sort in sorts:book = sort.findNext('a')if book.attrs['href'] is not None:href = 'http:'+book.attrs['href']href = href.replace('book','list')#需要把url中的book替换为list,直接进入章节页面bookName = book.textif bookName not in bookUrls:bookUrls[bookName] = href# print("{}:{}".format(bookName,href))for bookName in bookUrls.keys():getSections(bookUrls[bookName],bookName)

通过getBooks()函数,我们一次可以得到一个目录下的多本书的地址,并且将url作为参数分别调用函数getSections,这样就可以一次保存多本书的内容了。

最后,将网站主页作为参数,主函数中调用getBooks即可:

getBooks('https://www.17k.com/')

全部代码如下:

from bs4 import BeautifulSoup
import requests
from requests.compat import urljoin
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}def getASection(url,bookName):bookName+=".txt"f = open(bookName,"a",encoding='utf-8')#利用追加的方式打开文件,这样后面章节的内容不会覆盖前面章节rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')title = bs.select('h1')[0]f.write(title.text)f.write("\n")body = bs.select('div.p')[0]paragraphs = body.find_all('p')content = []for p in paragraphs:content.append(p.text)content.append("\n")f.writelines(content)f.close()def getSections(url,bookName):rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')sections = bs.select('dl.Volume')[0]links = sections.select('a')del links[0]#第一个a标签为“收起”,将其删除for link in links:if link.attrs["href"] is not None:newUrl = urljoin(url,link.attrs['href'])getASection(newUrl,bookName)def getBooks(url):bookUrls = dict() #用字典来存放小说信息,键为书名,值为链接地址rsp = requests.get(url,headers = headers)rsp.encoding = 'utf-8'bs = BeautifulSoup(rsp.text,'html.parser')bookList = bs.select('ul.NS_CONT.Top1')[0]sorts = bookList.select('a.sign')for sort in sorts:book = sort.findNext('a')if book.attrs['href'] is not None:href = 'http:'+book.attrs['href']href = href.replace('book','list')#需要把url中的book替换为list,直接进入章节页面bookName = book.textif bookName not in bookUrls:bookUrls[bookName] = href# print("{}:{}".format(bookName,href))for bookName in bookUrls.keys():getSections(bookUrls[bookName],bookName)getBooks('https://www.17k.com/')

利用Python爬虫抓取小说网站全部文章相关推荐

  1. 四、python爬虫抓取购物网站商品信息--图片价格名称

    本篇博客参考:python爬虫入门教程 http://blog.csdn.net/wxg694175346/article/category/1418998 Python爬虫爬取网页图片 http:/ ...

  2. python爬虫爬取小说网站并转换为语音文件

    前言 作为一个技术宅,本着为眼睛着想的角度考虑,能少看屏幕就尽量少看屏幕,可是又是一个小说迷,那就开动脑筋爬一下小说转换成语音来听书吧 第一章:爬取小说文件 把目标定在小说存储量比较大的网站:起点中文 ...

  3. 利用python爬虫抓取虎扑PUBG论坛帖子并制作词云图

    作为一个PUBG迷,刷论坛是每天必不可少的事,上面有很多技术贴和职业比赛的帖子,突发奇想,想知道论坛里谈论最多的是什么,便做了一个爬虫爬取了论坛上最新的帖子标题和部分回复,然后利用jieba与word ...

  4. 利用Python爬虫抓取猫眼电影排行(BeautifulSoup方式初试手,欢迎改进)

    from bs4 import BeautifulSoup import requests import json import time from requests.exceptions impor ...

  5. python爬虫抓取微信公众号文章(含全文图以及点赞数、在看数、阅读数)

    因工作需要写了一个微信公众号文章的爬虫程序,贴一下分享给需要的朋友. 首先是抓取文章的url链接,在反复研究之后找到的一个最简单的方法,不需要抓包工具.首先需要自己注册一个微信公众号,有微信即可绑定注 ...

  6. python 小说cms系统_「博文小说网」Python爬虫爬取小说网站 - seo实验室

    博文小说网 #!/usr/bin/env Python # -*- coding: utf-8 -*- # @Author : Woolei # @File : book136_singleproce ...

  7. Python 爬虫-抓取小说《鬼吹灯之精绝古城》

    想看小说<鬼吹灯之精绝古城>,可是网页版的好多广告,还要一页一页的翻,还无法复制,于是写了个小爬虫,保存到word里慢慢看. 代码如下: """ 爬取< ...

  8. python爬虫抓取网站技巧总结

    不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...

  9. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...

最新文章

  1. 2018 中国开源年度报告发布,阿里系独占鳌头
  2. 各种Java日志框架的比较
  3. Android Stdio换源以及配置项目
  4. enyo官方开发入门教程翻译一Controls之Buttons
  5. vue.js 三(数据交互)isomorphic-fetch
  6. Kubernetes容器集群 - harbor仓库高可用集群部署说明
  7. SIP代理服务器(2)
  8. 民生付 php,“民生付”升级我省电商支付体验
  9. JKD16正式发布,新特新一览
  10. android 65536 简书,app编译打包时的65536问题
  11. python标准库——math模块
  12. html5视频页面的源码,html5 网页录制视频示例源码
  13. 如何玩转抖音吸粉引流,老路子新热点照样1000+
  14. 2018华东师范软件复试机试
  15. 华为计算机黑屏怎么办,华为笔记本升级后黑屏怎么回事
  16. 区块链授权的5G异构网络安全频谱共享
  17. OAI搭建——硬件准备
  18. python模拟用户登录爬取阳光采购平台数据
  19. 笔记之Python网络数据采集
  20. 美食大战老鼠html,美食大战老鼠卤料花园过法详解

热门文章

  1. [转载]NFC源码分析之R/W工作模式
  2. Xftp7下载安装与使用
  3. android图标为什么是机器人,安卓图标为什么是个机器人?让鸿蒙来告诉你
  4. 《kafka中文手册》- 构架设计(二)
  5. html瀑布流元素布局宽度,css3多列属性实现瀑布流布局
  6. 异类:探究成功的启示
  7. 线性代数学习笔记——第五十一讲——n维向量空间的基、维数与坐标
  8. ios8越狱无cydia
  9. 学习记录-微信小程序
  10. Android集成MuPDF,修改批注默认红色墨迹为黑色墨迹