python实战项目——爬小说数据

本文介绍了如何使用Python进行网页爬虫,包括使用requests库发送HTTP请求,设置User-Agent,解析HTML内容,特别是利用lxml库处理HTML,以及通过XPath定位特定内容。作者通过实例演示了如何爬取小说网站的章节内容,并实现自动抓取下一章功能。
摘要由CSDN通过智能技术生成

         为了加深自己对python语言编程的学习,这里学习b站课上的项目实战课程,并自己总结提高

        首先爬数据的原理个人理解如下:用户登陆软件,用自己的身份向目标服务器、站点(各种网站吧)发送请求,之后目标就会返回相应的内容(以html语言格式展现),爬虫就相当于摘取其中的部分内容保存

        用python进行爬数据,首先要用到的是request数据包,名字听起来就像是发送请求用的,同时在爬数据过程中还需要对接收到的html数据进行分析,就用到了lxml库

#模块requests
import requests
from lxml import etree

        首先是要找到爬取的目标网站,如小说网站内容:

#发送请求给谁URL地址
url = 'https://www.luoxia123.com/douluodalu/448589.html'

       之后就开始爬数据的流程了,首先需要注意,为了让计算机冒充我们人进行目标访问请求,我们需要赋予服务器我们人的身份,这一点可以从网页的开发者工具中的网络里面,点开第一个,就能在右边找对应的user-agent,把这个作为计算机冒充人的名字,同时在里面也可以提取到,用户是用get还是post作为获取目标网站数据的方式,这两点决定了计算机后续爬数据的方式和名义

headers = {
    'User_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
}#用字典进行操作
resp = requests.get(url,headers=headers)#get选择用什么方式发送请求,并记录响应信息

        这时候resp保存的就是相应get的返回值了这个可以通过查询了解到,这时候打印resp(要在后面加.text,不然resp返回的是访问成功与否),想显示或者数据的内容,发现是乱码(应该是二进制吧),所以为了在后续保存使用,这里再次对内容重新编码,最后显示的就是包含div,p等html格式语言的内容,后面用到的rtree函数库,就是处理这种html语言的

 resp.encoding = 'utf=8'
    #响应信息显示
    #print(resp.text)#text以字符串的形式显示
    #print(resp)

        使用etree函数的html函数,将原始的heml格式转换成它能处理的样子吧(大概),后面就只用到xpath helper插件,通过精确定义找到我们需要使用的html块,最后加一个test(),就能得到每一个符合定义的块内容

 e=etree.HTML(resp.text)
    #print(e)
    info = '  \n'.join(e.xpath('//div[@class="panel-body"]/p/text()'))#因为用的模块就是xpath,每一段就是列表,用string本来可以消除
    title = e.xpath('//h1/text()')[0]#h1里面的文本,有text可以显示出来

        注意。这里用到join函数的原因是,小说每一章有很多段落,用//div……定义的块有好多,在python中就会储存成列表的形式,为了后面方便保存,就用join函数储存成一个字符串,title因为只有一个,所以提取就完事了

        最后为了循环提取下一章的内容,需要在提取好这一章后,改变访问的网址,由于每一章网址都不一样,不可能从网页上方获取,所以找到小说里面的“下一章”,用开发者工具中的元素找到对应的html块定义,利用我们已经储存在python中的“e”,用定义块找到下一章的网址,改变最初的url即可

 url = e.xpath('//div[@class="m-page"]/a[3]/@href')[0]

        当然,xpath返回html块文本内容的也是列表,为毛这里不写text()也行

        至于保存就不多说了,小心覆盖之类的就好

#如何发送
#模块requests
import requests
from lxml import etree
#发送请求给谁URL地址
url = 'https://www.luoxia123.com/douluodalu/448589.html'

#伪装自己
headers = {
    'User_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
}#用字典进行操作
chapters = input("请输入需要爬取的章节数目")

with open('斗罗大陆.txt', 'w', encoding='UTF-8') as f:
    f.write("小说来啦????\n")
for i in range(int(chapters)):
    #发送请求
    resp = requests.get(url,headers=headers)#get选择用什么方式发送请求,并记录响应信息
    #出现一系列乱码
    #设置编码
    resp.encoding = 'utf=8'
    #响应信息显示
    #print(resp.text)#text以字符串的形式显示
    #print(resp)

    e=etree.HTML(resp.text)
    #print(e)
    info = '  \n'.join(e.xpath('//div[@class="panel-body"]/p/text()'))#因为用的模块就是xpath,每一段就是列表,用string本来可以消除
    title = e.xpath('//h1/text()')[0]#h1里面的文本,有text可以显示出来

    #获取下一张的url地址
    url = e.xpath('//div[@class="m-page"]/a[3]/@href')[0]

    #print(info)
    #print(title)
    #保存相关的信息
    #注意最后一章的下一章可能会出现错误,有的要加一个判断语句
    with open('斗罗大陆.txt','a',encoding='UTF-8') as f:
        f.write(title+'\n\n'+info+'\n\n')#这个是list,你要选择性加入,或者适用’‘.join函数加成一个

#为了自动把每一章内容进行爬虫的,每次爬完之后顺便把下一章的内容爬虫爬下来

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值