背景
前日在某小说网站上看到了一部心仪的小说,但因环境限制,我决定把它爬取到本地,随时随地都可以看(嘿嘿嘿)
实现
获取一个章节内容
我们首先需要用request库获取网址相关内容,获取代码如下
import requests
url = 'https://www.uuks5.com/book/801979/434711557.html' # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text
获取到网页内容后,就到解析网页了,通过lxml库进行解析
首先需要转换格式
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
通过观察该网站的元素可以发现文章的标题部分在id="mlfy_main_text"的div下的h元素的text部分
同样可以发现文章正文部分在class="read-content"的div下的p元素的text部分
因此通过以上这些特征进行解析
title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()') #标题部分内容
data = selector.xpath('//div[@class="read-content"]/p/text()') #正文部分内容
运行后title的结果
运行后data的结果
因此我们可以发现,如此下来输出的均为list形式,但是我们需要的是list里的元素
所以,现在进行获取
for i in data:
print(i)
输出后可以发现,已经全部为文本了
现在我们已经可以将一个章节的内容获取下来了。
获取全部内容
通过观察可以发现,切换不同章节是的网址是无顺序的,因此我们首先需要获取每一章节所对应的网址
在这本书的目录网址中我们可以发现每一章的网址在class="lazyrender"的li下的a元素中,其herf就是网址
所以我们故伎重演,再次将其获取出来,代码如下
import requests
from lxml import etree
url = 'https://www.uuks5.com/book/801979/' # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
data = selector.xpath('//li[@class="lazyrender"]/a/@href')
for i in data:
print(i)
运行后输出结果如下
与图片中的herf值一模一样
将获取网址的代码写成一个函数,放到之前写的获取单个章节代码之前,类似与这样
但是,我们可以发现获取到的网址是不全的,缺少了主域名,所以我们稍作一下修改,将上一章节的url改一下(注意不是函数里的)
然后就循环获取,除了保存的代码如下
import requests
from lxml import etree
def get_title_url():
url = 'https://www.uuks5.com/book/801979/' # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
data = selector.xpath('//li[@class="lazyrender"]/a/@href')
return data
for j in get_title_url():
url = 'https://www.uuks5.com' + j # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()')
data = selector.xpath('//div[@class="read-content"]/p/text()')
tltle = title[0]
输出后的结果类似与:
标题
正文
标题
正文
标题
正文
············
保存到文件
Python自带文件读写功能,我们只需要把以下代码加上即可(空格缩进凭个人喜好,自行调整)
with open('example.txt', 'a') as file:
file.write(tltle)
for i in data:
with open('example.txt', 'a') as file:
file.write("\n " + i)
with open('example.txt', 'a') as file:
file.write("\n\n")
最后可以在循环里加上 (非必要)
print(title)
这样我们就可以知道实时的爬取进度
全部代码
import requests
from lxml import etree
def get_title_url():
url = 'https://www.uuks5.com/book/801979/' # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
data = selector.xpath('//li[@class="lazyrender"]/a/@href')
return data
for j in get_title_url():
url = 'https://www.uuks5.com' + j # 输入我们的url
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
} # 设置我们的headers
get = requests.get(url, headers=headers).text # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get) # 将源码转换为xpath可以识别的TML格式
title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()')
data = selector.xpath('//div[@class="read-content"]/p/text()')
tltle = title[0]
with open('example.txt', 'a') as file:
file.write(tltle)
for i in data:
with open('example.txt', 'a') as file:
file.write("\n " + i)
with open('example.txt', 'a') as file:
file.write("\n\n")
print(tltle)
效果图