昨天在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("爬取完毕!")
附上成功的截图!(爬的时候,等待才是最煎熬的,生怕有点小毛病)