2017-01-25 69 views
2

我想從雅虎刮一些數據。我寫了一個可以工作的腳本 - 有些時候。有時當我運行腳本時,我能夠下載完整的頁面 - 其他時間,頁面僅部分加載 - 數據部分丟失。Web刮與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!') 

我附上圖片下方取出。這裏是網頁,通過網頁瀏覽器在互聯網上觀看時,:

Page showing data

現在,這裏是我通過類似於上面所示的一個腳本下拉頁面 - 它沒有數據!

Page downloaded by scraping - no data!

任何人都可以明白爲什麼當數據通過我的腳本獲取的元素有時缺少什麼?同樣(更多?)重要的是,我該如何解決這個問題?

+0

它可能是使用JavaScript下載一堆數據,並且您的腳本不運行Javascript。嘗試在瀏覽器中禁用Javascript並查看瀏覽器是否仍然獲取數據。 – LarsH

+0

您是否嘗試在拉下url和將源代碼加載到bs4之間添加一個小的延遲? – jinksPadlock

回答

4

您可能需要等待數據加載,然後再用BeautifulSoup進行解析。

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')