Python爬虫实例--爬取百度贴吧小说

写在前面本篇文章是我在简书上写的第一篇技术文章,作为一个理科生,能把仅剩的一点文笔拿出来献丑已是不易,希望大家能在指教我的同时给予我一点点鼓励,谢谢。

一.介绍小说吧:顾名思义,是一个小说爱好者的一个聚集地。当然这不是重点,重点是,我们要做的事情便是将小说吧中以帖子连载形式的小说用爬虫给拿下来保存到本地

这个项目是我曾初学python之时做的一个练习项目,现在再重新拿出来作为一篇开篇简作献给大家。阅读本文不需要有很高的python技术或者爬虫知识,只要略微有些python基础就可以,在一些地方,我会尽量给大家详细备注。

二.环境:Python版本:Python2.7

IDE:Pycharm2017

第三方库:

urllib2 模块:urllib2是python的一个获取url(Uniform ResourceLocators,统一资源定址器)的模块。

re模块:Python 的 re模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作

注:以上两个第三方库在Python2.7中自带,因此不用再安装。本案例在使用第三方库函数时会详细介绍用法与功能。

三.案例

1.导入模块

首先创建一个python文件,我这里为main.py(文件名随意取,本案例只使用一个py文件)。本案例中我们使用两个模块urllib2和re,因此首先导入模块.

# -*- coding:utf-8 -*-import urllib2 , re

当然,python2版本需要在开头声明编码格式。除了上述代码的写法以外,也可以这样声明

# coding = utf-8

2.理解思路

我个人在做项目前习惯先分析项目,将步骤一步一步的写出来,然后去慢慢实现。找到目标网页,获取源码

匹配标题,获取标题内容

匹配正文,获取正文内容

去除或者替换杂项

OK,这里思路就是这样的一个四部曲。现在来看一下代码框架。

# -*- coding:utf-8 -*-import urllib2 , re#这是本案例的类class Novel:

baseUrl = '' #这里是你要爬取的小说的链接

#这个方法用来获取网页源码

def getPage(self):

pass

#这个方法用来获取小说标题并保存

def getTitle(self):

pass

#这个方法用来获取小说文本并保存

def getText(self):

pass#这是一个测试模块,执行本文件时的入口if __name__ == '__main__':

n = Novel() #实例化一个类

#print n.getPage() #获取网页源码

n.getTitle()#获取小说题目

n.getText() #获取小说内容

现在开始一步步实现功能:1.找到目标网页,获取网页源码

我在小说吧精品贴里面随便翻了一个帖子,就以这个帖子为案例。

【原创】《贫僧为什么不可以谈恋爱》(古言,长篇)

现在我们需要爬取这个帖子中小说内容,我们需要直接将它的链接地址给baseUrl吗?当然不是

爬取一个帖子上的小说,实际上是去爬取该小说作者的所发表的内容,所以我们还需要进行一步操作,只看楼主

这里写图片描述

我们所需要的链接地址,就是当前这个了

现在就将你得到的链接地址赋值给baseUrl

baseUrl = 'https://tieba.baidu.com/p/4973334088?see_lz=1'

接下来我们来获取这个网页的源码,也就是实现getPage函数:

def getPage(self):

request = urllib2.Request(self.baseUrl)

response = urllib2.urlopen(request).read() return response

本函数现实通过以基本链接baseUrl为参数实现了一个Request请求类的对象request。接着通过urlopen去执行request请求对象打开目标网页。接着通过调用read`函数获取目标网页的源码,并作为函数返回值返回.

返回的网页源码,可在测试代码块中通过调用输出本函数查看。

例:

if __name__ == '__main__':

n = Novel() #实例化一个类

print n.getPage() #获取网页源码2.匹配标题,获取标题内容

首先先亮出我的代码:

def getTitle(self):

html = self.getPage() #调用获取源码

#r防止转义

reg = re.compile(r'

f.write('标题===>>>'+item)

f.close()

注意:代码错行要在行末加``号

例如:

print 'hello \

world'

首先我们在网页源码中寻找包含小说主题部分的源码,可以通过Ctrl+F搜索。查找到

^=……中间包含小说主题<.div>这么一长串的包含小说主题的代码。只要将主题部分全部置换为(.*?)号就可以了。在正则表达式中的含义:

.:匹配任意字符,除了换行符

:匹配前面的子表达式零次或多次

*?:匹配前面的子表达式零次或一次 ():标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用 (.>)*:匹配所有满足条件的表达式并作为结果集返回

re.compile函数是将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果,其中字符串前的r是为了防止转义。

findall(正则表达式,文本) ------将满足的匹配结果以list列表返回

用迭代拿到items中的主题名后在将之写入名为novel.txt的文件中3.匹配正文,获取小说正文内容

匹配正文,与匹配标题相差无几,首先是寻找以楼主发表的第一层为例的代码

段,从中获取可以作为正则匹配的语句。并将正文部分改为(.*?)

如下class="d_post_content j_d_post_content "> (.*?)

实现函数如下:

#这个方法用来获取小说文本并保存

def getText(self):

html = self.getPage()

reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)

',re.S)#匹配换行符

req = re.findall(reg,html) for i in req: print i

f = open('novel.txt','a') #a 追加模式

f.write('\n'+i)

f.close()

如同匹配主题一样的步骤匹配正文,但是并没有结束,因为你会在你的结果中看到这样

杂乱无章

对没错。杂乱无章的正文,中间还有HTML中的,,
等标签

我们接着来处理4.替换或者去出杂项

re模块中有sub函数sub(被替换的内容,替换的内容,需要处理的文本) ---- 返回处理后的文本

现在我们将杂项全部给替换成空字符吧""吧

当然
标签可以直接调用字符串中的replace函数替换成换行符\n

修改后的函数模块如下:

def getText(self):

html = self.getPage()

reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)

',re.S)#匹配换行符

req = re.findall(reg,html) for i in req:

removeA = re.compile('|')

removeIMG = re.compile('')

removeHTTP = re.compile('')

i = re.sub(removeA,"",i)

i = re.sub(removeIMG,"",i)

i = re.sub(removeHTTP,"",i)

i = i.replace('
','\n') print i

f = open('novel.txt','a') #a 追加模式

f.write('\n'+i)

f.close()

注意:记得在打开文件函数中,对文件的操作方式为a追加模式

案例结束:

将完整代码贴给大家:

# -*- coding: utf-8 -*-import urllib2 , re#这是本案例的类class Novel:

baseUrl = 'https://tieba.baidu.com/p/4973334088?see_lz=1' #这里是你要爬取的小说的链接

#这个方法用来获取网页源码

def getPage(self):

request = urllib2.Request(self.baseUrl)

response = urllib2.urlopen(request).read() return response #这个方法用来获取小说标题并保存

def getTitle(self):

html = self.getPage() #调用获取源码

#r防止转义

reg = re.compile(r'

f.write('标题===>>>'+item)

f.close() #这个方法用来获取小说文本并保存

def getText(self):

html = self.getPage()

reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)
',re.S)#匹配换行符

req = re.findall(reg,html) for i in req:

removeA = re.compile('|')

removeIMG = re.compile('')

removeHTTP = re.compile('')

i = re.sub(removeA,"",i)

i = re.sub(removeIMG,"",i)

i = re.sub(removeHTTP,"",i)

i = i.replace('
','\n') print i

f = open('novel.txt','a') #a 追加模式

f.write('\n'+i)

f.close()#这是一个测试代码块,执行本文件时的入口if __name__ == '__main__':

n = Novel() #实例化一个类

#print n.getPage() #获取网页源码

n.getTitle()#获取小说题目

n.getText() #获取小说内容

以后想要获取小说吧哪个小说,只要将baseUrl的地址修改一下就好咯。

python爬取小说基本信息_Python爬虫零基础实例---爬取小说吧小说内容到本地相关推荐

  1. python爬虫可以爬什么山好_学技树-Python爬虫零基础到爬啥都行

    0101课程介绍.mp4 0202认识爬虫.mp4 0303requests库的安装与基本使用.mp4 0404requests库中的User-Agent请求头.mp4 0505requests中的p ...

  2. python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片

    查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...

  3. python爬取bilibili弹幕_python爬虫:bilibili弹幕爬取+词云生成

    如果你懒得看下边的文字,我录了一个完整的教学视频在b站上. 我的B站教学:https://www.bilibili.com/video/av75377135?p=2 工作原理 b站是提供弹幕接口的,所 ...

  4. python 安卓模拟器 抓包_python + 爬虫 + fiddler + 夜神模拟器 爬取app(1)

    抓包 抓包是爬虫里面经常用到的一个词,完整的应该叫做抓取数据请求响应包 ,而Fiddler这款工具就是干这个的 普通https抓包设置 打开Fiddler ------> Options .然后 ...

  5. python秒杀神器苏宁_Python爬虫——实战三:爬取苏宁易购的商品价格

    苏宁易购的商品价格请求URL为 https://pas.suning.com/nspcsale_0_000000000152709847_000000000152709847_0000000000_1 ...

  6. python爬虫需要啥编程基础吗_编程办公Python爬虫零基础到爬啥都行

    Loading... 教程介绍 Python爬虫项目实战全程实录,你想要什么数据能随意的爬,不管抓多少数据几分钟就能爬到你的硬盘,需要会基本的前端技术(HTML.CSS.JAVASCRIPT)和LIN ...

  7. python爬虫酷狗_python爬虫教程:爬取酷狗音乐,零基础小白也能爬取哦

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:python学习教程 ( 想要学习Python?Pyt ...

  8. python爬取晋江小说简介_python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇...

    知识就像碎布,记得"缝一缝",你才能华丽丽地亮相. 1.Beautiful Soup 1.Beautifulsoup 简介 此次实战从网上爬取小说,需要使用到Beautiful S ...

  9. python爬虫教程:爬取酷狗音乐,零基础小白也能爬取哦

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:python学习教程 ( 想要学习Python?Pyt ...

最新文章

  1. Debian手动修改ip地址
  2. Springmvc文件上传(servlet3.0)/下载(ssm)以及坑点
  3. javaweb简单的登录增删改查系统_利用python操作小程序云数据库实现简单的增删改查!
  4. Java ArrayList的实现原理详解
  5. 云在天之南——我的七天七夜(率性苍山洱海)
  6. JavaScript 开闭原则OCP
  7. ip-guard网页浏览放开微信二维码和QQ截图
  8. 浅谈Struts2拦截器的原理与实现
  9. IntelliJ IDEA常用插件及其安装
  10. excel两列数据对比找不同_比Vlookup好用10倍,它才是Excel函数中的No.1
  11. 如何观看高清Youtube视频和高清视频的转帖方法
  12. python(摄氏度和华氏度的转换)
  13. 穷举php,[讨论]穷举攻击
  14. 大数据_湖仓一体:下一代存储解决方案
  15. Xcode免证书导出ipa文件
  16. 关于HDR的学习笔记
  17. 【LeetCode - 362】敲击计数器
  18. 怎么把ubuntu系统从英文修改为中文界面
  19. 【Python】获取roc、auc时候报错:raise ValueError({0} format is not supported.format(y_type))
  20. mtk平台at_mode模式下震动不振原因分析

热门文章

  1. stopwatch类使用
  2. 深入C++面试题总结
  3. 使用Spring Boot Operator部署SpringBoot到K8S
  4. 在Oracle中写出性能优良的SQL语句
  5. VCL组件之TScrollBar
  6. java ab与ab的区别 a|b与a||b的区别 break、continue、return
  7. Vue.js 源码分析(九) 基础篇 生命周期详解
  8. error in static/js/xxx.js from UglifyJs Unpected token: punc() [static/js/xxx.js]
  9. [No00009E]几种常见的命名规则
  10. mysql之count,max,min,sum,avg,celing,floor