python读取网页输入框数据 python 读取网页_python 提取网页正文

python爬虫——抓取小说

爬虫=Python?

网络爬虫是什么?

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

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

首先要知道什么是URL

URL(uniform resource locator)

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

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

av号10441626

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

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

这里推荐:简明python教程

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

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



python读取网页输入框数据 python 读取网页_python提取网页中p标签中的内容_02

     而我们使用爬取网页,即是对网页源码中的有效信息进行提取或其他操作。例如这次我要完成对小说标题与正文的抓取,将每一章内容以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可以帮我们获得信息,正则表达式则可以帮我们过滤信息,看如下代码:



python读取网页输入框数据 python 读取网页_字符串_03

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



python读取网页输入框数据 python 读取网页_字符串_03

    可以看到file不是str类型,需要通过read读出其中的字节信息。而content不是我们想要的编码格式,该网页的编码格式在源码中可以看到charset=UTF-8(可以使用ctrl+f查找)。 如果直接print(content)会得到乱码,所以需要使用decode进行解码,转换成我们需要的信息print(str)



python读取网页输入框数据 python 读取网页_python 提取网页正文_05

     可以看到已经是我们在网页中看到的源码了,之后进行有效信息的提取,这就需要正则表达式了。简略的说,正则表达式就是创建一个“句式”,进行信息的修改或过 re.search(pattern,str),在str中对pattern进行匹配。如re.search('yue',str),即返回'yue',若找不到'yue',则返回none,例:



python读取网页输入框数据 python 读取网页_python 提取网页正文_06

     而除了对普通字符的匹配,还有特殊字符.  点可代表任意除换行符外的字符,*  星号表示前面的字符可匹配零次,一次或多次,于是,'p.*y'就代表p与y之间可以有任意多的除换行符外的字符。例:



python读取网页输入框数据 python 读取网页_python提取网页中p标签中的内容_07

     另一个有用的命令是re.sub,它可以起到信息替换或删除的作用re.sub(pattern,reb,str,max),即,将str中匹配到的字符串pattern用reb进行替换,替换max次,若不设定参数max,则将符合pattern的字符串全部替换。例:



python读取网页输入框数据 python 读取网页_字符串_08

     所以在将reb设定为空字符''时,即可视为删除操作,现在正式进行有效信息的提取,如果想找出我们需要的信息,就要找到一些只出现了一次的有特色的字符串,观察网页源代码。



python读取网页输入框数据 python 读取网页_python 提取网页正文_09

    使用ctrl+f功能辅助,可以看到

第一章 小二上酒


对应标题信息,而

各自位于正文前后且各自只出现了一次,因此 使用re.search命令 ,'

.*

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


python读取网页输入框数据 python 读取网页_python读取网页输入框数据_10

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

第一章 小二上酒

,要将


也删掉,于是想到使用re.sub命令,

将符合<.>格式的内容替换为''

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

python读取网页输入框数据 python 读取网页_python怎么查看网页编码格式_11

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

第一章 小二上

。所以使用

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


第一章 小二上酒


输出结果如下:

python读取网页输入框数据 python 读取网页_python读取网页输入框数据_12

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



python读取网页输入框数据 python 读取网页_python怎么查看网页编码格式_13

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



python读取网页输入框数据 python 读取网页_python怎么查看网页编码格式_14

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



python读取网页输入框数据 python 读取网页_python 提取网页正文_15

python读取网页输入框数据 python 读取网页_python怎么查看网页编码格式_16

  祝大家都能写出代码!                                                 

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

文稿:苹果汁社团

排版:毛小敏



python读取网页输入框数据 python 读取网页_字符串_17