提供《雪中悍刀行》相关粉丝资讯

爬虫小实战

2018-09-24 07:15:28

爬虫=Python?

网络爬虫是什么?

不好意思,这些网上查的到的东西我不愿意打字啊,请移步百度百科……

使用python抓取网页信息少不了一些有关html的知识

首先要知道什么是URL

URL(uniform resource locator)

例如 就是一个URL,http:是协议部分,而www.baidu.com是我们要访问的网址

具体请移步b站观看一个两分钟左右的讲解视频

使用pthon抓取网页信息还少不了pthon的基础知识

有些同学在网上找到一些视频教程来看,对于有编程基础的同学来说,倒不如直接拿一本书翻一翻会更快

这里推荐:简明python教程

对于让这门语言快速上手来说,是很合适的

下面进入我们今天的正题

我们平时使用浏览器,包含这样一个过程

浏览器输入URL->浏览器向网站所在服务器发送一个request->服务器接收request之后进行处理和解析->返回对应response->response包含页面源代码等内容->浏览器对其进行解析呈现网页

而我们使用爬取网页,即是对网页源码中的有效信息进行提取或其他操作

例如这次我要完成对小说标题与正文的抓取,将每一章内容以txt形式保存

以《雪中悍刀行》为例,在百度中搜索该小说,打开该小说“笔趣阁”链接

推测该URL中2_2309为小说名字的“标签”

打开该小说第一章

推测该URL中为小说章节的“标签”,将改为1157034,果然跳转至第二章

右击,点击查看网页源代码,即查看第一章对应的网页源码

可以看到里面包含有第一章的标题,正文,还有许多乱码

所以问题来了

获得信息,提取有效信息,储存

我们需要完成这三步操作

我们需要用到python自带的两个库

urllib.request #url相关命令,对url进行操作

re  #正则表达式相关命令,对字符串进行操作

urlib.request可以帮我们获得信息,正则表达式则可以帮我们过滤信息

看如下代码

使用type()可以观察数据类型

可以看到file不是str类型,需要通过read读出其中的字节信息

而content不是我们想要的编码格式,该网页的编码格式在源码中可以看到charset=UTF-8(可以使用ctrl+f查找)

如果直接print(content)会得到乱码

所以需要使用decode进行解码,转换成我们需要的信息

print(str)

可以看到已经是我们在网页中看到的源码了

之后进行有效信息的提取,这就需要正则表达式了

简略的说,正则表达式就是创建一个“句式”,进行信息的修改或过滤

re.search(pattern,str),在str中对pattern进行匹配

如re.search('yue',str),即返回'yue',若找不到'yue',则返回none

而除了对普通字符的匹配,还有特殊字符

.   点可代表任意除换行符外的字符

*  星号表示前面的字符可匹配零次,一次或多次

'p.*y'就代表p与y之间可以有任意多的除换行符外的字符

另一个有用的命令是re.sub

它可以起到信息替换或删除的作用

re.sub(pattern,reb,str,max)

即,将str中匹配到的字符串pattern用reb进行替换,替换max次,若不设定参数max,则将符合pattern的字符串全部替换

所以在将reb设定为空字符''时,即可视为删除操作

现在正式进行有效信息的提取

如果想找出我们需要的信息,就要找到一些只出现了一次的有特色的字符串

观察网页源代码

使用ctrl+f功能辅助,可以看到<h1>第一章 小二上酒</h1>

对应标题信息

而<div id="content">与<div class="bottem">各自位于正文前后且各自只出现了一次

因此使用re.search命令

'<h1>.*</h1>'可对str中的内容进行第一次过滤,之后用re.sub命令将除汉字外的信息删除,获得标题

('第一章 小二上酒'只是第一章特有,每一章都不相同,所以使用.*代替)

第一次过滤后得到

<h1>第一章 小二上酒</h1>

要将<h1>与</h1>也删掉

于是想到使用re.sub命令,将符合<.*>格式的内容替换为''

但是如果直接使用此命令,结果如下

输出结果为空

因为python默认的匹配模式为懒惰模式,会为.匹配尽可能多的字符,因此它的识别是这样子的

<h1>第一章 小二上酒</h1>

所以使用<.*?>,将模式修正为懒惰模式,会为.匹配尽可能少的字符,因此它的识别是这样子的

<h1>第一章 小二上酒</h1>

输出结果如下

在对title使用re.sub命令前,先使用了

title=title.group()

是因为re.sub的操作对象是字符串,而title经过转换后才是字符串格式

使用同样的方法可以提取正文

这里值得一提的是,因为.不能指代换行符,而这一大段正文字符中是包含换行符的

所以对re.search进行模式修正

re.search(pattern,str,re.S) 使pattern中的.可以匹配换行符

使用re.sub命令

用'\n'代替与换行符有关的乱码,即可得到我们需要的有效信息了

代码与运行结果如下:

当把url中的改为1157034时,出现的就是第二章内容啦!

之后的存储操作与循环操作非本次代码重点,故不进行讲解,请自行阅读源码查找有关内容理解(主要是我懒)

希望大家能成功运行代码

推荐《雪中悍刀行》这本书哦

另外发现写推文比直接给人讲累多了,想直接用文字把东西讲明白很难,以后会考虑录视频……

祝大家中秋节快乐!不过也是假期最后一天了哈哈

关注苹果汁,更多干货正在装车

哎,,,其实也怕太干了吃不动啊,不知道有多少人看到这里,kuso……