抓取呈现的javascript网页

抓取呈现的javascript网页,javascript,python,web-scraping,Javascript,Python,Web Scraping,我试图构建一个简短的Python程序,提取Pewdiepie的订户数量,并在socialblade上每秒更新一次,以在终端上显示。我每30秒就要一次数据 我尝试过使用PyQt,但速度很慢,我已经转向干刮,速度稍快,但也不能像我希望的那样工作。我刚刚发现了入侵者,并编写了一些仍然存在相同问题的短代码:返回的数字是在执行页面上的Javascript之前的数字。: from invader import Invader url = 'https://socialblade.com/youtube/u

我试图构建一个简短的Python程序,提取Pewdiepie的订户数量,并在socialblade上每秒更新一次,以在终端上显示。我每30秒就要一次数据

我尝试过使用PyQt,但速度很慢,我已经转向干刮,速度稍快,但也不能像我希望的那样工作。我刚刚发现了入侵者,并编写了一些仍然存在相同问题的短代码:返回的数字是在执行页面上的Javascript之前的数字。

from invader import Invader

url = 'https://socialblade.com/youtube/user/pewdiepie/realtime'
invader = Invader(url, js=True)

subscribers = invader.take(['#rawCount', 'text'])
print(subscribers.text)
我知道这些数据可以通过访问,但并不总是有效,有时它只是重定向到

有没有办法在页面上的Javascript修改计数器之后而不是之前获得这个数字?你觉得哪种方法最好?提取它:

  • 从原始页面返回相同的小时数
  • 从API的页面上看,在代码中不使用cookie时以及经过一定时间后,哪些bug会出现

谢谢你的建议

如果你想抓取一个部分内容由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)。见:

为了获得最佳的成功和可靠性,您可能需要在
pyppeteer
中设置用户代理(
page.setUserAgent
),并使其保持最新,并使用代理(这样您的ip不会被禁止)。这可能需要很多工作

使用一个能为您处理此问题的服务可能更容易、更便宜(在时间上,也比购买大量代理更便宜)。它支持使用真正的浏览器,在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)
导入请求
从pyquery导入pyquery
#向API发送请求
url=”https://scrapers-proxy2.p.rapidapi.com/javascript"
参数={
“单击选择器”:“#订阅者计数”、#(等待选择器解决)
“wait_ajax”:“true”,
“url”:”https://www.youtube.com/user/PewDiePie"
}
标题={
“x-rapidapi-host”:“scrapers-proxy2.p.rapidapi.com”,
“x-rapidapi-key”:“待办事项”
}
response=requests.request(“GET”,url,headers=headers,params=params)
#查询html
pq=PyQuery(response.text)
count_text=pq(“#订户计数”).text()
#从文本中提取计数
clean_count_text=count_text.split(“”)[0]
clean_count_text=clean_count_text.替换('K','000'))
clean\u count\u text=clean\u count\u text.替换('M','000000')
计数=整数(清除计数\文本)
打印(计数)
我知道这有点晚了,但我希望这能有所帮助