如何使用 python 绕过机器人检测并抓取网站

And*_*_ye 5 python beautifulsoup web-scraping python-requests botdetect

问题

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

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

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

也许我必须等待页面加载?或者有更强大的机器人过滤器?

我的代码

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)

Run Code Online (Sandbox Code Playgroud)

网站链接

播放列表链接

使用请求时得到的 html

html 播放列表应该有空白

SIM*_*SIM 5

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

\n\n

以下尝试应该会为您获取艺术家姓名及其歌曲名称。

\n\n
import requests\nfrom bs4 import BeautifulSoup\n\nurl = \'https://www.melon.com/mymusic/playlist/mymusicplaylistview_listSong.htm?plylstSeq=473505374\'\n\nr = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})\nsoup = BeautifulSoup(r.text,"html.parser")\nfor item in soup.select("tr:has(#artistName)"):\n    artist_name = item.select_one("#artistName > a[href*=\'goArtistDetail\']")[\'title\']\n    song = item.select_one("a[href*=\'playSong\']")[\'title\']\n    print(artist_name,song)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出如下:

\n\n
Martin Garrix - \xed\x8e\x98\xec\x9d\xb4\xec\xa7\x80 \xec\x9d\xb4\xeb\x8f\x99 Used To Love (feat. Dean Lewis) \xec\x9e\xac\xec\x83\x9d - \xec\x83\x88 \xec\xb0\xbd\nPost Malone - \xed\x8e\x98\xec\x9d\xb4\xec\xa7\x80 \xec\x9d\xb4\xeb\x8f\x99 Circles \xec\x9e\xac\xec\x83\x9d - \xec\x83\x88 \xec\xb0\xbd\nMarshmello - \xed\x8e\x98\xec\x9d\xb4\xec\xa7\x80 \xec\x9d\xb4\xeb\x8f\x99 Here With Me \xec\x9e\xac\xec\x83\x9d - \xec\x83\x88 \xec\xb0\xbd\nColdplay - \xed\x8e\x98\xec\x9d\xb4\xec\xa7\x80 \xec\x9d\xb4\xeb\x8f\x99 Cry Cry Cry \xec\x9e\xac\xec\x83\x9d - \xec\x83\x88 \xec\xb0\xbd\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n