0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonを用いたwebスクレイピング

Last updated at Posted at 2024-12-03

概要

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'

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?