如另一个答案中所述,有关文章的数据是使用另一个链接加载的,您可以通过the networks tab in devtools 找到该链接。 [在chrome中,你可以用Ctrl+Shift+I打开devtools,然后转到networks选项卡查看发出的请求,然后点击以'json.aspx?...'开头的名称即可查看详细信息,然后从标头部分复制请求 URL。]
获得请求 URL 后,您可以复制它并在代码中发出请求以获取数据:
# dataReqUrl contains the copied Request URL
dataReq = requests.get(dataReqUrl)
for r in dataReq.json()['results']: print(r['cn:title'])
如果您不想尝试在 250 多个其他请求中找到该请求,您也可以尝试将 URL 的较短形式组合为以下内容:
# import urllib.parse
# find link to js file with api key
jsLinks = bsobj.select('link[href][rel="preload"]')
jUrl = [m.get('href') for m in jsLinks if 'main' in m.get('href')][0]
jRes = requests.get(jUrl) # request js file api key
# get api key from javascript
qKey = jRes.text.replace(' ', '').split(
'QUERYLY_KEY:'
)[-1].split(',')[0].replace('"', '').strip()
# form url
qParams = {
'queryly_key': qKey,
'query': search_for, # = 'green hydrogen'
'batchsize': 10 # can go up to 100 apparently
}
qUrlParams = urllib.parse.urlencode(qParams, quote_via=urllib.parse.quote)
dataReqUrl = f'https://api.queryly.com/cnbc/json.aspx?{qUrlParams}'
尽管组装的dataReqUrl 与复制的不完全相同,但它似乎给出了相同的结果(我检查了几个不同的搜索词)。但是,我不知道这种方法有多可靠,尤其是与selenium 的复杂得多的方法相比:
# from selenium import webdriver
# from selenium.webdriver.common.by import By
# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# define chromeDriver_path <-- where you saved 'chromedriver.exe'
cnbc_url = "https://www.cnbc.com/search/?query=green%20hydrogen&qsearchterm=green%20hydrogen"
driver = webdriver.Chrome(chromeDriver_path)
driver.get(cnbc_url)
ctSelector = 'span.Card-title'
WebDriverWait(driverC, 5).until(EC.visibility_of_all_elements_located(
(By.CSS_SELECTOR, ctSelector)))
cardTitles = driverC.find_elements(By.CSS_SELECTOR, ctSelector)
cardTitles_text = [ct.get_attribute('innerText') for ct in cardTitles]
for c in cardTitles_text: print(c)