2017-01-25 1 views
2

私はYahooからいくつかのデータを削り取ろうとしています。私は動作するスクリプトを書いています - 時にはいくつか。スクリプトを実行すると、完全なページをダウンロードすることができます - そのほかの回、ページが部分的にしかロードされず、データ部分が欠落しています。DryscrapeとBeautifulSoupを使ったウェブの掻き取り

さらに複雑なことは、ブラウザでそのページに移動すると、ページ全体が表示されることです。ここで

は、私のコードの要旨です:

import dryscrape 
from bs4 import BeautifulSoup 

url = 'http://finance.yahoo.com/quote/SPY/options?p=SPY&straddle=false' 

sess = dryscrape.Session() 

sess.set_header('user-agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0') 

sess.set_attribute('auto_load_images', False)   
sess.set_timeout(360) 

sess.visit(url) 

soup = BeautifulSoup(sess.body(), 'lxml') 

# Related to memory leak issue in webkit 
sess.reset() 

# Barfs (sometimes!) at the line below 
sel_list = soup.find('select', class_='Fz(s)') 

if sel_list is None or len(sel_list) == 0: 
    print('element not found on page!') 

私は、ページの画像を添付した下記のフェッチ。インターネット上で見たときにここでは、Webページは、Webブラウザを介して、次のとおりです - そしてそれはデータがない

Page showing data

さて、ここで私は上に示したのと同様のスクリプトを介して、プルダウンページです!:

Page downloaded by scraping - no data!

データは私のスクリプトによってフェッチされたときに要素が時々不足している理由を誰もがうまくできますか?同じように(もっと?)重要なことに、どうすればこの問題を解決できますか?

+0

それはJavascriptを使用してデータの束をダウンロードすることができる、そしてあなたのスクリプトは、Javascriptを実行しません。ブラウザでJavascriptを無効にして、ブラウザがまだデータを取得しているかどうかを確認してください。 – LarsH

+0

URLをプルダウンしてからソースをbs4にロードするまでの間に小さな遅延を追加しようとしましたか? – jinksPadlock

答えて

4

で解析する前に、のデータが読み込まれるのを待つ必要があります。それはまた、一時的かもしれない問題を、あなたはでページを更新し、それを回避すること(ネットワーク?):

sess.visit(url) 

# waiting for the first data row in a table to be present 
sess.wait_for(lambda: session.at_css("tr.data-row0")) 

soup = BeautifulSoup(sess.body(), 'lxml') 

または、暗闇の中でショット:dryscrapeで待機中は、wait_for()機能を介して行うことができますあなたは結果が表示されるまでループ、これらの線に沿って何か:

from dryscrape.mixins import WaitTimeoutError 

ATTEMPTS_COUNT = 5 
attempts = 0 

while attempts <= ATTEMPTS_COUNT: 
    sess.visit(url) 

    try: 
     # waiting for the first data row in a table to be present 
     sess.wait_for(lambda: session.at_css("tr.data-row0")) 
     break 
    except WaitTimeoutError: 
     print("Data row has not appeared, retrying...") 
     attempts += 1 

soup = BeautifulSoup(sess.body(), 'lxml') 
関連する問題