使用python爬取小说实战
1. 使用requests库
requests:用于发送HTTP请求
import requests
2. 爬取路径
这里定义了要抓取的网页地址
url = "https://www.remxiaos.com/doupocangqiong/14698.html"
3. 发送请求
发送GET请求到指定的URL
resp = requests.get(url)
4. 获取内容
print(resp.text)
5. 编码转义
resp.encoding = "utf-8"
6. 因为我们正常访问是通过浏览器去发送请求,但是我们现在是通过爬取的方式去获取,就需要模拟浏览器去伪装自己
User -Agent:伪装成浏览器请求,以避免被网站屏蔽
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
7. 将请求头加入请求地址中
resp = requests.get(url,headers=headers)
8. 解析HTML内容
from lxml import etree
9. 获取内容里面的信息 如:内容和标题
使用lxml库解析获取的HTML文本
info:提取 < div id=‘content’> 中的所有段落文本
title:提取页面的标题
url:构建下一个要抓取的URL
e = etree.HTML(resp.text)
info = '\n'.join(e.xpath("//div[@id='content']/p/text()"))
title = e.xpath("//h1/text()")[0]
url = f'https://www.remxiaos.com{e.xpath("//div[1]/ul/li[2]/a/@href")[0]}'
‘\n’.join(…):
join 方法将列表中的所有字符串连接成一个单一的字符串。每个字符串之间用 \n(换行符)分隔。
例如,如果提取到的文本列表是 [“第一段文本”, “第二段文本”, “第三段文本”],那么 ‘\n’.join(…) 的结果将是:
“第一段文本\n第二段文本\n第三段文本”
e.xpath(“//h1/text()”) 返回的是一个列表,包含了所有匹配到的 < h1> 标签中的文本内容
使用 [0] 是为了获取这个列表中的第一个元素
10. 保存内容到文件
将标题和内容追加写入到名为“斗破苍穹.txt”的文件中
with open("斗破苍穹.txt","a",encoding="utf-8") as f:
f.write(title+'\n\n'+info+'\n\n')
11. 完整代码展示
import requests
from lxml import etree
url = "https://www.remxiaos.com/doupocangqiong/14698.html"
# 模拟浏览器发送
headers = {
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
while True:
# 发送请求
resp = requests.get(url,headers=headers)
resp.encoding = "utf-8"
# 获取内容
# print(resp.text)
e = etree.HTML(resp.text)
info = '\n'.join(e.xpath("//div[@class='panel-body']/p/text()"))
title = e.xpath("//h1/text()")[0]
url = f'https://www.remxiaos.com{e.xpath("//div[1]/ul/li[2]/a/@href")[0]}'
print(title)
# print(info)
# 保存
with open("斗破苍穹.txt","a",encoding="utf-8") as f:
f.write(title+"\n\n"+info+"\n\n")
标签:实战,xpath,python,text,resp,爬取,url,requests,文本
From: https://blog.csdn.net/m0_58878709/article/details/144318898