如果你想抓取一个网页,它的一部分是通过 javascript 加载的,你几乎需要使用真正的浏览器。
在 python 中,这可以通过pyppeteer 实现:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless=False)
page = await browser.newPage()
await page.goto('https://socialblade.com/youtube/user/pewdiepie/realtime',{
'waitUntil': 'networkidle0'
})
count = int(await page.Jeval('#rawCount', 'e => e.innerText'))
print(count)
asyncio.get_event_loop().run_until_complete(main())
注意:您上面提到的网站似乎不再频繁更新订阅者数量(即使使用 JavaScript)。见:https://socialblade.com/blog/abbreviated-subscriber-counts-on-youtube/
为了获得最佳成功和可靠性,您可能需要设置 用户代理(pyppeteer 中的page.setUserAgent)并保持最新状态并使用代理(所以你的IP不会被禁止)。这可能需要大量工作。
使用像Scraper's Proxy 这样可以为您处理此问题的服务可能更容易、更便宜(及时并且比购买大量代理)。它支持将使用真正的浏览器并在 JavaScript 运行后返回生成的 html,并通过大型代理网络路由我们的所有请求,因此您可以发送大量请求而不会被禁止 ip。
这是一个使用 Scraper 的代理 API直接从 YouTube 获取计数的示例:
import requests
from pyquery import PyQuery
# Send request to API
url = "https://scrapers-proxy2.p.rapidapi.com/javascript"
params = {
"click_selector": '#subscriber-count', # (Wait for selector work-around)
"wait_ajax": 'true',
"url":"https://www.youtube.com/user/PewDiePie"
}
headers = {
'x-rapidapi-host': "scrapers-proxy2.p.rapidapi.com",
'x-rapidapi-key': "<INSERT YOUR KEY HERE>" # TODO
}
response = requests.request("GET", url, headers=headers, params=params)
# Query html
pq = PyQuery(response.text)
count_text = pq('#subscriber-count').text()
# Extract count from text
clean_count_text = count_text.split(' ')[0]
clean_count_text = clean_count_text.replace('K','000')
clean_count_text = clean_count_text.replace('M','000000')
count = int(clean_count_text)
print(count)
我知道这有点晚了,但我希望这会有所帮助