ニュースサイトからリンクされているニュースへのリンクを抽出するコード

ここ最近、 ニュース記事を量産すべく、そのための便利プログラムを用意していました。

以下がそのソースコード Yahoo.comからニュース記事へのリンクを引っ張ってくるやつ。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def is_valid_text(text):
    words = text.split()
    return len(words) >= 4 and len(text.strip()) >= 30

def fetch_page_links(base_url, url):
    # ChromeDriverのパスを指定
    chromedriver_path = r'C:\chomeDriver\chromedriver.exe'  # 生の文字列リテラルを使用

    # Serviceオブジェクトを作成
    service = Service(chromedriver_path)

    options = webdriver.ChromeOptions()
    options.add_argument('--headless')  # ヘッドレスモードで実行(ブラウザUIを表示しない)

    # WebDriverのインスタンスを作成
    driver = webdriver.Chrome(service=service, options=options)

    link_tags = []

    try:
        # 指定したURLにアクセス
        driver.get(url)

        # ページの読み込みを待つ(必要に応じて調整)
        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

        # ページ全体のHTMLを取得
        page_source = driver.page_source

        # BeautifulSoupで解析する
        soup = BeautifulSoup(page_source, 'html.parser')

        # 複数のリンク要素を取得する
        links = soup.find_all('a')
        for link in links:
            href = link.get('href')
            text = link.get_text()
            if href and text and is_valid_text(text):
                full_url = urljoin(base_url, href)
                link_tag = f'<a href="{full_url}">{text.strip()}</a>'
                link_tags.append(link_tag)
                if len(link_tags) >= 10:  # 10個のリンクを超えたら停止
                    break

    except Exception as e:
        print(f"エラーが発生しました: {e}")

    finally:
        # WebDriverを終了
        driver.quit()

    return link_tags

# Yahoo.comよりリンクを取得
output_file = 'YahooCom_links.txt'
tag_list = []
categories = ['news', 'tech']

BaseURL = 'https://www.yahoo.com'

# トップページのリンクを取得
top_links = fetch_page_links(BaseURL, BaseURL)
tag_list.extend(top_links)

# 各カテゴリのリンクを取得
for category in categories:
    url = f'{BaseURL}/{category}/'
    category_links = fetch_page_links(BaseURL, url)
    tag_list.extend(category_links)

# 重複を除去(順序を維持)
seen = set()
unique_tags = []
for tag in tag_list:
    if tag not in seen:
        unique_tags.append(tag)
        seen.add(tag)

# 結果をファイルに書き込む
with open(output_file, 'w', encoding='utf-8') as file:
    file.write("News Source : Yahoo.com\n\n\n")
    for tag in unique_tags:
        file.write(tag + '\n')
Yahoo.comからリンクを取得するPythonスクリプト

Yahoo.comからリンクを取得するPythonスクリプト

この記事では、SeleniumとBeautifulSoupを使ってYahoo.comからリンクを取得し、そのリンクをテキストファイルに保存するPythonスクリプトを説明する。

必要なライブラリのインポートと関数定義

まず、必要なライブラリをインポートし、リンクテキストのバリデーション関数を定義する。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def is_valid_text(text):
    words = text.split()
    return len(words) >= 4 and len(text.strip()) >= 30
    

リンク取得関数の実装

次に、指定されたURLのページからリンクを取得する関数を実装する。

def fetch_page_links(base_url, url):
    chromedriver_path = r'C:\chomeDriver\chromedriver.exe'

    service = Service(chromedriver_path)

    options = webdriver.ChromeOptions()
    options.add_argument('--headless')

    driver = webdriver.Chrome(service=service, options=options)

    link_tags = []

    try:
        driver.get(url)

        wait = WebDriverWait(driver, 10)
        wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

        page_source = driver.page_source

        soup = BeautifulSoup(page_source, 'html.parser')

        links = soup.find_all('a')
        for link in links:
            href = link.get('href')
            text = link.get_text()
            if href and text and is_valid_text(text):
                full_url = urljoin(base_url, href)
                link_tag = f'<a href="{full_url}">{text.strip()}</a>'
                link_tags.append(link_tag)
                if len(link_tags) >= 10:
                    break

    except Exception as e:
        print(f"エラーが発生しました: {e}")

    finally:
        driver.quit()

    return link_tags
    

メインスクリプトの実装

メインスクリプトでは、Yahoo.comのトップページおよび各カテゴリページからリンクを取得し、重複を除去してテキストファイルに保存する。

output_file = 'YahooCom_links.txt'
tag_list = []
categories = ['news', 'tech']

BaseURL = 'https://www.yahoo.com'

top_links = fetch_page_links(BaseURL, BaseURL)
tag_list.extend(top_links)

for category in categories:
    url = f'{BaseURL}/{category}/'
    category_links = fetch_page_links(BaseURL, url)
    tag_list.extend(category_links)

seen = set()
unique_tags = []
for tag in tag_list:
    if tag not in seen:
        unique_tags.append(tag)
        seen.add(tag)

with open(output_file, 'w', encoding='utf-8') as file:
    file.write("News Source : Yahoo.com\n\n\n")
    for tag in unique_tags:
        file.write(tag + '\n')
    

結論

やってみたけど、薄っぺらい記事が量産されそうな感じ。このスクリプトを用いてのニュース記事作成自体はつまらなくなったので、やめようと思います。 

このブログも ちょっと 迷走気味だな、、、 さてさて。

コメント

タイトルとURLをコピーしました