2017-01-25 2 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!') 

Я присоединенные изображения страниц принесли ниже. Вот веб-страницы, при просмотре через Интернет, через веб-браузер:

Page showing data

Теперь, вот страница, которую я потянул вниз через сценарий, аналогичный показанному выше - и у него нет данных :

Page downloaded by scraping - no data!

Может кто-нибудь понять, почему этот элемент иногда отсутствует, когда данные считываются с помощью моего сценария? В равной степени (более?) Важно, как я могу это исправить?

+0

Это может загружать кучу данных с помощью Javascript, и ваш скрипт не работает Javascript. Попробуйте отключить Javascript в своем браузере и посмотреть, не получает ли браузер все данные. – LarsH

+0

Вы пытались добавить небольшую задержку между вытаскиванием URL-адреса и загрузкой источника в bs4? – jinksPadlock

ответ

4

Возможно, вам понадобится дождитесь загрузки данных, прежде чем разобрать его BeautifulSoup. В dryscrape ожидания может быть сделано с помощью wait_for() функции:

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

Или, выстрел в темноте: он также может быть временная проблема, и вы можете обойти его, обновив страницу в (сеть?) цикл до тех пор, пока не увидите результат, то вдоль этих линий:

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') 
Смежные вопросы