ここ最近、 ニュース記事を量産すべく、そのための便利プログラムを用意していました。
以下がそのソースコード 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スクリプト
この記事では、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')
結論
やってみたけど、薄っぺらい記事が量産されそうな感じ。このスクリプトを用いてのニュース記事作成自体はつまらなくなったので、やめようと思います。
このブログも ちょっと 迷走気味だな、、、 さてさて。
コメント