(二)Python爬虫笔记--爬取网站小说

刚学习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地址,需要根据每个网站的排版特点自行摸索。

猜你喜欢

转载自blog.csdn.net/qq_42044484/article/details/80316126