鱼C论坛

 找回密码
 立即注册
查看: 2653|回复: 9

[已解决]爬虫:从网页源代码中提取信息总是空的

[复制链接]
发表于 2020-2-6 21:07:17 | 显示全部楼层 |阅读模式

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

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

x
请求大神帮助:
(源代码)

import requests
import bs4

def song_message(url):
    song_name=[]
    headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'referer':'https://music.163.com/song?id=4466775'
    }

    res=requests.get(url,headers=headers)
    soup = bs4.BeautifulSoup(res.text,'html.parser')
    targets = soup.find_all('div',class_='tit')               #我怀疑问题从这里开始
    for each in targets:
        print(each.em.text)                                 #提示是这里的问题

def main():
  url='https://music.163.com/#/song?id=1357785909'
  song_message(url)


if __name__=='__main__':
  main()
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

运行后总是报错:
  File "C:\Users\17659\Desktop\test.py", line 15, in song_message
    print(each.em.text)
AttributeError: 'NoneType' object has no attribute 'text'
最佳答案
2020-2-9 11:35:19


确认了一下你的网页,我确认了你的思路是没错的,所以这一定就是网易云的反爬手段了,刚才我查了一下别人爬取网易云的论坛帖子,找到了一个方法确认有效,就是把你的URL里面的#/去掉就可以了。不过因此也会使你的targets多了一个None对象,这大概是遗留问题,我自己是通过异常处理给pass掉的,源代码是这样的,希望能帮到你:


  1. import requests
  2. import bs4

  3. def song_message(url):
  4.     song_name=[]
  5.     headers={
  6.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
  7.     'referer':'https://music.163.com/song?id=4466775'
  8.     }

  9.     res=requests.get(url,headers=headers)
  10.     soup = bs4.BeautifulSoup(res.text,'html.parser')
  11.     try:
  12.         targets = soup.find_all('div',class_='tit')
  13.         for each in targets:
  14.             print(each.em.text)
  15.     except AttributeError:
  16.         pass

  17. def main():
  18.   url='https://music.163.com/song?id=1357785909'
  19.   song_message(url)


  20. if __name__=='__main__':
  21.   main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 21:53:51 | 显示全部楼层
我看了一下soup的内容查找了一下class_=‘tit’这个内容,没找到有text的内容,可以问下你打算爬什么吗,可能使用的标签不太对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-7 14:43:56 | 显示全部楼层
2楼正解  没有这个“tit”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 16:42:18 | 显示全部楼层
975050208@qq.co 发表于 2020-2-7 14:43
2楼正解  没有这个“tit”

标题那个就是tit
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-7 16:45:33 | 显示全部楼层
楼主可以通过打印或者保存文本的形式看看你爬了什么呗,看看soup得到的是什么再判断
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 13:06:50 | 显示全部楼层
Hoiste 发表于 2020-2-6 21:53
我看了一下soup的内容查找了一下class_=‘tit’这个内容,没找到有text的内容,可以问下你打算爬什么吗,可 ...


我是想爬歌曲的名字,我是一层一层的翻找到的啊
网页代码是下面这样的:(难道是找错地方了??)
                <div class=''title''>==$0
                        <em class="f-ff2"> 野狼disco</em>==$0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-8 13:11:51 | 显示全部楼层
ColaPlusIce 发表于 2020-2-8 13:06
我是想爬歌曲的名字,我是一层一层的翻找到的啊
网页代码是下面这样的:(难道是找错地方了??)
                 ...


<i class="lab u-icn u-icn-37"></i>
<div class="tit">
<em class="f-ff2">野狼disco</em>
<a title="播放mv" href="/mv?id=10909879"><i class="icn u-icn u-icn-2"></i></a>
</div>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 11:35:19 | 显示全部楼层    本楼为最佳答案   


确认了一下你的网页,我确认了你的思路是没错的,所以这一定就是网易云的反爬手段了,刚才我查了一下别人爬取网易云的论坛帖子,找到了一个方法确认有效,就是把你的URL里面的#/去掉就可以了。不过因此也会使你的targets多了一个None对象,这大概是遗留问题,我自己是通过异常处理给pass掉的,源代码是这样的,希望能帮到你:


  1. import requests
  2. import bs4

  3. def song_message(url):
  4.     song_name=[]
  5.     headers={
  6.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
  7.     'referer':'https://music.163.com/song?id=4466775'
  8.     }

  9.     res=requests.get(url,headers=headers)
  10.     soup = bs4.BeautifulSoup(res.text,'html.parser')
  11.     try:
  12.         targets = soup.find_all('div',class_='tit')
  13.         for each in targets:
  14.             print(each.em.text)
  15.     except AttributeError:
  16.         pass

  17. def main():
  18.   url='https://music.163.com/song?id=1357785909'
  19.   song_message(url)


  20. if __name__=='__main__':
  21.   main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-9 11:40:04 | 显示全部楼层
这个反爬也要说明一下,你自己在可以在idle或者shell里面打一遍代码,到了soup这一步的时候你输入soup可以看到soup的文本,你会发现里面找不到任何你可能想要的内容比如说歌名,歌词,评论等,这些都是网易云的一些隐藏手法,下次遇到类似问题可以自己查看一下自己的soup文本,

通过把内容复制到TXT文件中进行查找可以快速确定问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-9 12:44:38 | 显示全部楼层
感谢感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 23:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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