【问题标题】:Scrolling Yahoo Finance News滚动雅虎财经新闻
【发布时间】:2020-10-12 08:59:23
【问题描述】:

所以我正在做一个小项目,我在其中抓取特定公司的雅虎财经新闻,并对其进行一些数据分析,以了解新闻情绪如何影响股票表现。我正在尝试无限地刮擦和滚动直到它停止,但是我在尝试刮过第一个滚动时遇到了麻烦。

我正在使用 selenium 来帮助我解决这个问题。我一直在到处寻找帮助,但似乎是因为每次向下滚动时都会逐渐加载新闻结果,这会使事情变得更加复杂。

import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup


# Web scrapper for infinite scrolling page 
url = "https://finance.yahoo.com/quote/company/press-releases?p=company"

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(url)
time.sleep(2)  # Allow 2 seconds for the web page to open
scroll_pause_time = 2 
screen_height = driver.execute_script("return window.screen.height;")   # get the screen height of the web

i = 1
   
SCROLL_PAUSE_TIME = 0.5
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(SCROLL_PAUSE_TIME)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

##### Extract Article Titles #####
titles = []
soup = BeautifulSoup(driver.page_source, "html.parser")
for t in soup.find_all(class_="Cf"):
    a_tag = t.find("a", class_="Fw(b)")
    if a_tag:
        text = a_tag.text
        titles.append(text)

【问题讨论】:

    标签: python selenium web-scraping sentiment-analysis yahoo-finance


    【解决方案1】:

    这不是 selenium 中的最佳自动化实践

    出于多种原因,不建议使用 WebDriver 登录 Gmail 和 Facebook 等网站。除了违反这些网站的使用条款(您的帐户可能会被关闭)之外,它速度慢且不可靠。

    理想的做法是使用电子邮件提供商提供的 API,或者在 Facebook 的情况下使用开发人员工具服务,该服务公开了用于创建测试帐户、朋友等的 API。尽管使用 API 可能看起来有点额外的艰苦工作,但您将在速度、可靠性和稳定性方面得到回报。 API 也不太可能更改,而网页和 HTML 定位器经常更改,需要您更新测试框架。

    在测试的任何时候使用 WebDriver 登录第三方网站都会增加测试失败的风险,因为它会延长测试时间。一般的经验法则是,较长的测试更加脆弱和不可靠。

    符合 W3C 的 WebDriver 实现还使用 WebDriver 属性注释导航器对象,以便可以缓解拒绝服务攻击。

    【讨论】:

    • 啊,谢谢,我对抓取不太熟悉,所以我认为作为一个小项目,这就足够了,但是谢谢!
    【解决方案2】:

    此示例代码来自我不久前参与的一个项目。希望它可以帮助您朝着正确的方向前进。

    from bs4 import BeautifulSoup
    import urllib.request
    import pandas as pd
    from pandas import DataFrame
    
    resp = urllib.request.urlopen("https://www.cnbc.com/finance/")
    soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))
    substring = 'https://www.cnbc.com/'
    
    df = ['review']
    for link in soup.find_all('a', href=True):
        #print(link['href'])
        if (link['href'].find(substring) == 0): 
            # append
            df.append(link['href'])
            
            #print(link['href'])
            
            
            #list(df)
            # convert list to data frame
            df = DataFrame(df)
            #type(df)
            #list(df)
            
            # add column name
            df.columns = ['review']
            df.columns
            
            from nltk.sentiment.vader import SentimentIntensityAnalyzer
            sid = SentimentIntensityAnalyzer()
            df['sentiment'] = df['review'].apply(lambda x: sid.polarity_scores(x))
            def convert(x):
                if x < 0:
                    return "negative"
                elif x > .2:
                    return "positive"
                else:
                    return "neutral"
                    df['result'] = df['sentiment'].apply(lambda x:convert(x['compound']))
                    df['result']
                
                    df_final = pd.merge(df['review'], df['result'], left_index=True, right_index=True)
                    df_final
    

    结果:

                                                   review   result
    0                                              review  neutral
    1                      https://www.cnbc.com/business/  neutral
    2   https://www.cnbc.com/2021/02/22/chinas-foreign...  neutral
    3   https://www.cnbc.com/2021/02/22/chinas-foreign...  neutral
    4                  https://www.cnbc.com/evelyn-cheng/  neutral
    ..                                                ...      ...
    89                        https://www.cnbc.com/banks/  neutral
    90  https://www.cnbc.com/2021/02/17/wells-fargo-sh...  neutral
    91                   https://www.cnbc.com/technology/  neutral
    92  https://www.cnbc.com/2021/02/17/lakestar-found...  neutral
    93               https://www.cnbc.com/finance/?page=2  neutral
    
    [94 rows x 2 columns]
    

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多