首战:python爬取一本小说

Fawn ·
更新时间:2024-11-14
· 551 次阅读

昨天在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'
.*?
',re.S) findcontent = re.compile(r'
(.*?)
') findtitle = re.compile(r'(.*?) - 新笔趣阁') 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('
',"\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("爬取完毕!")

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


作者:Qian途



小说 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号