3

问题

我是网络抓取的新手,我正在尝试创建一个抓取器,它查看播放列表链接并获取音乐和作者的列表。

但是该站点一直拒绝我的连接,因为它认为我是一个机器人,所以我使用 UserAgent 创建了一个假的 useragent 字符串来尝试绕过过滤器。

它有点工作?但问题是,当你通过浏览器访问网站时,你可以看到播放列表的内容,但是当你尝试通过请求提取 html 代码时,播放列表的内容只是一个很大的空白。

Mabye 我必须等待页面加载?还是有更强大的机器人过滤器?

我的代码

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent

ua = UserAgent()

melon_site="http://kko.to/IU8zwNmjM"

headers = {'User-Agent' : ua.random}
result = requests.get(melon_site, headers = headers)


print(result.status_code)
src = result.content
soup = BeautifulSoup(src,'html.parser')
print(soup)

网站链接

播放列表链接

使用请求时得到的 html

带有空格的html,播放列表应该在哪里

4

2 回答 2

4

刮痧时要记住的要点


1)使用一个好的用户代理.. ua.random 可能会返回一个被服务器阻止的用户代理

2)如果你正在做太多的抓取,请限制你的抓取速度,使用 time.sleep() 这样服务器可能不会被你的 IP 地址加载,否则它会阻止你。

3)如果服务器阻止您尝试使用 IP 轮换。

于 2020-04-24T04:46:32.070 回答
4

您想查看此链接以获取您想要获取的内容。

以下尝试应该为您获取艺术家姓名和他们的歌曲名称。

import requests
from bs4 import BeautifulSoup

url = 'https://www.melon.com/mymusic/playlist/mymusicplaylistview_listSong.htm?plylstSeq=473505374'

r = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(r.text,"html.parser")
for item in soup.select("tr:has(#artistName)"):
    artist_name = item.select_one("#artistName > a[href*='goArtistDetail']")['title']
    song = item.select_one("a[href*='playSong']")['title']
    print(artist_name,song)

输出如下:

Martin Garrix - 페이지 이동 Used To Love (feat. Dean Lewis) 재생 - 새 창
Post Malone - 페이지 이동 Circles 재생 - 새 창
Marshmello - 페이지 이동 Here With Me 재생 - 새 창
Coldplay - 페이지 이동 Cry Cry Cry 재생 - 새 창

注意:为了让脚本支持伪选择器,您的BeautifulSoup版本应该是或更高版本。4.7.0

于 2020-04-24T05:18:25.213 回答