概要
pythonのwebスクレイピングを用いてGoogle Scholarの論文タイトルを取得し、
取得した論文タイトルをgoogle driveに保存してみることを目標にスクリプトを作成しています。
まずはAIチャットアプリを参考に土台を作っていきます。
なお、メモ程度に書いてますのでご了承ください。
実行環境
・windows:Windows11Pro 23H2
・python:3.12.3
ソースコード
test.py
'''
目標:Google Schplarの論文を毎日触れるようにすること
'''
import os
import pickle
import io
from google.auth.transport.requests import Request
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
import requests
import sys
from bs4 import BeautifulSoup
from googletrans import Translator
# スコープの設定
SCOPES = ['https://www.googleapis.com/auth/drive.file']
# 翻訳を実行
def translate(text):
print("####################################################################################################################################################################")
print(f'Original: {text}')
translated = translator.translate(text, src='en', dest='ja')
print(f'Translation: {translated.text}')
def search_google_scholar(query, num_pages):
base_url = 'https://scholar.google.com/scholar'
#params辞書を使用してページネーションを処理
params = {'q': query, 'hl': 'en'}
for page in range(num_pages):
params['start'] = page * 10
response = requests.get(base_url, params=params)
soup = BeautifulSoup(response.text, 'html.parser')
for result in soup.find_all('div', class_='gs_ri'):
title = result.find('h3', class_='gs_rt').text
translate(title)
def authenticate():
creds = None
# トークンを保存するファイル
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# 資格情報が無いか有効でない場合、再認証
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
return creds
def upload_file(file_path, file_name):
creds = authenticate()
service = build('drive', 'v3', credentials=creds)
# ファイルをアップロード
file_metadata = {'name': file_name}
media = MediaFileUpload(file_path, mimetype='text/plain')
file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()
print(f'File ID: {file.get("id")}')
if __name__ == '__main__':
# 翻訳器のインスタンスを作成
translator = Translator()
redirect_file = 'scraping.txt'
with open(redirect_file, 'w',encoding='utf-8') as f:
# sys.stdout をテキストファイルにリダイレクト
sys.stdout = f
# 検索キーワードを指定してスクレイピングを実行(例として2ページ分)
search_google_scholar('skeletal muscle cell signaling',2)
# リダイレクトを元に戻す
sys.stdout = sys.__stdout__
print("scraping finish")
file_path = redirect_file # アップロードするファイルのパス
file_name = 'uploaded_file.txt' # Google Driveにアップロードする際のファイル名
upload_file(file_path, file_name)
スクレイピング結果
最低限のスクレイピングはできています。。。
まだ、googledrive
####################################################################################################################################################################
Original: Disuse atrophy of human skeletal muscle: cell signaling and potential interventions.
Translation: 人間の骨格筋の使用萎縮:細胞シグナル伝達と潜在的な介入。
####################################################################################################################################################################
Original: Signaling pathways in skeletal muscle remodeling
Translation: 骨格筋のリモデリングのシグナル伝達経路
####################################################################################################################################################################
Original: Reactive oxygen species in skeletal muscle signaling
Translation: 骨格筋シグナル伝達における反応性酸素種
#########################################################################################
エラー文
FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json'