Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9130

Pythonスクレイピング【GCP - cloud functions - サンプルコード付】

$
0
0
はじめに 普段は、firebase cloud functionsで サーバー側の処理を記述しています。 今回も、node環境のサーバーでスクレイピングを行なっていたのですが 処理に時間がかかる・メモリが多く必要になるという理由で スクレイピングに関しては、python3で記述することにしました。 ちなみに、nodeでのスクレイピングは下記のnpmを使用していました。 npm i puppeteer 下記システムは、こちらのサイトでも使用しています。 Pythonの記述・ディレクトリ構造 今回は、GCPのcloud functionsの方に pythonのファイルをデプロイしたので、ディレクトリ構造の説明もしていきたいと思います。 ディレクトリ構造 ディレクトリ構造 pythonFunctions ├ main.py ├ getMetaFromSoup.py ├ requirements.txt ├ .gcloudignore └ README.md main.py[サンプルコード] main.pyは サーバー側で一番はじめに処理が実行されるファイルになります。 関数【getMeta()】では、URLからHTMLファイルを読み込んでいます。 main.py # -*- coding: utf-8 -*- import requests import bs4 from flask import jsonify # import from getMetaFromSoup import getTitle, getDescription, getImage, getDomain def getMeta(request): # クエリ文字列を取得 if request.args and 'url' in request.args: request_name = request.args.get('url') url = request_name # URL html = requests.get(url) soup = bs4.BeautifulSoup(html.content, "html.parser") params = { "title": getTitle(soup), "description": getDescription(soup), "image": getImage(soup), "domain": getDomain(url), } # 必要に応じて変更を行なってください。 headers = { 'Access-Control-Allow-Origin': 'http://yapoyapo.com/' } return (jsonify(params), 200, headers) getMetaFromSoup.py[サンプルコード] 実際にスクレイピングを行なっているファイルになります。 ※入れた方がいいmeta情報があればご共有お願いします! getMetaFromSoup.py from urllib.parse import urlparse # タイトルを取得 def getTitle(soup): title = soup.find('meta', attrs={'property': 'og:title'}) if (str(title) != 'None'): return title.get('content') title = soup.find('title') if (str(title) != 'None'): return title.text title = soup.find('meta', attrs={'name': 'twitter:title'}) if (str(title) != 'None'): return title.get('content') title = soup.find('h1') if (str(title) != 'None'): return title.text return '' # ディスクリプションを取得 def getDescription(soup): description = soup.find('meta', attrs={'property': 'og:description'}) if (str(description) != 'None'): return description.get('content') description = soup.find('description') if (str(description) != 'None'): return description.text description = soup.find('meta', attrs={'name': 'twitter:description'}) if (str(description) != 'None'): return description.get('content') description = soup.find('meta', attrs={'name': 'description'}) if (str(description) != 'None'): return description.get('content') # 画像を取得 def getImage(soup): image = soup.find('meta', attrs={'property': 'og:image'}) if (str(image) != 'None'): return image.get('content') image = soup.find('link', attrs={'rel': 'image_src'}) if (str(image) != 'None'): return image.get('href') image = soup.find('meta', attrs={'name': 'twitter:image'}) if (str(image) != 'None'): return image.get('content') image = soup.find('meta', attrs={'name': 'twitter:image:src'}) if (str(image) != 'None'): return image.get('content') image = soup.find('img') if (str(image) != 'None'): return image.get('href') # ドメインを取得 def getDomain(url): return urlparse(url).netloc requirements.txt[サンプルコード] requirements.txtでは、pipのバージョン管理を行なっています。 ローカルPCのpipのバージョンはpip listで確認できます。 requirements.txt urllib3==1.26.4 beautifulsoup4==4.10.0 requests==2.25.1 .gcloudignore[サンプルコード] .gcloudignoreでは サーバー側に必要のない情報を記載しています。 .gitignoreのような役割を担っています。 .gcloudignore README.md 最後に 重要なファイルは ・main.py ・requirements.txt になります。 また、本記事で紹介した方法で こちらのサイトを運営していますので、ぜひ使ってみてください!

Viewing all articles
Browse latest Browse all 9130

Trending Articles