老猿利用Python爬虫知识写个简单应用自己查*敏*感*词*说最新更新
优采云 发布时间: 2021-05-10 21:17
老猿利用Python爬虫知识写个简单应用自己查*敏*感*词*说最新更新
一、简介
这个*敏*感*词*假期,我开车回到家乡,而这个国家并没有在家里安装宽带,所以我使用手机热点来访问Internet。这次我回去,觉得4G信号不如以前。通过百度找到小说的最新更新并打开小说网站的过程非常缓慢。有时,要花费很多网页才能找到可以正常打开的最新更新。为了避免懒惰,老袁决定使用Python采集器知识编写一个简单的应用程序,以查*敏*感*词*说的最新更新并以最快的速度访问网站。他花了一些时间研究相关消息。经过将近一天的研究和写作,终于完成了,让我们介绍整个过程。
二、关于相关的访问请求和响应消息2. 1、百度搜索请求
当我们在百度网页的搜索框中进行搜索时,提交的网址请求如下:
https://www.baidu.com/s?wd=搜索词&pn=10&rn=50
请求的网址是,带有三个参数:
2. 2、百度返回搜索结果
确定百度返回的搜索结果的方法有很多,老袁认为最简单的方法如下:
以小说“ Qing Ping”为例,查看返回的记录之一:
青萍最新章节,青萍免费阅读 - 大神小说网
整个搜索返回的结果在h3的标记中,返回的搜索结果对应的url在a的标记中,并且特定的URL由href指定。此处返回的网址实际上是百度重定向地址。您可以通过打开url访问相应的网站,并通过返回响应消息来获取真实的网站 URL。
2. 3、 novel 网站关于最新的更新显示和html消息格式
根据对旧猿的分析,约有30%的小说网站显示了与以下内容相似的最新更新章节:
首先,有类似的提示词,例如“最新章节”或“最新更新”或“最新更新”。提示词后是一个链接,显示最新章节的章节号和章节名称,相应的消息类似于以下内容:
最新章节:第729章 就是给你们看看的
此消息的特征是:
“最新章节”的文字信息与小说最新章节的链接位于同一父标记中。此外,应注意,返回的章节网址不是绝对地址,而是小说网站的相对地址。
老袁对小说最新章节的搜索是基于上述格式的,因此,实际上,该程序最终获得的小说网站仅占整个搜索结果的30%左右,但对于阅读小说。
三、实施思路和代码3. 1、根据网址获取网站名称
def getHostName(url):
httpPost = url[10:]
hostName = url[:10]+httpPost.split('/')[0]
return hostName
3. 2、根据百度的返回搜索结果地址,打开网站以获取新颖信息
基于2.的第3部分介绍的小说网站的返回内容,让我们根据百度返回的搜索结果的URL打开相应的小说网站,并计算从开始算起的时间请求返回响应的结果:
def getNoteInfo(url):
"""
打开指定小说网页URL获取最新章节信息
url:百度搜索结果指定的搜索匹配记录的url
返回该URL对应的章节ID、打开耗时、网站真正URL、网站主机名、章节相对url、章节名
"""
head = mkhead()
start = time.time_ns()
req = urllib.request.Request(url=url, headers=head)
try:
resp = urllib.request.urlopen(req,timeout=2)
#根据响应头获取真正的网页URL对应的网站名
hostName = getHostName(resp.url)
text = resp.read()
#网页编码有2种:utf-8和GBK
pageText = text.decode('utf-8')
except UnicodeDecodeError:
pageText = text.decode('GBK')
except Exception as e:
errInf = f"打开网站 {url} 失败,异常原因:\n{e}\n" + '\n' + traceback.format_exc() + '\n'
logPag(errInf, False)
return None
#最新章节的HTML报文类似: '<p>最新章节:第672章 天之关梁'
end = time.time_ns()
soup = BeautifulSoup(pageText, 'lxml')
# 根据最新章节的提示信息搜索最新章节
result = soup.find_all(string=re.compile(r'最新更新[::]|最新章节[::]|最近更新[::]|最新[::]'))
found = False
for rec in result:
recP = rec.parent
pa = recP.a
matchs = re.match(r'(?:最新更新|最新章节|最近更新|最新)[::]第(.+)章(.+)', recP.text)
if not matchs:return None
groups = matchs.groups()
if matchs and pa is not None:
found = True
chapter = toInt(groups[0]) #章节序号
chapterName = groups[1] #章节名
chaperUrl = pa.attrs['href'] #章节相对URL
break
if not found:
return None
cost = (end - start) / 1000000 #网页打开耗时计算
return (chapter,cost,resp.url,hostName,chaperUrl,chapterName)
</p>
注意:由于网站的访问响应条件不同,因此在打开网页时需要设置超时,以免访问速度慢网站从而延迟总体访问时间。
3. 3、获取小说网页的绝对URL地址
在返回的信息中合并相对URL和网站名称,以将网页的绝对URL地址拼凑在一起:
def getChapterUrl(noteInf):
chapter, cost, url, hostName, chaperUrl, chapterName = noteInf
if chaperUrl.strip().startswith('http'):return chaperUrl
elif chaperUrl.strip().startswith('/'):return hostName.strip()+chaperUrl.strip()
else:return hostName.strip()+'/'+chaperUrl.strip()
3. 4、计算排序权重
根据从新颖网页中搜索到的信息计算排名权重,以确保最新的章节排名第一,而访问速度最快的相同章节网站排名第一。
def noteWeight(n):
#入参n为小说信息元组: chapter, cost, url, hostName, chaperUrl, chapterName
ch,co = n[:2]
w = ch * 100000 + min(99999, 100000 / co)
return w
3. 5、执行百度搜索并分析搜索结果。参观小说网站最新更新
根据搜索词在百度上进行搜索,并以最新的章节和访问速度最快的前5个网站 url进行输出:
def BDSearchUsingChrome(inputword,maxCount=150):
"""
输出相关搜索结果中具有最新章节且访问速度最快的前5个网站url
:param word: 搜索关键词,如小说名、小说名+作者名等
:param maxCount: 最多处理的搜索记录数
:return: None
"""
#百度请求url类似:https://www.baidu.com/s?wd=青萍&pn=10&rn=50
rn = 50 #每页50条记录
#构建请求头模拟本机谷歌浏览器访问百度网页
head = mkheadByHostForChrome('baidu.com')
word = urllib.parse.quote(inputword)
urlPagePre = 'https://www.baidu.com/s?wd='+word+'&rn=50&'
pageCount = int(0.999+maxCount/rn)
validNoteInf = []
seq = 0
logPag("开始执行搜索...")
for page in range(pageCount):
pn = rn*page
urlPage = urlPagePre+str(pn)
pageReq = urllib.request.Request(url=urlPage, headers=head)
pageResp = urllib.request.urlopen(pageReq,timeout=2)
pageText = pageResp.read().decode()
if pageResp.status == 200:
soup = BeautifulSoup(pageText,'lxml')
links = soup.select('h3.t a[href^="http://www.baidu.com/link?url="]')
for l in links:
noteInf = getNoteInfo(l.attrs['href'])
seq += 1
if noteInf is None:
#print(seq,'、',l.attrs['href'],None)
logPag(f"{seq}、{l.attrs['href']}:查找最新章节失败,忽略",True)
else:
logPag(f"{seq}、返回小说信息: {noteInf}",True)
#chapter,cost,url,hostName,chaperUrl,chapterName = noteInf
validNoteInf.append(noteInf)
validNoteInf.sort(key=noteWeight,reverse=True)
print(f"小说: {inputword} 最新更新访问最快的5个网站是:")
for l in validNoteInf[:5]:#输出相关搜索结果中具有最新章节且访问速度最快的前5个网站url
print(f"{validNoteInf.index(l)+1}、第{l[0]}章 {l[-1]} {getChapterUrl(l)} ,网页打开耗时 {l[1]} 毫秒")
input("按回车键退出!")
四、搜索案例
以在月关岛进行的清平搜索为例,执行搜索的语句为:
BDSearchUsingChrome('青萍月关',150)
执行结果:
小说: 青萍月关 最新更新访问最快的5个网站是:
1、第688章 东边日出西边雨 http://www.huaxiaci.com/41620/37631250.html ,网页打开耗时 262.0 毫秒
2、第688章 东边日出西边雨 http://www.huaxiaci.com/41620/37631250.html ,网页打开耗时 278.0 毫秒
3、第688章 东边日出西边雨 http://www.huaxiaci.com/41620/37631250.html ,网页打开耗时 345.5 毫秒
4、第688章 东边日出西边雨 https://www.24kwx.com/book/9/9202/8889236.html ,网页打开耗时 774.0 毫秒
5、第688章 东边日出西边雨 https://www.27kk.net/9526/2658932.html ,网页打开耗时 800.5 毫秒
按回车键退出!
五、摘要
本文介绍了使用Python搜索指定小说的最新更新章节和最快访问权限的实现思路和关键应用代码网站,实现了对小说的最新更新章节的自动搜索,并获得了最快的访问权限网站。由于上述实现已经获得了最新章节的链接,因此,如果您有一点改进,可以直接下载最新章节以在本地观看。
写博客并不容易,请支持: