2017-04-16 15 views
0

コードを何度も何度も何度も繰り返すことなく、美しいスープを使って1つのウェブサイトから複数の異なるページ(たとえばロンドン)をクロールする方法を知りたいと思います。Pythonでウェブサイトから複数のページをクロールする

私の目標は、理想的には、まず以下では1つの都市

に関連するすべてのページをクロールすることで、私のコード:

session = requests.Session() 
session.cookies.get_dict() 
url = 'http://www.citydis.com' 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 
response = session.get(url, headers=headers) 

soup = BeautifulSoup(response.content, "html.parser") 
metaConfig = soup.find("meta", property="configuration") 


jsonUrl = "https://www.citydis.com/s/results.json?&q=Paris& customerSearch=1&page=0" 
response = session.get(jsonUrl, headers=headers) 
js_dict = (json.loads(response.content.decode('utf-8'))) 

for item in js_dict: 
    headers = js_dict['searchResults']["tours"] 
    prices = js_dict['searchResults']["tours"] 

for title, price in zip(headers, prices): 
    title_final = title.get("title") 
    price_final = price.get("price")["original"] 

print("Header: " + title_final + " | " + "Price: " + price_final) 

出力は、次のいずれかです。

Header: London Travelcard: 1 Tag lang unbegrenzt reisen | Price: 19,44 € 
Header: 105 Minuten London bei Nacht im verdecklosen Bus | Price: 21,21 € 
Header: Ivory House London: 4 Stunden mittelalterliches Bankett| Price: 58,92 € 
Header: London: Themse Dinner Cruise | Price: 96,62 € 

それが与えます私は最初のページ(4結果)の結果のみを返しますが、私はロンドンのすべての結果を得たいと思います(200以上の結果が必要です)

私に助言をいただけますか?私は推測、私はjsonURLのページをカウントアップするために持っていますが、それをさらに一歩取得することができ、ヘルプ、 - 私に

感謝を

UPDATEを行う方法がわかりません。

この場合、1ページ(ページ= 0)しかクロールできませんが、最初の10ページをクロールしたいと思います。コードから

関連スニペット:

soup = bs4.BeautifulSoup(response.content, "html.parser") 
metaConfig = soup.find("meta", property="configuration") 

page = 0 
while page <= 11: 
    page += 1 

    jsonUrl = "https://www.citydis.com/s/results.json?&q=Paris& customerSearch=1&page=" + str(page) 
    response = session.get(jsonUrl, headers=headers) 
    js_dict = (json.loads(response.content.decode('utf-8'))) 


    for item in js_dict: 
     headers = js_dict['searchResults']["tours"] 
     prices = js_dict['searchResults']["tours"] 

     for title, price in zip(headers, prices): 
      title_final = title.get("title") 
      price_final = price.get("price")["original"] 

      print("Header: " + title_final + " | " + "Price: " + price_final) 

- 私はすべて一つの特定のページに戻って結果を取得ではなく、したがって、私のアプローチは、次のようになります。それに加えて私は1つのエラーメッセージを返す。これは私がすべての結果を返さない理由と関連していますか?

出力:ヘルプ

+0

ウェブページを正しくクロールするには、 'xpaths'が必要です。.itは、あなたが上でやっていることの最大5行で、あなたのコードをもっと少なくするでしょう。それは、クロールと擦り傷に関連する何かを行うためのスタンダードの方法です。 – anekix

+0

情報ありがとうございます。試してみる。それにもかかわらず、私が使用している方法で上記の問題にどのように取り組むことができるか、いくつかのフィードバックを私に提供することができますか? –

答えて

1

ため

Traceback (most recent call last): 
File "C:/Users/Scripts/new.py", line 19, in <module> 
AttributeError: 'list' object has no attribute 'update' 

おかげであなたは本当にあなたのコード例は、(あなたのコードはインデントの問題を含んで)完全な(あなたが不足している輸入品を持っている)と、構文的に正しいことを確認する必要があります。実際の例を試してみると、私は次のことを考え出しました。

import requests, json, bs4 
session = requests.Session() 
session.cookies.get_dict() 
url = 'http://www.getyourguide.de' 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 
response = session.get(url, headers=headers) 

soup = bs4.BeautifulSoup(response.content, "html.parser") 
metaConfig = soup.find("meta", property="configuration") 
metaConfigTxt = metaConfig["content"] 
csrf = json.loads(metaConfigTxt)["pageToken"] 


jsonUrl = "https://www.getyourguide.de/s/results.json?&q=London& customerSearch=1&page=0" 
headers.update({'X-Csrf-Token': csrf}) 
response = session.get(jsonUrl, headers=headers) 
js_dict = (json.loads(response.content.decode('utf-8'))) 
print(js_dict.keys()) 

for item in js_dict: 
     headers = js_dict['searchResults']["tours"] 
     prices = js_dict['searchResults']["tours"] 

     for title, price in zip(headers, prices): 
      title_final = title.get("title") 
      price_final = price.get("price")["original"] 

      print("Header: " + title_final + " | " + "Price: " + price_final) 

は、これが私のやり方より4よりも結果が得られます。

一般的に、JSONを返す多くのサイトが回答をページングし、1ページあたりの固定数の結果を提供することがわかります。そのような場合、最後のページを除く各ページには、通常、値が次のページのURLを示すキーが含まれます。ページをループするのは簡単なことですが、そのキーがないことを検出すると、ループの外にはbreakが出てしまいます。

+0

本当にありがとうございます。あなたのフィードバックを考慮します。この場合、1ページ(ページ= 0)だけをクロールできますが、最初の10ページをクロールしたいと思います。私は最初の最初の投稿に自分のアプローチを投稿しました。希望、私を正しい解決策に導くことができます。そしてあなたの忍耐のためにありがとう:) –

+0

喜び。私はさらに進歩がウェブサイトの詳細に依存すると思うので、スタックオーバーフローの外になる可能性があります – holdenweb

関連する問題