2017-01-07 11 views
1

私はユーザーの観点から最高の10のホテルを表示したいと思います。ユーザーが 'プール'を入力し、私はtripadvisorからのユーザーのレビューでキーワード 'プール'を計算してから数を取って、カウントに応じてトップ10のホテル名を表示しなければならないとします。この目的のために、私は現在、ホテル(dubai)のすべてのレビューを解散しています。そして、私はキーワードとマッチし、トップ10のホテルnames.butを表示するスクラップは私が何をすることができますか?どんな助け?こする以外の任意の他の方法でこのレビューをスクラップための私のコードです:?Pythonでスクレイピングをスピードアップする方法は?

import requests 
from bs4 import BeautifulSoup 

offset = 0 
url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS' 

urls = [] 
r = requests.get(url) 
soup = BeautifulSoup(r.text, "html.parser") 

for link in soup.find_all('a', {'last'}): 
     page_number = link.get('data-page-number') 
     last_offset = int(page_number) * 30 
     print('last offset:', last_offset) 

for offset in range(0, last_offset, 30): 
    print('--- page offset:', offset, '---') 

    url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS' 

    r = requests.get(url) 
    soup = BeautifulSoup(r.text, "html.parser") 

    for link in soup.find_all('a', {'property_title'}): 
     iurl='https://www.tripadvisor.com/' + link.get('href') 

     r = requests.get(iurl) 
     soup = BeautifulSoup(r.content, "lxml") 
     #look for the partial entry of the review 
     resultsoup = soup.find_all("p", {"class" : "partial_entry"}) 

      for review in resultsoup: 
       review_list = review.get_text() 
       print(review_list) 

答えて

1

再度同じ作業をしないで、あなたは再利用のためにスクレーピングされているデータを格納するデータベースを使用する必要があります。

そして、あなたのコードに若干の改善があります。サーバー

Requests Documentへの接続を維持するためにrequests.Session()を使用するには:

Sessionオブジェクトを使用すると、 リクエスト間で特定のパラメータを保持することができます。また、 セッションインスタンスからのすべてのリクエストにCookieが残され、urllib3の接続プーリングが使用されます。したがって、 を同じホストに複数回リクエストしている場合は、基になるTCP 接続が再利用されるため、パフォーマンスが大幅に向上する可能性があります(「HTTP持続接続」を参照)。

with requests.Session() as session: 
    for offset in range(0, last_offset, 30): 
     print('--- page offset:', offset, '---') 

    url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS' 

    r = session.get(url) 
    soup = BeautifulSoup(r.text, "html.parser") 

    for link in soup.find_all('a', {'property_title'}): 
     iurl='https://www.tripadvisor.com/' + link.get('href') 

     r = session.get(iurl) 
+0

ウェブページのキーワードと一致するといいですか?レビューをスクラップしませんか? –

+0

@Hifza ahmadはい、bs4を使わず、単に 'response.text'を得ることができます.regexを使ってすべてのキーワードを見つけるよりもはるかに高速です。 bs4はhtmlコードを解析する最も遅い方法です。 –

関連する問題