鱼C论坛

 找回密码
 立即注册
查看: 1682|回复: 11

[已解决]喜马拉雅爬虫问题

[复制链接]
发表于 2023-8-22 17:02:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
<div class="text _nO">
        <a title="《败家子儿》 郭德纲 于谦" href="/sound/45982355">
                <span class="title _nO">《败家子儿》 郭德纲 于谦</span>
        </a>
</div>

不好意思不能发图片,网页代码如上

我想把“《败家子儿》 郭德纲 于谦”  它取出来


为什么我下面的爬虫语句的结果是个空值
曲目=解析.xpath('//div[@class="text _nO"]//span/text()')

这个是网的地址3个w.喜马拉雅的拼音.com/album/9723091
最佳答案
2023-8-22 22:07:55
nvli123 发表于 2023-8-22 17:11
那个网址是准确的   老师   可还是取不出来  你可以在本地试试

因为你要获取的数据是动态渲染出来的,我直接给你代码吧:
import re
import json

import requests

url = 'https://www.ximalaya.com/album/9723091'
headers = {
    'User-Agent': 'Mozilla/5.0'
}

resp = requests.get(url, headers=headers)
data_str = re.search(r'window\.__INITIAL_STATE__ = ({.*?});', resp.text).group(1)
data = json.loads(data_str)

for i in data['store']['AlbumDetailTrackListV2']['tracksInfo']['tracks']:
    print(i['title'])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-22 17:03:00 | 显示全部楼层
你的代码中的XPath表达式有一点问题。你需要修改一下XPath表达式,以正确地提取目标文本。

这是正确的XPath表达式:
//div[@class="text _nO"]/a/span/text()

在这个表达式中,我们首先选择 div 元素,它的 class 属性值为 text _nO 。然后我们选择 div 元素下的 a 元素,再选择 a 元素下的 span 元素。最后,我们使用 text() 函数提取 span 元素的文本内容。

你可以尝试使用以下代码来提取目标文本:
import requests
from lxml import html

url = 'https://www.ximalaya.com/album/9723091'
response = requests.get(url)
content = response.content
parser = html.fromstring(content)

tracks = parser.xpath('//div[@class="text _nO"]/a/span/text()')
print(tracks)

这样,你应该能够成功地提取出目标文本了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 17:03:29 | 显示全部楼层
根据给出的网页代码和爬虫语句,可以看出你想要提取的内容位于<span>标签内。但是要注意,你提供的代码中的链接地址被部分省略了,并且存在一些乱码。假设正确的链接地址是www.ximalaya.com/album/9723091,那么你可以使用以下代码来提取目标内容:
import requests
from lxml import etree

url = "http://www.ximalaya.com/album/9723091"  # 假设为正确的链接地址
response = requests.get(url)
html = response.text
selector = etree.HTML(html)

title = selector.xpath('//div[@class="text _nO"]//span/text()')
print(title)

这段代码将会输出['《败家子儿》 郭德纲 于谦'],即所需的标题内容。请注意,确认链接地址是否正确并且确保导入了所需的库(requests和lxml)。如有其他问题,请提供更多详细信息以便我能够更好地帮助你。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 17:03:37 | 显示全部楼层
害  没有发网址的权限  大家将就用下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 17:05:23 | 显示全部楼层
nvli123 发表于 2023-8-22 17:03
害  没有发网址的权限  大家将就用下

你有没有发现,span标签前面还有一个a标签?
试试这个:
曲目=解析.xpath('//div[@class="text _nO"]//a/span/text()')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 17:11:21 | 显示全部楼层
isdkz 发表于 2023-8-22 17:03
你的代码中的XPath表达式有一点问题。你需要修改一下XPath表达式,以正确地提取目标文本。

这是正确的XP ...

那个网址是准确的   老师   可还是取不出来  你可以在本地试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 17:20:05 | 显示全部楼层
陶远航 发表于 2023-8-22 17:03
根据给出的网页代码和爬虫语句,可以看出你想要提取的内容位于标签内。但是要注意,你提供的代码中的链接地 ...

是正确的链接,你可以本地试试
这段代码  执行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-22 17:25:10 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-22 17:05
你有没有发现,span标签前面还有一个a标签?
试试这个:
曲目=解析.xpath('//div[@class="text _nO"]//a/s ...

前面确实还有一个a,但span前面是//,应该是可以省略a的
给出的新的语句,仍然执行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-22 22:07:55 | 显示全部楼层    本楼为最佳答案   
nvli123 发表于 2023-8-22 17:11
那个网址是准确的   老师   可还是取不出来  你可以在本地试试

因为你要获取的数据是动态渲染出来的,我直接给你代码吧:
import re
import json

import requests

url = 'https://www.ximalaya.com/album/9723091'
headers = {
    'User-Agent': 'Mozilla/5.0'
}

resp = requests.get(url, headers=headers)
data_str = re.search(r'window\.__INITIAL_STATE__ = ({.*?});', resp.text).group(1)
data = json.loads(data_str)

for i in data['store']['AlbumDetailTrackListV2']['tracksInfo']['tracks']:
    print(i['title'])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-23 11:28:45 | 显示全部楼层
isdkz 发表于 2023-8-22 22:07
因为你要获取的数据是动态渲染出来的,我直接给你代码吧:

牛批呀   又增加新知识点了——动态渲染   感谢老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-23 11:36:02 | 显示全部楼层
nvli123 发表于 2023-8-23 11:28
牛批呀   又增加新知识点了——动态渲染   感谢老师

不客气,你可以自己去了解一下动态渲染,动态渲染就是不是通过后端构造html源代码,而是通过前端js改变DOM树渲染上去的,这种情况的数据一般蕴含在js代码中,或者由 js 向后端接口发起的请求响应中,

你想找到相应的数据可以打开开发者工具的网络中搜索你想要的数据,就可以找得到你想要的数据是在哪一个请求中,当然前提是你想要的数据在传输过程中没有进行编码或加密,否则你通过原始字符串是搜不出来的,还得你研究一下前端的js代码

我就说这么多,因为我很忙,所以没有时间给你详细讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-24 15:21:56 | 显示全部楼层
isdkz 发表于 2023-8-23 11:36
不客气,你可以自己去了解一下动态渲染,动态渲染就是不是通过后端构造html源代码,而是通过前端js改变DO ...

太厉害了  我好好理解下  谢谢老师&#10084;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 17:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表