1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > python 提取网页正文_小苹果来科普 | 关于python爬虫的那些事儿

python 提取网页正文_小苹果来科普 | 关于python爬虫的那些事儿

时间:2019-01-13 04:10:47

相关推荐

python 提取网页正文_小苹果来科普 | 关于python爬虫的那些事儿

python爬虫——抓取小说

爬虫=Python?

网络爬虫是什么?

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

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

首先要知道什么是URL

URL(uniformresourcelocator)

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

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

av号10441626

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

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

这里推荐:简明python教程

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

下面进入我们今天的正题,我们平时使用浏览器,包含这样一个过程:浏览器输入URL->浏览器向网站所在服务器发送一个request->服务器接收request之后进行处理和解析->返回对应response->response包含页面源代码等内容->浏览器对其进行解析呈现网页。

而我们使用爬取网页,即是对网页源码中的有效信息进行提取或其他操作。例如这次我要完成对小说标题与正文的抓取,将每一章内容以txt形式保存。以《雪中悍刀行》为例,在百度中搜索该小说,打开该小说“笔趣阁”链接

https://www.biquge.info/2_2309/

推测该URL中2_2309为小说名字的“标签”,打开该小说第一章https://www.biquge.info/2_2309/1157033.html

推测该URL中1157033为小说章节的“标签”,将1157033改为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功能辅助,可以看到

第一章 小二上酒

对应标题信息,而 与 各自位于正文前后且各自只出现了一次,因此使用re.search命令,'

.*

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

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

第一章 小二上酒

,要将

也删掉,于是想到使用re.sub命令,将符合<.>格式的内容替换为'',但是如果直接使用此命令,结果如下

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

第一章 小二上

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

第一章 小二上酒

, 输出结果如下:

在对title使用re.sub命令前,先使用了title=title.group(),是因为re.sub的操作对象是字符串,而title经过转换后才是字符串格式,使用同样的方法可以提取正文,这里值得一提的是,因为.不能指代换行符,而这一大段正文字符中是包含换行符的。所以对re.search进行模式修正re.search(pattern,str,re.S)使pattern中的.可以匹配换行符,使用re.sub命令,用'\n'代替与换行符有关的乱码,即可得到我们需要的有效信息了。代码与运行结果如下:

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

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

祝大家都能写出代码!

上海大学通信学院新闻中心

文稿:苹果汁社团

排版:毛小敏

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。