网易云音乐歌单、歌词爬取相关

在构建RNN时需要用到中文歌词数据集,所以写了这么一个爬虫进行爬取,爬取网站为网易云音乐,期间主要遇到三个小问题:

  1. 歌单列表页面无法获取所有歌单
    原因:url中忘记去掉#,#为锚点,代表页内跳转。
    http://music.163.com/playlist?id=317113395 http://music.163.com/#/playlist?id=317113395

  2. 进入歌单页面后,解析后的网页没有歌曲链接
    处理方法:
    headers = { 'Referer': 'http://music.163.com/', 'Host': 'music.163.com', 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.3.0', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } s = requests.session()
    page= s.get(playList_url,headers=headers) soup=BeautifulSoup(page.content) song_links=soup.find_all('a' , href = re.compile("^/song\?id=[0-9]+"))
    在浏览器端查看源代码发现歌词列表加载好像是通过js实现的,且歌曲列表位于一个iframe中,网上建议使用处理js的方法来处理;但是通过设置headers、session也能实现,难道是服务器检测headers及session,如果没发现则将访问者作为爬虫并拒绝加载?
    不懂

  3. 在单个歌曲页面,无法获取歌词
    剖析:怀疑与情况2类似,但无效,真正原因是访问歌词的url不对,歌曲页面中的歌词是通过加载某个api来获取的,我们真正要访问的是该歌词API
    参考:http://blog.csdn.net/sgfmby1994/article/details/77981034?locationNum=3&fps=1

  4. 在向数据库插入、更新数据时提示语法错误:
    self.con.execute("insert into {}(song_id,song_name) values({},'{}')".format(self.table_name,songId,link.string))
    self.con.execute("insert into song_list_antiquity(song_id,song_name) values(?,?)",(songId,link.string))
    原因:sqlite中占位符?仅适用于value,表名不可使用,所以我们用format代替;但是对于字符串型数据,由于我们需要加‘’,同时歌词中可能存在 ' 或“,从而导致语法错误。

ps:第二种情况会不会是由于歌单中的歌词是通过api加载,所以我们无法解析到?待验证。

你可能感兴趣的:(网易云音乐歌单、歌词爬取相关)