Python 爬虫网文实战

爬虫网站为晋江文学城上一部免费观看的网络小说,纯小白练习,欢迎各位大佬指点。

网站为: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("已全部爬取成功")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值