为了加深自己对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函数加成一个
#为了自动把每一章内容进行爬虫的,每次爬完之后顺便把下一章的内容爬虫爬下来