博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 爬虫十六式 - 第八式:实例解析-全书网
阅读量:7246 次
发布时间:2019-06-29

本文共 3392 字,大约阅读时间需要 11 分钟。

实例解析- 全书网

学习一时爽,一直学习一直爽

  Hello,大家好,我是Connor,一个从无到有的技术小白。前面我们就算是把所有的网页访问与网页解析的方法给大家讲完了。为了帮助大家更好的使用这些方法。我们专门抽出一期,来做一个例子,看看在实际应用中我们是如何使用前面的这些知识的。

  好吧,那我们快点开始。本期,我们以全书网为例,来爬取全书网的小说下面我们就开始进行分析吧,下面是全书网的网址:

1. 初步爬取

  不管爬取什么网站,我们第一步要做的都是来分析这个网站。所以我们先来打开全书网,分析一下这个网站:

1.1 分析全书网

1.1.1 分析目标网址

  我们想要从网上获取信息,就要知道这个信息的地址,我们把它叫做目标网址,所以我们先要分析目标网址:

  可以看到首页有许多小说,但是这些地址并不是我们的目标网址,因为我们想要的是具体的小说的章节内容,所以我们需要再次寻找。我们以《盗墓笔记》的第一章为目标,我们继续来寻找目标网址:

  这个页面也不是我们的目标网址,但是它里面包含有目标网址,即 《盗墓笔记》第一章的详情页地址在其中,我们可以点击第一章来查看我们的目标网址:

  当我们点击了第一章的连接后,我们又一次进入了一个新的页面,这个页面有了具体的小说内容。所以这一页使我们需要的内容了。也就是说这一页的网址是我们真正需要的目标网址。

1.1.2 分析网页源代码

  我们现在找到了我们需要的目标网址了。但是还有一个问题。我们所能提取的内容一定是在网页源代码里拥有的内容。因为我们访问网页所返回的响应就是网页源代码。这篇小说的正文在网页源代码中吗?我们再来看一下这个页面的网页源代码:

  仔细一看网页源代码,里面有我们想要的内容。那我们现在就可以开始进行网页访问,然后获取这章小说的内容了。

1.1.3 分析所需内容

  我们通过分析网页源代码,认定我们可以通过直接访问来获取我们所需要的内容。但是我们访问所返回的网页源代码中全部都是我们所需要的内容吗?很明显不是这样的。因此我们还需要进一步分析所需内容,来为我们访问后的提取做准备。

  通过分析,我们发现我们所有需要的内容全部都在 <div class="mainContenr" id="content"> 这个标签下,所以确定了所需内容,我们就可以开始进行爬取了。

1.2 爬取全书网

1.2.1 访问目标网址

  好,我们把该分析的东西都分析了,现在就是来使用我们学过的知识来获取我们想要的内容的时候了。首先我们来访问我们分析出的目标网址:

import requestsurl = 'http://www.quanshuwang.com/book/9/9055/9674264.html'response = requests.get(url).textprint(response)复制代码

运行结果:

  看运行结果看得出,我们已经访问成功了,获取到了这个网址的网页源代码。但是我们发现里面有好多乱码,我们不认识的东西。如果你还记得我的第三式 requests 的话,你应该有印象我说过网页编码问题。那么我们来改一下代码,解决这个问题:

import requestsurl = 'http://www.quanshuwang.com/book/9/9055/9674264.html'response = requests.get(url)response.encoding = 'gbk'print(response.text)复制代码

运行结果:

  乱码问题一下子就解决了。那我们现在获取到了网页源代码,下面就是要提取所需内容了,我们前面分析过了,下面我们来进行提取:

import requestsimport reurl = 'http://www.quanshuwang.com/book/9/9055/9674264.html'response = requests.get(url)response.encoding = 'gbk'result = re.search(r'(  )(.*?)(

运行结果:

  一下子就把我们想要的东西提取出来了对吧?但是你会发现里面还是有些乱七八糟的东西并不属于文章的正文。我们不想要这些东西,只想要文章正文怎么办?这个时候就需要用到我们前面学习的使用各种提取方法来提取网页内容了。我们以正则为例,来看看如何提取:

import requestsimport reurl = 'http://www.quanshuwang.com/book/9/9055/9674264.html'response = requests.get(url)response.encoding = 'gbk'result = re.search(r'(  )(.*?)(

  我们来看看运行结果如何?

 &emps;可以看到,我们把所有的无用的字符都过滤掉了。这样就获取了我们想要的小说。获取到了我们想要的小说,下面我们来把获取到的数据来保存到txt文件中。

我们运行下面的程序:

import requestsimport reurl = 'http://www.quanshuwang.com/book/9/9055/9674264.html'response = requests.get(url)response.encoding = 'gbk'result = re.search(r'(  )(.*?)(

执行完成之后,我们可以看一下保存的txt内容:

这样就保存好了。到这里我们就完成了对全书网的简单爬取。

2. 进一步爬取

  我们可以简单地进行某一章的小说的爬取。但是如果我们想要爬取整部小说呢?难道我们需要把每一章的url都写出来然后进行逐一爬取吗?这太麻烦了。而且并不实用。那下面我们来看看如何完整的爬取一部小说的完整章节。

2.1 获取每一篇小说的网址

  你是否还记得我们前面看到的一个页面?那一个网页上有整个小说的所有章节的目录。我们可以通过这里来获取所有章节的url。

  那我们再来分析这个网页来获取所有章节的url。首先我们来分析一下网页的源代码:

  查看网页源代码,我们可以看到所有的章节连接都在网页源代码中。我们同样可以通过直接访问来进行提取:

import requestsimport reurl = 'http://www.quanshuwang.com/book/9/9055'response = requests.get(url)response.encoding = 'gbk'result = re.findall(r'
  • (.*?)
  • ', response.text, re.S)print(result)复制代码

      通过这段代码,我们可以获取所有的网页网址和章节标题。我们可以看下运行结果:

      所有的章节地址和章节标题我们就都获取出来了。我们可以通过遍历列表来进行每一章的内容获取。这一部分只需要重复前面的内容即可。就不再多做解释了。

      当然,由于程序是单线程的,之一的遍历列表来获取文章的方式相对来说太慢了。并没有什么实用价值。我们可以通过线程池的方法来避免阻塞,从而实现加速的效果。多线程和线程池我们也会在之后的系列为大家进行讲解。

      例子举得都是最简单的例子。这个网站并没有任何的反爬措施,所以作为初级的入门非常好用。但是在实际的生产中。网站会有各种各样的反爬措施。我们也会在该系列后续的文章中谈到如何突破反爬。

    下期预告

      现在我们都会简单的爬取了。但是有些网站上获取不到我们想要的数据,那我们还有方式来获取我们想要的数据吗?当然有,那就是selenium来进行爬取了。敬请期待下一期: Python 爬虫十六式 - 第九式:selenium - 轻松获取数据!

      好了,这就是我们这期的内容了,举了一个非常简单的例子。不知道你今天是否对前面的内容有了一个更高层次的认识了呢?我是 Connor 一个从无到有的技术小白,愿你在学习的道路上能够坚持不懈,砥砺前行!

    系列文章

    转载于:https://juejin.im/post/5c734b43e51d457f143646ce

    你可能感兴趣的文章
    EventBus源码分析
    查看>>
    JS中原型和原型链深入理解
    查看>>
    我能不能在不看别人怎么实现promise的情况下,自己实现一个promise?
    查看>>
    短视频“秒播”那点事
    查看>>
    Kotlin实现的半圆形进度条
    查看>>
    尝试自己动手用react来写一个分页组件
    查看>>
    记录一下,使用vue进行微信开发遇到的问题
    查看>>
    实现属于自己的TensorFlow(一) - 计算图与前向传播
    查看>>
    2018年第五周-centos7安装zabbix-server(源码安装方式)
    查看>>
    【268天】我爱刷题系列(27)
    查看>>
    Redux 源码解析系列(一) -- Redux的实现思想
    查看>>
    深入探讨安卓UI线程与子线程交互5大设计
    查看>>
    如何使用Flexbox和CSS Grid,实现高效布局
    查看>>
    第2章 Kotlin 语法基础
    查看>>
    js作用域
    查看>>
    JS常用方法函数
    查看>>
    使用vue-axios和vue-resource解决vue中调用网易云接口跨域的问题
    查看>>
    background
    查看>>
    面向对象的特性:多态性
    查看>>
    React动画
    查看>>