質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1384閲覧

Heroku上に指定した条件でjsonを返すアプリを作りたい

bev

総合スコア10

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/12/14 03:13

前提・実現したいこと

Herokuにて指定した条件でjsonを返すアプリを作ろうとしています。

該当のソースコード

python

1# -*- coding: utf-8 -*- 2import json 3import asyncio 4 5from bs4 import BeautifulSoup 6 7from selenium import webdriver 8from selenium.webdriver.support.ui import WebDriverWait 9from selenium.webdriver.support import expected_conditions as EC 10from selenium.webdriver.common.keys import Keys 11from selenium.webdriver.common.by import By 12from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 13ua = dict(DesiredCapabilities.PHANTOMJS) 14USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0' 15ua['phantomjs.page.settings.userAgent'] = (USER_AGENT) 16 17from urllib.parse import urlparse 18import urllib.request 19 20import os 21from flask import Flask 22 23from flask_cors import CORS, cross_origin 24app = Flask(__name__) 25CORS(app) 26 27@app.route('/') 28def index(): 29 return "work" 30 31@app.route('/api/<string:site>/<string:word>') 32def data(site,word): 33 driver = webdriver.PhantomJS(desired_capabilities=ua) 34 driver.set_window_size(1200, 850) 35 driver.implicitly_wait(20) 36 driver.set_page_load_timeout(10) 37 wait = WebDriverWait(driver, 20) 38 39 # FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "screen.png") 40 41 if ( site == "domainA" ): 42 URL = "https://domainA.com/" 43 elif( site == "domainB" ): 44 URL = "https://domainB.com/" 45 else: 46 URL = "https://domain.com/" 47 48 print("site : " + URL) 49 50 driver.get(URL) 51 52 if ( site == "domainA" ): 53 search = driver.find_element_by_id("domainA_search") 54 elif( site == "domainB" ): 55 search = driver.find_element_by_id("domainB_search") 56 else: 57 search = driver.find_element_by_id("domain_search") 58 59 search.send_keys(word) 60 search.submit() 61 62 existTitle = wait.until(EC.title_contains(word)) 63 print(existTitle) 64 65 print(driver.current_url) 66 67 data_list = [] 68 if ( site == "domainA" ): 69 data = driver.page_source.encode('utf-8') 70 soup = BeautifulSoup(data,"lxml") 71 target_list = soup.find_all("li",class_="target") 72 for target in target_list: 73 target_ary = {} 74 75 link = target.find("a",class_="img").get("href") 76 driver.get(link) 77 data = driver.page_source.encode('utf-8') 78 soup = BeautifulSoup(data,"lxml") 79 title = soup.find("h1",class_="title").string 80 target_ary["title"] = title 81 82 data_list.append(target_ary) 83 84 elif( site == "domainB" ): 85 data = driver.page_source.encode('utf-8') 86 soup = BeautifulSoup(data,"lxml") 87 target_list = soup.find_all("li",class_="list") 88 for target in target_list: 89 target_ary = {} 90 91 link = target.find("a",class_="img").get("href") 92 driver.get(link) 93 data = driver.page_source.encode('utf-8') 94 soup = BeautifulSoup(data,"lxml") 95 title = soup.find("h1",class_="page_title").string 96 target_ary["title"] = title 97 98 data_list.append(target_ary) 99 100 else: 101 data_list.append({}) 102 103 driver.close() 104 jsonstring = json.dumps(data_list,ensure_ascii=False) 105 return jsonstring 106 107if __name__ == '__main__': 108 app.run() 109

試したこと

直列的な記述では動作は確認できたのですが、target_list[]が多くなってしまうとタイムアウトを起こしてしまうことが分かりました。そこで、非同期処理のことについてなど調べてみたのですが、pythonを触ったことがなかったため理解も難しく解決できませんでした。

target内のdriver.get(link)を非同期にするのが一番の早道かなとも思ったのですが、どのような解決法があるのか、どなたかご教示いただけませんでしょうか。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

grequestsを使い解決しました。

投稿2018/12/14 15:20

bev

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問