【问题标题】:How to scrape news articles from cnbc with keyword "Green hydrogen"?如何使用关键字“绿氢”从cnbc中抓取新闻文章?
【发布时间】:2022-10-15 08:17:53
【问题描述】:

我正在尝试删除此 url 中列出的新闻文章,所有文章都在 span.Card-title 中。但这给出了空白输出。有没有办法解决这个问题?

from bs4 import BeautifulSoup as soup

import requests

cnbc_url = "https://www.cnbc.com/search/?query=green%20hydrogen&qsearchterm=green%20hydrogen"

html = requests.get(cnbc_url)

bsobj = soup(html.content,'html.parser')

day = bsobj.find(id="root")

print(day.find_all('span',class_='Card-title'))

for link in bsobj.find_all('span',class_='Card-title'):

    print('Headlines : {}'.format(link.text))

【问题讨论】:

  • 我认为为此使用selenium 比尝试跟踪和模仿可能需要的请求序列和解析要容易得多

标签: python web-scraping beautifulsoup feed feedparser


【解决方案1】:
【解决方案2】:

如另一个答案中所述,有关文章的数据是使用另一个链接加载的,您可以通过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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多