はじめに
普段は、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
になります。
また、本記事で紹介した方法で
こちらのサイトを運営していますので、ぜひ使ってみてください!
↧