由于妙笔阁小说网中大多数小说章节数过大,基本上为几千章。所以挑选后选取了章节数为100多章的小说《我是至尊》。
下面详细描述爬取过程:
1.构建请求头:
user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
self.headers = {'User-Agent':user_agent}
2.利用request请求url,并将相应内容转换为html:
response = requests.get("http://www.mbige.com/info/27-27761/")
response.encoding = response.apparent_encoding
html = lxml.html.fromstring(response.text)
3.目前已经得到了小说章节列表页面的html
对章节进行检查,找到html中每章节的url
利用xpath解析html,得到所有章节的url列表:
urllst = html.xpath('//ul//li/a/@href')
4.访问每一个章节的url,利用xpath解析其html,得到每章节的内容:
title = ''.join(html.xpath('//td[@valign = "top"]/div[@align="center"]/h1/text()'))
part = ''.join(html.xpath('//div[@align="center"]/h2/text()'))
infro = ''.join(html.xpath('//div[@class="border_b"]/text()'))
context = '\n'.join([x.strip() for x in html.xpath('//div[@id="content"]/p/text()') if x])
5.完整代码:
import requests
import lxml.html
class myspider():
def __init__(self):
#构建请求头
user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
self.headers = {'User-Agent':user_agent}
def gethtml(self,url):
#利用request请求url,并将相应内容转换为html
try:
response = requests.get(url)
except:
response = None
pass
else:
response.encoding = 'gb18030'
finally:
html = lxml.html.fromstring(response.text)
return html
def getpage(self,url):
#利用xpath解析html,得到所有章节的url列表
htmlpage = self.gethtml(url);
print(htmlpage)
urllst = htmlpage.xpath('//ul//li/a/@href')
return urllst
def getcontext(self,url):
contextlst = self.getpage(url) #获取所有章节的url列表
num = 0
with open('E:/我是至尊.txt', 'a+' ,encoding = 'utf8') as f :
#爬取的每章节内容写入到E盘我是至尊.txt
for i in contextlst[14:]:
i= 'http://www.mbige.com' + i #由于获取到的章节url不完整,进行补全
html = self.gethtml(i)
title = ''.join(html.xpath('//td[@valign = "top"]/div[@align="center"]/h1/text()'))
part = ''.join(html.xpath('//div[@align="center"]/h2/text()'))
infro = ''.join(html.xpath('//div[@class="border_b"]/text()'))
context = '\n'.join([x.strip() for x in html.xpath('//div[@id="content"]/p/text()') if x])
f.write(str(title)+'\n'+str(part)+'\n'+str(infro)+'\n'+str(context)+'\n'+'\n')
num+=1
print("写入完成"+"第"+str(num)+"页")
if __name__ == '__main__':
sp=myspider()
url1='http://www.mbige.com/info/27-27761/'
sp.getcontext(url1)
6.爬取完成后得到的我是至尊.txt部分内容如下:
到这里就爬完一部小说啦~~~~
如果对爬取全站的小说信息感兴趣,可以参考我的上一篇文章《利用Python爬取妙笔阁小说网站的小说信息并保存为txt和csv格式》,欢迎阅读。