爬虫小案例——爬取网站小说

摘要:
我之前说过我想爬的网站是:http://www.quanshuwang.com/book/44/44683我建议,当你得到网页的源代码时,你应该先在浏览器中检查和分析网页源代码的一般结构,以便使其清晰,方便以后编写代码。)可以匹配所有内容#定义一个函数defget来抓取在线novels_Novel():html=urllib。要求urlopen。read()html=html。code#转换为URL的格式#唐家三少,共2743个单词,由领先者跨越#reference reg=r'˂ahref=”http://t.zoukankan.com/ (.*?

案例要爬取的网站是:http://www.quanshuwang.com/book/44/44683

步骤:

1、获取小说主页源代码

2、在主页源代码中找到每个章节的超链接

3、获取每个章节超链接的源代码

4、获取章节的内容

5、保存内容到本地

首先导入模板

import re
import urllib.request

然后定义一个函数,专门用来爬取网站小说的

import re
import urllib.request
 
#定义一个爬取网络小说的函数
def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()

最后一行我们调用了urllib库的方法,urlopen方法中我们传进一个网址作为参数表示我们需要爬取的网站,.read()方法表示获取源代码。那我们现在打印html是否能成功在控制台把页面的代码给输出了呢?答案是否定的,现在获取的源码是一个乱码,我们还需要对该代码进行转码,于是要在下面加多一行转码的。

import re
import urllib.request
 
#定义一个爬取网络小说的函数
def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式

由上面我们可知代码已经转成了‘gbk’格式,并且也已经将它存在html这个变量上了,那我们怎么知道转成什么格式呢?

前面我说过我要爬取的网站是:http://www.quanshuwang.com/book/44/44683 

爬虫小案例——爬取网站小说第1张

我建议小伙伴们在获取该网页源代码的时候先在浏览器中查看分析一下该网页源代码的大概结构,分析清楚了好方便后面代码的编写。查看页面源代码有两种方式,1:按住F12。2:鼠标指向页面空白处点击右键,选择“查看页面源代码”。

我们先用第二种方法打开源代码找到<meta>标签便可知道该网站的格式了

 爬虫小案例——爬取网站小说第2张

接下来我另一种方式打开源代码,按F12

 爬虫小案例——爬取网站小说第3张

鼠标点击左上角的箭头,再把鼠标指向网页中的任何一部分内容,查看器马上就能定位到该内容的源代码位置。

因为我们要获取整本小说,所以让我们先获取章节目录吧,把鼠标指向其中一章并选中,下面就自动定位到该章节标签位置了

 爬虫小案例——爬取网站小说第4张

我们对这行右击鼠标->编辑HTML,然后把这一行都复制下来

回到编辑器这边把刚才的代码粘贴过来并打上注释,作为一个参考的模板

def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式
    #<li><a href="http://www.quanshuwang.com/book/44/44683/15379609.html" title="引子 穿越的唐家三少,共2744字">引子 穿越的唐家三少</a></li>  #参考

因为我们需要抓取的是全部章节而不仅仅只是这一个章节,所以我们要用到正则表达式来进行匹配,先把通用的部分用(.*?)替代,(.*?)可以匹配所有东西

#定义一个爬取网络小说的函数
def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式
    #<li><a href="http://www.quanshuwang.com/book/44/44683/15379609.html" title="引子 穿越的唐家三少,共2744字">引子 穿越的唐家三少</a></li>  #参考
    reg = r'<li><a href="http://t.zoukankan.com/(.*?)" title=".*?">(.*?)</a></li>'     #正则表达的匹配
    reg = re.compile(reg)     #可添加可不添加,增加效率
    urls = re.findall(reg,html)
  print(urls)

get_novel()

仔细的小伙伴就发现有些地方的.*?加括号,有些地方又不加,这是因为加了括号的都是我们要匹配的,不加括号是我们不需要匹配的。接下来一行调用re.compiled()方法是增加匹配的效率,建议习惯加上,最后一行开始与我们一开始获取的整个网页的源代码进行匹配。到这步我们已经能把代码所有章节以及章节链接的代码都获取了,打印在控制台上看一下
爬虫小案例——爬取网站小说第5张

从结果我们可以知道对于每个循环出来的结果为一个元祖,有两个索引,0和1,0为章节的超链接,1为章节的名字。

既然我们获取到了每个章节的超链接那我们是不是就可以像上面的操作步骤一样获取这个链接里面的内容啦?答案是肯定的。

于是我们继续写以下的代码获取每个章节的代码(跟上面获取主页代码的步骤类似)

#定义一个爬取网络小说的函数
def getNovelContent():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式
    #<li><a href="http://www.quanshuwang.com/book/44/44683/15379609.html" title="引子 穿越的唐家三少,共2744字">引子 穿越的唐家三少</a></li>  #参考
    reg = r'<li><a href="http://t.zoukankan.com/(.*?)" title=".*?">(.*?)</a></li>'     #正则表达的匹配
    reg = re.compile(reg)     #可添加可不添加,增加效率
    urls = re.findall(reg,html)
    # print(urls)
    for url in urls:
        #print(url)
        chapter_url = url[0]  #章节的超链接
        chapter_title = url[1]  #章节的名字
        print(chapter_title)
        chapter_html = urllib.request.urlopen(chapter_url).read()   #正文内容源代码
        chapter_html = chapter_html.decode("gbk")

get_novel()

至此我们已经可以得到每个章节的内容了,但是还有一个问题,就是我们只想获取正文内容,正文以外的东西我们统统不要。

所以我们可以在网页中打开其中一章并查看源代码,例如我打开的是第一章,查找正文的内容在哪个标签中。

爬虫小案例——爬取网站小说第6张

上面两张图标识了我找到的正文内容开始与结束标签的位置,标签为<script>

于是我们在代码中又可以通过正则表达式来匹配内容了

#定义一个爬取网络小说的函数
def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式
    #<li><a href="http://www.quanshuwang.com/book/44/44683/15379609.html" title="引子 穿越的唐家三少,共2744字">引子 穿越的唐家三少</a></li>  #参考
    reg = r'<li><a href="http://t.zoukankan.com/(.*?)" title=".*?">(.*?)</a></li>'     #正则表达的匹配
    reg = re.compile(reg)     #可添加可不添加,增加效率
    urls = re.findall(reg,html)
    # print(urls)
    for url in urls:
        chapter_url = url[0]  #章节的超链接
        chapter_title = url[1]  #章节的名字
        print(chapter_title)
        chapter_html = urllib.request.urlopen(chapter_url).read()   #正文内容源代码
        chapter_html = chapter_html.decode("gbk")
        chapter_reg = r'</script>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.*?<br />(.*?)<script type="text/javascript">'
        chapter_reg = re.compile(chapter_reg,re.S)
        chapter_content = re.findall(chapter_reg,chapter_html)

 到这里我们已经完成了小说的全部爬取,在控制台打印一下吧

#定义一个爬取网络小说的函数
def get_novel():
    html = urllib.request.urlopen("http://www.quanshuwang.com/book/44/44683").read()
    html = html.decode("gbk")   #转成该网址的格式
    #<li><a href="http://www.quanshuwang.com/book/44/44683/15379609.html" title="引子 穿越的唐家三少,共2744字">引子 穿越的唐家三少</a></li>  #参考
    reg = r'<li><a href="http://t.zoukankan.com/(.*?)" title=".*?">(.*?)</a></li>'     #正则表达的匹配
    reg = re.compile(reg)     #可添加可不添加,增加效率
    urls = re.findall(reg,html)
    # print(urls)
    for url in urls:
        chapter_url = url[0]  #章节的超链接
        chapter_title = url[1]  #章节的名字
        print(chapter_title)
        chapter_html = urllib.request.urlopen(chapter_url).read()   #正文内容源代码
        chapter_html = chapter_html.decode("gbk")
        chapter_reg = r'</script>&nbsp;&nbsp;&nbsp;&nbsp;.*?<br />(.*?)<script type="text/javascript">'
        chapter_reg = re.compile(chapter_reg,re.S)
        chapter_content = re.findall(chapter_reg,chapter_html)
        for content in chapter_content:                #打印章节的内容
            content = content.replace("&nbsp;&nbsp;&nbsp;&nbsp","")  #把"&nbsp;"字符全都替换为""
            content = content.replace("<br />","")      #把"<br/>"字符全部替换为""
            print(content)                         #打印内容

get_novel()

 爬虫小案例——爬取网站小说第7张

 终于来到最后一步了,我们将爬取的内容保存。保存有两种,一种是保存到本地,另一种是保存到数据库中,本次案例我们保存到本地就行了。

import re
import urllib.request
import os


def get_novle():
    html = urllib.request.urlopen('http://www.quanshuwang.com/book/44/44683').read()
    # html = urllib.request.urlopen('http://www.xbiquge.la/7/7931/').read()
    html = html.decode('gbk')
    # <li><a href="http://www.quanshuwang.com/book/44/44683/15379610.html" title="第一章 斗罗大陆,异界唐三(一),共2112字">第一章 斗罗大陆,异界唐三(一)</a></li>
    reg = r'<li><a href="http://t.zoukankan.com/(.*?)" title=".*?">(.*?)</a></li>'
    reg = re.compile(reg)
    urls = re.findall(reg, html)
    # print(urls)
    for url in urls:
        # print(url)
        chapter_url = url[0]
        # print(chapter_url)
        chapter_title = url[1]
        # print(chapter_title)
        chapter_html = urllib.request.urlopen(chapter_url).read()
        chapter_html = chapter_html.decode('gbk')
        chapter_reg = r'</script>&nbsp;&nbsp;&nbsp;&nbsp;.*?<br />(.*?)<script type="text/javascript">'
        chapter_reg = re.compile(chapter_reg, re.S)
        chapter_content = re.findall(chapter_reg, chapter_html)
        # print(chapter_content)
        for content in chapter_content:
            content = content.replace('&nbsp;&nbsp;&nbsp;&nbsp;', '')
            content = content.replace('<br />', '')
            # print(content)
            base_path = '斗罗大陆'
            novel_path = os.path.join(base_path, chapter_title)
            with open(novel_path, 'w') as f:
                f.write(content)
                print('%s下载成功' % chapter_title)

get_novle()

倒数第二行是我们保存文本的代码,open第一个参数需要指定保存文本格式,第二个'w'意思是文件的模式为读写模式。更多文本处理操作可百度“python文本处理操作”,最后一行代码为把章节的内容都写进对应的每个章节中。

爬虫小案例——爬取网站小说第8张

免责声明:文章转载自《爬虫小案例——爬取网站小说》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇爬虫小案例——爬取校花网爬虫基础相关下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HTML 5 中的新元素

HTML 5 中的新元素 结构和语义 文档选项 未显示需要 JavaScript 的文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Elliotte Rusty Harold (elharo@metalab.unc.edu), 副教授, Polytechnic Univer...

从源代码到可执行程序:四个步骤与详解

"hello world"可以说是所有程序员闭着眼睛都能写出来的代码: #include <stdio.h> intmain() { printf("hello world "); return 0; } 编译运行一气呵成。而每当有人问起:从源码到可执行程序有哪些步骤,大多数程序员面对这个问题也能脱口而出:预处理(Prep...

添加可运行的js代码

如何在博客园的文章/随笔中添加可运行的js代码 在博客园浏览大牛们写的文章时,经常会看到在文章中混有一些可运行示例,例如司徒正美的博客中: 带有可运行示例 可以点击“运行代码” 经过一番小小的探索,掌握了这种写博技巧,希望大家也借鉴大牛们的写法,让我们的博客更有表现力~开始~ 一、博客中带有可运行javascript示例 很显然,作...

事件修饰符

categories: vue基础tags: 事件修饰符 按键修饰符 目录 事件修饰符 按键修饰符 事件修饰符 实际上,使用 v-on 有几个好处: 扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和...

python爬虫——词云分析最热门电影《后来的我们》

1 模块库使用说明1.1 requests库requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。1.2 urllib库urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GE...

JavaEE开发之SpringBoot整合MyBatis以及Thymeleaf模板引擎

使用thymeleaf布局 使用thymeleaf布局非常的方便 <footer th:fragment="copy"> &copy;2016 </footer> 在页面任何地方引入: <body> <div th:include="footer :: copy">&l...

最新文章