刚学习Python,参考网上一篇爬取小说的教程,我自己以逐浪网站(http://book.zhulang.com)为例学习爬取小说编程。
思路:
(1) 首先学习BeautifulSoup,了解网页结构,了解SOUP之后的网页TAG架构,可以通过find_all()查找指定TAG
(2) 先爬取某一小说其中一个章节的正文
(3)其次将某一小说章节汇总的页面中每章的URL汇总为一个LIST
(4)重复2步骤,写入文件,形成小说全文
源代码如下:
# -*- coding: UTF-8 -*-
from urllib import request
from bs4 import BeautifulSoup
chapter_num=0 #初始化全局变量章节数量为0
chapter_url_list=[] #初始化全局变量每章地址列表为空
def write_chapter_content(zw1): #写每章正文
j=0
while zw1[j].cite==None: # p标签后的cite标签之后就是本章正文结束之处
f.write(zw1[j].get_text().strip()) #去空格
j=j+1
def write_chapter_name(zw2): #写每章标题
f.write(' ') # 每章标题前添加几个空格
f.write(zw2.title.get_text()[0:13]) # 0--13是每章标题
f.write('\n\n') # 标题后添加两个换行
def get_chapter_num(zw3): #获得章节数量
zw3_1 = zw3.find_all('ul')[-1]
zw3_2 = zw3_1.find_all('li')
global chapter_num #声明一个全局变量时不能同时赋值
chapter_num=len(zw3_2) #将章节数量赋值给chapter_num
def get_chapter_url_list(zw3): #获得每章地址,形成一个LIST
j=chapter_num
global chapter_url_list
zw3_1 = zw3.find_all('ul')[-1]
zw3_2 = zw3_1.find_all('li')
while j>0:
chapter_url_list.append(str(zw3_2[chapter_num-j])[13:55]) #13-55是每章URL地址
j=j-1
if __name__=='__main__':
print('请输入小说章节首地址:')
url_chapter=input()
#url_chapter='http://book.zhulang.com/508878/' #赶尸秘闻全章地址 用于搜索每章开始地址
#url='http://book.zhulang.com/508878/203911.html' #赶尸秘闻第一章地址
f=open('xiaoshuo.txt','a',encoding='UTF-8')
req=request.Request(url_chapter)
html=request.urlopen(req).read().decode('UTF-8')
#print(html)
sou=BeautifulSoup(html,'html.parser')
get_chapter_num(sou) #得到章节数量,赋值给chapter_num
get_chapter_url_list(sou) #得到章节URL列表,赋值给chapter_url_list
print(chapter_num)
print(chapter_url_list)
j=chapter_num
while j>0:
chapter_url=chapter_url_list[chapter_num-j]
chapter_req = request.Request(chapter_url)
chapter_html = request.urlopen(chapter_req).read().decode('UTF-8')
chapter_sou = BeautifulSoup(chapter_html, 'html.parser')
write_chapter_name(chapter_sou)
chapter_zw = chapter_sou.find_all('p')
write_chapter_content(chapter_zw)
f.write('\n\n')
j=j-1
#zw=sou.find_all('p')
#write_chapter_name(sou) #写每章章名
#write_chapter_content(zw) #写每章内容
#f.write('\n\n')
对于某些小说后面章节设置VIP权限的,程序会异常退出,但非VIP章节已经写入文件了。
刚刚学习PYTHON,某些代码不够简练。个人认为爬取小说的难点在于如何确定每章正文开始和结束标识,以及自动寻找每章URL地址,需要根据每个网站的排版特点自行摸索。