利用Python爬虫抓取小说网站全部文章
我们先来选定爬取目标,我爬取的网站是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爬虫抓取小说网站全部文章相关推荐
- 四、python爬虫抓取购物网站商品信息--图片价格名称
本篇博客参考:python爬虫入门教程 http://blog.csdn.net/wxg694175346/article/category/1418998 Python爬虫爬取网页图片 http:/ ...
- python爬虫爬取小说网站并转换为语音文件
前言 作为一个技术宅,本着为眼睛着想的角度考虑,能少看屏幕就尽量少看屏幕,可是又是一个小说迷,那就开动脑筋爬一下小说转换成语音来听书吧 第一章:爬取小说文件 把目标定在小说存储量比较大的网站:起点中文 ...
- 利用python爬虫抓取虎扑PUBG论坛帖子并制作词云图
作为一个PUBG迷,刷论坛是每天必不可少的事,上面有很多技术贴和职业比赛的帖子,突发奇想,想知道论坛里谈论最多的是什么,便做了一个爬虫爬取了论坛上最新的帖子标题和部分回复,然后利用jieba与word ...
- 利用Python爬虫抓取猫眼电影排行(BeautifulSoup方式初试手,欢迎改进)
from bs4 import BeautifulSoup import requests import json import time from requests.exceptions impor ...
- python爬虫抓取微信公众号文章(含全文图以及点赞数、在看数、阅读数)
因工作需要写了一个微信公众号文章的爬虫程序,贴一下分享给需要的朋友. 首先是抓取文章的url链接,在反复研究之后找到的一个最简单的方法,不需要抓包工具.首先需要自己注册一个微信公众号,有微信即可绑定注 ...
- python 小说cms系统_「博文小说网」Python爬虫爬取小说网站 - seo实验室
博文小说网 #!/usr/bin/env Python # -*- coding: utf-8 -*- # @Author : Woolei # @File : book136_singleproce ...
- Python 爬虫-抓取小说《鬼吹灯之精绝古城》
想看小说<鬼吹灯之精绝古城>,可是网页版的好多广告,还要一页一页的翻,还无法复制,于是写了个小爬虫,保存到word里慢慢看. 代码如下: """ 爬取< ...
- python爬虫抓取网站技巧总结
不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...
- Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)
Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...
最新文章
- 2018 中国开源年度报告发布,阿里系独占鳌头
- 各种Java日志框架的比较
- Android Stdio换源以及配置项目
- enyo官方开发入门教程翻译一Controls之Buttons
- vue.js 三(数据交互)isomorphic-fetch
- Kubernetes容器集群 - harbor仓库高可用集群部署说明
- SIP代理服务器(2)
- 民生付 php,“民生付”升级我省电商支付体验
- JKD16正式发布,新特新一览
- android 65536 简书,app编译打包时的65536问题
- python标准库——math模块
- html5视频页面的源码,html5 网页录制视频示例源码
- 如何玩转抖音吸粉引流,老路子新热点照样1000+
- 2018华东师范软件复试机试
- 华为计算机黑屏怎么办,华为笔记本升级后黑屏怎么回事
- 区块链授权的5G异构网络安全频谱共享
- OAI搭建——硬件准备
- python模拟用户登录爬取阳光采购平台数据
- 笔记之Python网络数据采集
- 美食大战老鼠html,美食大战老鼠卤料花园过法详解