Python实现网页端小说的爬取
本文主要参考以下文章和文章所对应的代码,由于网站的更新,导致原文给出的代码无法运行,因此本文对原文所给出的代码进行了改进并进行说明。
https://blog.csdn.net/pdcfighting/article/details/106935021
解说
本文爬取的是无限小说网的数据,这里爬取的是菜单栏的武侠小说部分。
网址为:https://www.555x.org/html/wuxia/1/
对于不同的页数,末尾的数不同,因此在URL设置的时候使用{}来标记页数。
- 首先定义一个class类继承object,定义init方法继承self,主函数main继承self。导入需要的库和网址,代码如下所示。
class xiaoshuo(object): def __init__(self): '''爬取小说的网址,这里不同页数对应{}中内容,{}还可以被替换为%d,具体参见python中format函数的用法''' self.url="https://www.555x.org/html/wuxia/{}/" #接下来的代码用于随机产生userAgent ua = UserAgent(verify_ssl=False) for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
- 分析页面并进行网页爬取而在下端使用到网页时使用format函数将{}替换成页数。注意以下代码是在小说这个库函数里面的主函数。要求用户输入爬取起始和终止页,并进行爬取。
def main(self):
startPage = int(input("起始页:"))
endPage = int(input("终止页:"))
for page in range(startPage, endPage + 1):
url = self.url.format(page) #这里括号里面的内容取决于上面self.url中未知数的形式,具体还是format的用法
html = self.get_page(url)
self.parse_page(html)
print("======================第%s页爬取成功!!!!=======================" % page)
- 发送请求,获取响应, 页面回调,代码如下
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
- 接下来就是按页面扒去网页中的文章和下载地址,使得用户点击对应文章的下载网页就能直接到下载页面进行文章的下载。
在对文章进行爬取时首先要进入文章所在的下载页。
也就是点击小说名称进去的那个页面,如下图所示,可以看到该网页的地址是存储在下的a标签中。
因此第一重爬取网页分析为在原网页下进行如下分析获取进入该本小说端的网页。
image_src_list = parse_html.xpath('//span[@class="s2"]/a/@href')
接下来进入该网页后需要爬取本书的名称和下载地址。
书名称所在标签:
因此获取书名的代码如下
b = parse_html1.xpath('//div[@id="info"]/h1/text()')[0].strip()
下载网页所在标签
获取下载网页网址代码:
dwom = parse_html1.xpath('//div[@class="readbtn"]
数据请求所有代码如下所示:
def parse_page(self, html):
parse_html = etree.HTML(html)
#这一个网页是获取的进入具体小说页面的网址
image_src_list = parse_html.xpath('//span[@class="s2"]/a/@href')
# b=parse_html('//span[@class="s2"]/a/@title')
for i in image_src_list:
html1 = self.get_page(i) # 第二个发生请求
parse_html1 = etree.HTML(html1)
# print(parse_html1)
#在小说页面通过标题中内容获取书名 具体网站信息 <div id="info"><h1>小说名字<h1> 这里使用text()获取括号外面内容
b = parse_html1.xpath('//div[@id="info"]/h1/text()')[0].strip()
dwom = parse_html1.xpath('//div[@class="readbtn"]/a[@class="addbookcase"]/@href')
read = '''《%s》 下 载 链 接 : %s ''' % (b, dwom)
print(read)
最终代码
修改后代码如下:
import requests
from lxml import etree
from fake_useragent import UserAgent
class xiaoshuo(object):
def __init__(self):
'''爬取小说的网址,这里不同页数对应{}中内容,{}还可以被替换为%d,具体参见python中format函数的用法'''
self.url="https://www.555x.org/html/wuxia/{}/"
#接下来的代码用于随机产生userAgent
ua = UserAgent(verify_ssl=False)
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
'''发送请求 获取响应'''
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
'''解析数据'''
def parse_page(self, html):
parse_html = etree.HTML(html)
#这一个网页是获取的进入具体小说页面的网址
image_src_list = parse_html.xpath('//span[@class="s2"]/a/@href')
# b=parse_html('//span[@class="s2"]/a/@title')
for i in image_src_list:
html1 = self.get_page(i) # 第二个发生请求
parse_html1 = etree.HTML(html1)
# print(parse_html1)
#在小说页面通过标题中内容获取书名 具体网站信息 <div id="info"><h1>小说名字<h1> 这里使用text()获取括号外面内容
b = parse_html1.xpath('//div[@id="info"]/h1/text()')[0].strip()
dwom = parse_html1.xpath('//div[@class="readbtn"]/a[@class="addbookcase"]/@href')
read = '''《%s》 下 载 链 接 : %s ''' % (b, dwom)
print(read)
def main(self):
startPage = int(input("起始页:"))
endPage = int(input("终止页:"))
for page in range(startPage, endPage + 1):
url = self.url.format(page) #这里括号里面的内容取决于上面self.url中未知数的形式,具体还是format的用法
html = self.get_page(url)
self.parse_page(html)
print("======================第%s页爬取成功!!!!=======================" % page)
if __name__ == '__main__':
imageSpider = xiaoshuo()
imageSpider.main()