爬虫步骤回顾:

根据前两篇文章,我们理解了爬虫的各个过程,简单回顾下:

爬虫第一步:根据URL获取网页的HTML信息;

Python3中可以通过urllib.request或者requests进行网页爬取;(前两篇文章中我们已经见识到了)

urllib库是Python内置的,无需我们额外安装;

requests库是第三方库,需要我们自己安装;(在上一节中我们是通过PyCharm安装的)或参照《requests库中文教程》

最常用的就是get方法:requests.get();

该方法必须设置的一个参数就是url,目的是告诉get请求,我们的目标是谁,需要谁的信息;

URL可能是我们事先已知的或者是通过网页中抓取的链接获取的,针对这些URL进行过第一步之后,就要对HTML信息进行解析了;

爬虫第二步:解析HTML信息;

以爬取小说举例,提取正文的方法很多:正则表达式、Xpath、Beautiful Soup等;(Xpath 我们在学习Selenium的过程中曾经学习过 用处多多啊)

我们使用简单易用的Beautiful Soup:

仍然通过PyCharm来安装,当然也可以使用命令行进行初始化;具体过程可以参照之前的文章;

有关bs的使用参考《Beautiful Soup 中文文档》;

爬虫第三步:将需要的信息进行输出保存;

可已经爬取到的小说内容,写入txt文件中,便于查阅;

网络小说爬取:

某一篇内容:

我们尝试爬取《元尊》某一章节的内容;

我们通过requests获取html内容,编码如下:(有关header如何获取请参考《第一个python爬虫示例——爬取天气信息》)

#!/usr/bin/python
# -*- coding:utf-8 -*-import requests #用来抓取网页的html源码
import random   #取随机数
import time #时间相关操作from bs4 import BeautifulSoup #用于代替正则式 取源码中相应标签中的内容def get_content(url, data = None):#设置headers是为了模拟浏览器访问 否则的话可能会被拒绝 可通过浏览器获取header = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Connection': 'keep-alive','Accept-Encoding': 'br, gzip, deflate','Accept-Language':'zh-cn','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15'}#设置一个超时时间 取随机数 是为了防止网站被认定为爬虫timeout = random.choice(range(80,180))while True:try:req = requests.get(url=url, headers = header, timeout = timeout)breakexcept Exception as e:print('3' + e)time.sleep(random.choice(range(8, 15)))return req.textif __name__ == '__main__':url = 'http://www.biqukan.com/0_790/21725523.html'html = get_content(url)print('天尊:' + html)

运行代码,结果如下:

获取html内容很简单,但是其中有很多我们不关注的信息,我们只需要的是我们感兴趣的内容:把正文从html标签中提取出来;

编码如下:

def get_data(html):bf = BeautifulSoup(html,'html.parser')texts = bf.find_all('div',{'class':'showtxt'})print(texts)if __name__ == '__main__':url = 'http://www.biqukan.com/0_790/21725523.html'html = get_content(url)get_data(html)

注意:用PyCharm来运行脚本可能会只显示一小部分的内容,这是因为Pycharm认为返回数据太多了,省略显示了;

但是获取到的数据 是div标签下的内容,我们还需要出掉多余的标签、空格或者是换行;

我们修改代码,取第一个标签的文本内容,这样做会过滤掉标签:

def get_data(html):bf = BeautifulSoup(html,'html.parser')texts = bf.find_all('div',{'class':'showtxt','id':'content'})print(texts[0].text)

运行结果如下:

我们继续将连续的空白格替换为换行回车:

def get_data(html):bf = BeautifulSoup(html,'html.parser')texts = bf.find_all('div',{'class':'showtxt','id':'content'})text = texts[0].text.replace('\xa0'*7,'\n\n')#\xa0表示连续的空白格print(text)

这里如果替换连续的8个会将小说的每段的第一个文字截掉,所以这里我只替换了7个:

……

这样我们就匹配到了所有的正文内容;

整部小说内容:

如果是下载整部小说的话,就需要获取每个章节的链接:小说目录;

其中具体的某一章节则是href属性值与当前目录url的拼接;

我们先获取相应div下边的所有内容:

def get_data(html):bf = BeautifulSoup(html,'html.parser')texts = bf.find_all('div',{'class':'listmain'})text = texts[0]print(text)if __name__ == '__main__':url = 'http://www.biqukan.com/0_790/'html = get_content(url)get_data(html)

我们修改代码,继续获取div标签下的所有a标签,并打印a标签之间的字符串,以及a标签的href属性;

完整的示例程序:

最终我们整合编码,一个完整的爬虫如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-import requests #用来抓取网页的html源码
import random   #取随机数
from bs4 import BeautifulSoup #用于代替正则式 取源码中相应标签中的内容
import sys
import time #时间相关操作class downloader(object):def __init__(self):self.server = 'http://www.biqukan.com'self.target = 'http://www.biqukan.com/0_790/'self.names = [] #章节名self.urls = []  #章节链接self.nums = 0   #章节数"""获取html文档内容"""def get_content(self,url):# 设置headers是为了模拟浏览器访问 否则的话可能会被拒绝 可通过浏览器获取header = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Connection': 'keep-alive','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-cn','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15'}# 设置一个超时时间 取随机数 是为了防止网站被认定为爬虫timeout = random.choice(range(80, 180))while True:try:req = requests.get(url=url, headers=header, timeout=timeout)breakexcept Exception as e:print('3',e)time.sleep(random.choice(range(8, 15)))return req.text"""获取下载的章节目录"""def get_download_catalogue(self,url):html = self.get_content(url)bf = BeautifulSoup(html, 'html.parser')texts = bf.find_all('div', {'class': 'listmain'})div = texts[0]a_s = div.find_all('a')self.nums = len(a_s[12:17])   #我们需要去掉重复的最新章节列表 只为演示 我们只取 不重复的前5章for each in a_s[12:17]:self.names.append(each.string)self.urls.append(self.server + each.get('href'))"""获取下载的具体章节"""def get_download_content(self, url):html = self.get_content(url)bf = BeautifulSoup(html, 'html.parser')texts = bf.find_all('div', {'class': 'showtxt', 'id': 'content'})text = texts[0].text.replace('\xa0' * 7, '\n\n')  # \xa0表示连续的空白格return text"""将文章写入文件"""def writer(self,name,path,text):write_flag = Truewith open(path, 'a', encoding='utf-8') as f:f.write(name + '\n')f.writelines(text)f.write('\n\n')if __name__ == '__main__':dl = downloader()dl.get_download_catalogue(dl.target)for i in range(dl.nums):dl.writer(dl.names[i], '天尊.txt', dl.get_download_content(dl.urls[i]))print("已下载:%.2f%%"% float((i+1)/dl.nums * 100) + '\r')print('下载完成!')

控制台打印数据进程:

小说内容爬取示例:

至此,我们就得到了整篇小说的内容。

参考链接:

《Python3网络爬虫快速入门实战解析》

Python3——网络小说爬虫相关推荐

  1. Android 本地网络小说爬虫,基于 jsoup 及 xpath

    CrawlerForReader 项目地址:smuyyh/CrawlerForReader  简介:Android 本地网络小说爬虫,基于 jsoup 及 xpath 更多:作者   提 Bug 标签 ...

  2. Android 本地网络小说爬虫,基于 jsoup 及 xpath,Android入门教程

    项目地址:smuyyh/CrawlerForReader  简介:Android 本地网络小说爬虫,基于 jsoup 及 xpath 更多:作者   提 Bug 标签: Android 本地网络小说爬 ...

  3. 聚焦千千小说:一篇幽默风趣的网络小说爬虫教程

    聚焦千千小说:一篇幽默风趣的网络小说爬虫教程 大家好!欢迎来到我的博客.今天,我要给你们带来一份超有趣.简单易懂的爬虫教程.我们的目标是爬取千千小说网站上的小说章节内容(而且能够实现章节的顺序排放哦) ...

  4. Python 使用requests实现网络小说爬虫案例(一)

    一.简介 网络爬虫,也叫网络蜘蛛(Web Spider).它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接.比如:www.baidu.com,它就是一个URL ...

  5. Android 本地网络小说爬虫,基于 jsoup 及 xpath,都是精髓

    支持书源 /** 所有书源 */ public static final SparseArray SOURCES = new SparseArray() { { put(SourceID.LIEWEN ...

  6. python 网络小说爬取3

    /* 网络小说:[secret] */ #coding:utf-8 import re import sys from bs4 import BeautifulSoup import urllib.r ...

  7. Python3 网络爬虫:下载小说的正确姿势

    1 前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我 ...

  8. Python3网络爬虫,简单爬取网络小说并下载

    相信我们常常会有想看的小说,但是不能下载,导致无法在没网的环境下观看..下面将解一下如何用python3爬取网络小说. 本文主要是用于学习,希望大家支持正版. 首先我们需要两个包,我们分别是reque ...

  9. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

最新文章

  1. 银行使用oracle做查询,Oracle EBS ERP银行信息查询视图
  2. 实验室蒋田仔研究员:脑网络组图谱近10年研究详解【附PPT】
  3. Android百度地图开发 百度地图得到当前位置
  4. mdp文件-Chapter1-MINIM.mdp
  5. Linux系统文件名字体不同的颜色都代表什么
  6. 位置指纹法的实现(KNN)
  7. 【 CodeForces - 799A 】Carrot Cakes(模拟,细节,有坑)
  8. HDU 5741 Helter Skelter(构造法)
  9. 基于python----图像的表示和可视化
  10. redis复制原理和应用
  11. 美国计算机科学奥林匹克竞赛试题,中学信息奥林匹克竞赛试题精选.doc
  12. Django Step by Step 2010版(基于Django 1.1.1) 第五讲
  13. c语言行列坐标是先行后j,C语言课后习题参考答案
  14. 华硕笔记本电池0%充不进电_华硕笔记本电池0%充不进电
  15. MDM移动设备管理概述
  16. Linux 的常用系统及网络命令
  17. 选择使用Yarn来做Docker的调度引擎
  18. 017循环的方式定义数组、018循环for each、019方法练习、020实参和形参、021方法的返回值
  19. MySQL索引和锁实现原理及优化
  20. Sigmoid 与 Softmax 的区别

热门文章

  1. 深源恒际:AI-TPA加速医疗票据理赔
  2. ACM技巧——c++笔记
  3. Unity 只读(ReadOnly)Attribute
  4. 面对当今的研究生教育——只有无奈
  5. [旅游精选]世界十大城市小吃
  6. java多态造型,Java基础学习:面向对象之多态
  7. 使用memcache 心得和注意事项
  8. Android12 LCD圆角改直角
  9. myeclipse git 上下箭头表示什么
  10. Python Matplotlib中坐标轴标题中各种特殊符号的显示 转义字符全集,编写数学表达式