爬虫网站为晋江文学城上一部免费观看的网络小说,纯小白练习,欢迎各位大佬指点。
网站为:https://www.jjwxc.net/onebook.php?novelid=4372146&chapterid={page}
爬取流程为:
首先,导入接下来需要用到的包(我一般都是先写下面代码,用到什么包就在上面写)
import requests
import re
from bs4 import BeautifulSoup
import time
接着,设置爬取的网页url,找到请求标头:右键检查→网络→网页搜索框回车→名称里随即点击一个→拉到最下面找到user-agent复制粘贴,放进爬取模板:
url = "https://www.jjwxc.net/onebook.php?novelid=4372146&chapterid=1"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}
req = requests.get(url, headers=header) # Get方式获取网页数据
然后导出爬取的文本内容。用response.text导出乱码,后来查询后使用response.content.deocde()成功导出文本。网页信息编码一般在元素最上方head里可找到:
html = req.content.decode('gb18030') #导出文本内容,信息编码为gb18030
接着,用BeautifulSoup解析网页内容,可以看到从下图红框那行开始对应正文
于是用BeautifulSoup中的find函数匹配特定的tag,再用.text的方式提取文本内容。
bes = BeautifulSoup(html,"lxml")
texts = bes.find("div", class_= "novelbody" ) #匹配特定的tag
texts = texts.text #提取文本内容
输出提取到的文本发现,开头有很多与正文无关的内容,如:
因此,需要尽量删除一下这些无关的文本:
1.用正则表达式将一个或多个空格替换为一个换行符。
tips:\s
表示匹配任何空白字符,包括空格、换行符等等。“ +
”
表示“匹配一次或多次”。所以可得 \s+
表示匹配任意多个空白字符。
2.strip去除与正文无关的字。
这里我只去除开头前面无关的字,尾部的无关文本因为字数无固定,怕删除到正文,因此就没太管了文本最后面无关部分。
texts=re.sub(r'\s+', '\n',texts) #将多个空格转为一个换行符
dy1=texts[0:80] #网页开头无关信息 (每个网页都不同
texts=texts.strip(dy1) #去除网页开头无关信息
至此,已经成功爬取一页了,接下来要实现多页爬取:
首先,从目录中看到一共有58章,因此设置爬取次数为58。再观察网页链接,可以发现每一章的链接都是“https://www.jjwxc.net/onebook.php?novelid=4372146&chapterid=”+“页数”,
所以可以用循环生成不同页数的url(请求标头和爬取方式跟上面一样不变):
page_count = 58
for page in range(1, page_count + 1):
url = f"https://www.jjwxc.net/onebook.php?novelid=4372146&chapterid={page}"
#抓取
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}
req = requests.get(url, headers=header) # Get方式获取网页数据
爬取多页的时候,到中间有些章节被锁住了会出现报错,因此使用try去跳过锁住的章节。
try:
html = req.content.decode('gb18030') #导出文本内容,信息编码为gb18030
bes = BeautifulSoup(html,"lxml")
texts = bes.find("div", class_= "novelbody" ) #bes匹配正文片段
texts = texts.text #转为text格式
texts=re.sub(r'\s+', '\n',texts) #将多个空格转为一个换行符
dy2=texts[0:80] #网页开头无关信息 (每个网页都不同
texts=texts.strip(dy2) #去除网页开头无关信息
print(f"第{page}章爬取成功")
except:
print(f"第{page}章被锁定,无法抓取") #跳过晋江和谐
最后储存内容:
with open(f"C:/Users/Desktop/人生输家{page}.txt","w") as file:
for line in texts:
file.write(line)
完整代码如下:
import requests
import re
from bs4 import BeautifulSoup
import time
page_count = 58
# 循环抓取每一页的数据
for page in range(1, page_count + 1):
url = f"https://www.jjwxc.net/onebook.php?novelid=4372146&chapterid={page}"
#抓取
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'}
req = requests.get(url, headers=header) # Get方式获取网页数据
#解析
try:
html = req.content.decode('gb18030') #导出文本内容,信息编码为gb18030
bes = BeautifulSoup(html,"lxml")
texts = bes.find("div", class_= "novelbody" ) #bes匹配正文片段
texts = texts.text #转为text格式
texts=re.sub(r'\s+', '\n',texts) #将多个空格转为一个换行符
dy2=texts[0:80] #网页开头无关信息 (每个网页都不同
texts=texts.strip(dy2) #去除网页开头无关信息
#存储
with open(f"C:/Users/zimei-L/Desktop/my self/人生输家{page}.txt","w") as file:
for line in texts:
file.write(line)
print(f"第{page}章爬取成功")
except:
print(f"第{page}章被锁定,无法抓取") #跳过晋江和谐
time.sleep(1)
print("已全部爬取成功")