利用Python 3 爬取网络小说(二、搜索功能初步实现)

需要说明一下,写这篇文章的初衷并不是真的想要看小说,而是出于练手的目的,仅供大家学习交流之用,如果真的想看小说,经济允许的情况下还是建议大家支持正版

小说网站:https://www.x4399.com/(笔趣阁)
编辑器:Notepad++Adobe Dreamweaver CS6
浏览器:Chrome
标准库:urllib( HTTP 请求库)
第三方库:

  • pyquery(网页解析库,jQuery的Python版本)
  • requests(可以理解为urllib的升级版,处理URL资源特别方便)

首先导入模块,创建常量存放文件储存位置

from pyquery import PyQuery as pq    #导入网页解析模块
from urllib import parse    #导入解码模块
import  requests
PATH = r'C:\Users\Administrator\Desktop\\'    #文件存放位置,我设为了桌面

想要实现搜索功能,我们就需要先了解小说网站搜索的原理,首先打开笔趣阁首页,找到这个搜索栏,右键点击检查


这里就可以看到表单信息了,注意这里没有设置 method 属性,这说明该表单是通过默认的 get 类型传输信息的, 传输的信息中,value 是我们输入的小说或作者名, name 是 searchkey ,信息提交到 https://www.x4399.com/modules/article/search.php
在这里插入图片描述
了解了这些我们就可以尝试着去获取搜索页的内容了

name = input('请输入小说或作者名:\n')
r = requests.get('https://www.x4399.com/modules/article/search.php', params={'searchkey':name})
with open(PATH + '1.html', 'r',encoding='utf-8') as f:
    f.write(r.text)

在这里插入图片描述
理论上回车后它就会获取到搜索页的内容并在桌面新建一个html文件写入
在这里插入图片描述
文件成功生成了,但是打开一看,这神马鬼东西,咋全是乱码呢?
在这里插入图片描述
其实出现这个问题的原因是 requests 默认是以 UTF-8 编码来处理数据的,但是对于这类小说网站来说,中文内容是最多的, UTF-8 格式每个汉字要占3个字节,但是 GBK 只需要2个字节,也就是说以 UTF-8 存储两个汉字的空间换成GBK就可以存三个汉字, UTF-8 远没有 GBK 来的合适,所以很多网站都会将网页为设置为 GBK 格式,我们只要将 requests 的编码格式设置为 GBK 就好了,我们将代码做出如下更改

name = input('请输入小说或作者名:\n')
r = requests.get('https://www.x4399.com/modules/article/search.php', params={'searchkey':name})
r.encoding = 'gbk'
with open(PATH + '1.html', 'r',encoding='gbk') as f:
    f.write(r.text)

现在我们再来试一下:
在这里插入图片描述
可以看到现在页面是正常显示的状态,但是新的问题又出现了:查找不到内容,输入的伏天氏明明刚才还在主页上看到推荐的,为什么就搜索不到呢?是网站的问题吗?我们试着通过网站首页来搜索一下
.在这里插入图片描述
搜索页是可以正常打开的,所以问题出在我们这里,到底是为什么呢?
在这里插入图片描述
其实根源在于虽然我们将页面编码设置为了 GBK ,但是我们输入的小说名上传时用的仍然是 GBK 格式,所以我们需要将输入的小说名做转码处理,代码修改如下:

name = input('请输入小说或作者名:\n')
r = requests.get('https://www.x4399.com/modules/article/search.php', params={'searchkey':name.encode('gbk')})
r.encoding = 'gbk'
with open(PATH + '1.html', 'w',encoding='gbk') as f:
    f.write(r.text)

运行看一下效果:
在这里插入图片描述
好了,初步的搜索已经实现了,下篇实现目录的获取

本篇完整代码:

from pyquery import PyQuery as pq    #导入网页解析模块
from urllib import parse    #导入解码模块
import  requests
PATH = r'C:\Users\Administrator\Desktop\\'

name = input('请输入小说或作者名:\n')
r = requests.get('https://www.x4399.com/modules/article/search.php', params={'searchkey':name.encode('gbk')})
r.encoding = 'gbk'
with open(PATH + '1.html', 'w', encoding='gbk') as f:
    f.write(r.text)

猜你喜欢

转载自blog.csdn.net/sh15774842048/article/details/88993693