使用dryscrape和BeautifulSoup进行网络抓取

时间:2017-01-25 20:20:14

标签: python web-scraping beautifulsoup lxml dryscrape

我正试图从雅虎那里搜集一些数据。我写了一个有效的脚本 - 有时候。有时当我运行脚本时,我可以下载完整的页面 - 其他时候,页面只是部分加载 - 数据部分丢失。

更令人困惑的是,当我在浏览器中导航到该页面时,会显示整个页面。

以下是我的代码的要点:

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!

有人可以解决为什么在我的脚本提取数据时有时会丢失元素的原因吗?同样(更多?)重要的是,我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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')