效果
分析网页
我们可以看到 小说的章节的标题与对应的链接是在<dd></dd>
这个节点中的。
进入一章,
我们可以看到 小说内容是在一个id = "content
的div 容器中。
正则表达式分析
<dd>.*</dd>
获得:
<dd><a href='/55/55945/23396080.html' >第一章 我有三个相宫</a></dd>
过滤出URL和标题
href=..([^>"]*)..>(.*)</a>
其中([^>"]*)
和(.*)
被称为组。
所以有
# 组成完整的URL
url = 'https://www.xbiquge.la/'+g.group(1)
# 获取标题
title = g.group(2)
请求头分析
网址是:https://www.xbiquge.la/0/55945/
’Host'
:一般来说 是从左数第一个// 和/之间的。所以这里是www.xbiquge.la
Cookie
:是在一个分号的后边的数据。
如:
请求头:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Host' :'www.xbiquge.la',
'cookie': 'Hm_lpvt_169609146ffe5972484b0957bd1b46d6=1629598903'
}
完整代码
import requests
import re
link = 'https://www.xbiquge.la/0/55945/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Host' :'www.xbiquge.la',
'cookie': 'Hm_lpvt_169609146ffe5972484b0957bd1b46d6=1629598903'
}
#获取小说链接得到小说目录和对应的URL
def getCatelogs(url):
# 发送请求
req = requests.get(link,headers=headers,allow_redirects=False)
result = []
if req.status_code == 200:
# 获取 HTML 内容
html = req.text
aList =re.findall('<dd>.*</dd>',html)
print(aList)
for a in aList:
g = re.search('href=..([^>"]*)..>(.*)</a>', a)
if g != None:
# 组成完整的URL
url = 'https://www.xbiquge.la/'+g.group(1)
# 获取标题
title = g.group(2)
# 创建一个对象,用于保存标题和URL
chapter = {'title':title,'url':url}
result.append(chapter)
return result
# 根据章节目录,抓取目录对应的URL指定的小说正文页面
def getContent(chapters):
for chapter in chapters:
url = chapter['url']
r = requests.get(url,headers=headers)
r.encoding = 'utf-8' #避免乱码
if r.status_code == 200:
# 打开novel1目录(自己创建即可),以标题命名
f = open('novel/'+chapter['title']+'.txt','a+')
# 将内容提取出来
contents = re.findall(' (.*)<',r.text)
for content in contents:
f.write(content)
f.close()
print(chapter['title'],chapter['url'])
getContent(getCatelogs(link))
可能出现的错误
- 中文乱码,导致无法存进文件:
r.encoding = 'utf-8' #避免乱码
解决。 - 在这里提取到的是相对路径:需要补充。补充的依据情况不同。如这里是
https://www.xbiquge.la/