首战:python爬取一本小说

昨天在B站看着视屏终于敲完了一个爬取豆瓣Top250的爬虫,但是感觉自己还是啥也不知道,纸上得来终觉浅,绝知此事要躬行,今天,他来了!正巧今天,明天,后天都没课,准备大干一场,结果一上午两个小时左右吧,竟然写完了!把自己都吓了一跳。就是在最后爬取的时候爬到1000多章就会停滞不前,是因为同一个User-Agent访问太频繁?咱也不知道,但是咱敢问(知道的大佬可以评论区留言指点一下,谢谢啦),所以我在保存的时候将代码稍作改动,一部分一部分保存的,但是本文最后的代码是改动之前的,希望有大佬可以告知正解,下面正片开始!
朋友只给了小说名字:诡秘之主,然后?然后就没然后了,好吧,自己上百度搜,然后找到这本小说(点击可跳转网页)开始分析网页(ctrl+shift+i),这个网页相当友好,目录已经全部显示,不需要翻页什么的,可以直接获取每一章的url,所以先爬取这个页面html,方便分析,定义一个爬取整个网页的函数gethtml(url)

def gethtml(url):
    #head = {
    #    "user-agent": "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/80.0.3987.163 safari/537.36"
        
    #    }
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
        
        }
    request = urllib.request.Request(url,headers = head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    
    return html

然后爬取目录页html1,分析html1,发现所有的章节url均在一个id = “list” 的div中,只要找到这个div然后利用正则表达式匹配标签即可获取章节url,将所有的章节url共同放在一个urllist里面,方便之后访问,再写一个函数geturl()用来返回urllist

def geturl():
    baseurl = "https://www.xsbiquge.com/15_15338/"
    html = gethtml(baseurl)
    #print(html)
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('div',id="list"):
        #print(item)
        item = str(item)
        urllist = re.findall(findurllist,item)
        #print(urllist)
    return urllist

到此我们已经获取了每个章节的链接,下一步分析每个章节网页的结构,找出我们需要的小说内容。随便打开一章(点此跳转我随便打开的一章)调用我们之前的函数gethtml(),将整个网页先保存到html2中,进行分析,小说的正文内容在class="content_read"的div中(不要问我为什么这次不用id=“content”,我会和你说是我当时没注意到吗?当然不会,明明是爬取目录页的时候用了id属性,这一次想用class_)然后在整个网页中找到class="content_read"的div,用正则匹配正文部分,这部分我直接写在主函数里了,代码最后在全部代码里查看吧。
现在我们已经将小说爬到了(章节标题爬取忘了说了,很简单,相信聪明的你看代码就直接懂了,就不再赘述),最后一步当然是保存啦,定义一个函数savedata(data),我没有给保存路径这个参数,默认保存在当前文件夹下

def savedata(data):
    #print('开始保存,请稍后......')
    with open("new_诡秘之主.txt","w") as f:
        for item in data:
            f.write(item)
            f.write("\n"*3)
            f.write(item)

大功告成啦!最后附上全部代码和截图。
对了!如果你基础不太好的话,可以关注文章最后的微信公共号,里面有一些爬虫基础知识,也可以私戳我。

#-*- coding = utf-8 -*-
from bs4 import BeautifulSoup      #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error  #制定url,获取网页数据

#1.爬取网页
#2.逐一解析数据
#3.保存数据


findurllist = re.compile(r'<dd><a href="(.*?)">.*?</a></dd>',re.S)
findcontent = re.compile(r'<div id="content">(.*?)</div>')
findtitle = re.compile(r'<title>(.*?) - 新笔趣阁</title>')
def main():
    urllist = geturl()
    baseurl = "https://www.xsbiquge.com"
    data = []
    #for i in range(0,1412):
    for i in range(0,1412):
        url = baseurl + urllist[i]
        #print(url,end = "\n")
        html = gethtml(url)
        #print(html)
        title = re.findall(findtitle,html)[0]
        #print(title)
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="content_read"):
            item = str(item)
            content = re.findall(findcontent,item)[0]
            content = re.sub('<br/>',"\n",content)
            content = re.sub('\s', ' ',content)
            #print(content)
        data.append(title)
        data.append(content)
        #print("第%d章链接:"%(i+1),end = " ")
        #print(url)
        print("第%d章爬取完毕"%(i+1))
        savedata(data)
    print("保存成功啦!")






def geturl():
    baseurl = "https://www.xsbiquge.com/15_15338/"
    html = gethtml(baseurl)
    #print(html)
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('div',id="list"):
        #print(item)
        item = str(item)
        urllist = re.findall(findurllist,item)
        #print(urllist)
    return urllist


def gethtml(url):
    #head = {
    #    "user-agent": "mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/80.0.3987.163 safari/537.36"
        
    #    }
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0"
        
        }
    request = urllib.request.Request(url,headers = head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    
    return html


def savedata(data):
    #print('开始保存,请稍后......')
    with open("new_诡秘之主.txt","w") as f:
        for item in data:
            f.write(item)
            f.write("\n"*3)
            f.write(item)



if __name__ == "__main__":      #当程序执行时
#调用函数
    print("给爷爬!")
    main()
    print("爬取完毕!")

附上成功的截图!(爬的时候,等待才是最煎熬的,生怕有点小毛病)
加油!
你也可以!
在这里插入图片描述

发布了4 篇原创文章 · 获赞 4 · 访问量 188

猜你喜欢

转载自blog.csdn.net/qq_41523170/article/details/105581165