2016-07-26 3 views
2

の下にデータを追加します最初のデータセットを表示しながら、URLを更新せずに20データポイント私はこのページをPythonでスクラップするスクリプトを書いていましたが、「次の結果」ボタンをクリックして約40のデータを表示しても、最初の22データポイントのみを削ります。は、どのようにページのURLが変更されていないウェブサイトをこすりすることが、次のボタンが同じURLのページ

どのように私は動的に私のスクリプトが

import csv 
import requests 
from bs4 import BeautifulSoup 


url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
r = requests.get(url) 
r.content 

soup = BeautifulSoup(r.content) 
print (soup.prettify()) 

g_data2 = soup.find_all("a", {"class": "heading"}) 
for item in g_data2: 
    try: 
     name = item.text 
     print name 
    except IndexError: 
     name = '' 
     print "No Name found!" 

答えて

1

の代わりに、私はあなたがAJAXを介して検索されるJSONを見るべきだと思うHTMLをこするに焦点を当てているコンテンツ

をロードし、ウェブサイトのこれらのタイプをこすりすることができます。私はJSONがページのマークアップではなく、将来的に変更される可能性は低いと考えています。さらに、JSON構造をトラバースするのは、DOMをスクラップするよりも簡単です。

たとえば、提供したページを読み込むと、JSONを取得するURLがヒットします(http://www.goudengids.be/q/ajax/business/results.json)。

次に、ビジネスを照会するためのいくつかのURLパラメータを提供します。私はあなたがページをこすると、ボタンのクリックをシミュレートするとは対照的に、あなたのデータを取得するために、これを使用してに多くを見てすべきだと思う、となど

編集:

そして、それは訪問から設定ヘッダを使用しているように見えます当サイトでは最初に有効なセッションがあることを確認します。そのため、最初にサイトにアクセスしてCookieヘッダーを取得し、その後のエンドポイントからのJSON取得要求を設定する必要があります。私はまだ、HTMLを掻き集めるよりも、これがより簡単で予測可能であると考えています。

2

あなたはrequestsでそれを解決した場合、あなたは「負荷もっと」ボタンをクリックするとんどのようなブラウザを模倣する必要がある - それはウェブを維持し、あなたのコードでそれをシミュレートし、http://www.goudengids.be/q/ajax/business/results.jsonエンドポイントにXHRリクエストを送信スクレイピングセッション。 XHRレスポンスはJSON形式でされている - すべてでこの場合はBeautifulSoupのための必要はありません: - 終了条件を把握 -

import requests 

main_url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
xhr_url = "http://www.goudengids.be/q/ajax/business/results.json" 
with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} 

    # visit main URL 
    session.get(main_url) 

    # load more listings - follow the pagination 
    page = 1 
    listings = [] 
    while True: 
     params = { 
      "input": "restaurant Provincie Antwerpen", 
      "what": "restaurant", 
      "where": "Provincie Antwerpen", 
      "type": "DOUBLE", 
      "resultlisttype": "A_AND_B", 
      "page": str(page), 
      "offset": "2", 
      "excludelistingids": "nl_BE_YP_FREE_11336647_0000_1746702_6165_20130000, nl_BE_YP_PAID_11336647_0000_1746702_7575_20139729427, nl_BE_YP_PAID_720348_0000_187688_7575_20139392980", 
      "context": "SRP * A_LIST" 
     } 
     response = requests.get(xhr_url, params=params, headers={ 
      "X-Requested-With": "XMLHttpRequest", 
      "Referer": main_url 
     }) 
     data = response.json() 

     # collect listing names in a list (for example purposes) 
     listings.extend([item["bn"] for item in data["overallResult"]["searchResults"]]) 

     page += 1 

     # TODO: figure out exit condition for the while True loop 

    print(listings) 

私はあなたのための重要なTODOを残してきたリストの収集を停止したとき。

+0

私はあなたのスクリプトを実行したとき、それは(最後の最新の呼び出し)私は、エラーメッセージトレースバックを与えたに: ファイル「C:\ Users \ユーザーユーザー\デスクトップ\ Pythonの\スクリプト\の3url.py」 とでは、3行目、セッションとしてのセッション(): NameError:name 'requests'が定義されていませんどのように修正できますか? – vishnu

+0

@vishnuこの 'import requests'行は一番上にありますか?これは重要。そして 'requests'モジュールをインストールしなければなりません。 – alecxe

+0

あなたは正しい@alecxe私は本当に忘れてしまった。あなたの大きな助けをありがとう、また私は将来あなたを必要とします – vishnu

関連する問題