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