如何使用Beautifulsoup4等待站点返回数据

时间:2016-10-13 07:05:01

标签: python beautifulsoup

我使用beautifulsoup4编写了一个脚本,该脚本基本上从网页上的表中提取了密码列表。问题是我的python脚本没有等待网页的返回内容,并且中断或说“索引”列出了范围超出范围'。代码如下:

ssl_lab_url = 'https://www.ssllabs.com/ssltest/analyze.html?d='+site
req  = requests.get(ssl_lab_url)
data = req.text
soup = BeautifulSoup(data)
 print CYELLOW+"Now Bringing in the LIST of cipher gathered from SSL LABS for "+str(ssl_lab_url)+CEND
        for i in tqdm(range(10000)):
           sleep(0.01)
           table = soup.find_all('table',class_='reportTable', limit=5)[-1]
           data = [ str(td.text.split()[0]) for td in table.select("td.tableLeft")]
        print CGREEN+str(data)+CEND
        time.sleep(1)

它有时会在data中返回NOTHING或者说:

Traceback (most recent call last):
  File "multiple_scan_es.py", line 79, in <module>
    scan_cipher_ssl(list_url )
  File "multiple_scan_es.py", line 62, in scan_cipher_ssl
    table = soup.find_all('table',class_='reportTable', limit=5)[-1]
IndexError: list index out of range

我需要在这里等,怎么做?

2 个答案:

答案 0 :(得分:1)

如果数据不在原始HTML页面中,但是在后台从JS代码返回,请考虑使用无头浏览器,例如PhantomJS和Selenium。 Here's an example

答案 1 :(得分:1)

我在想这个页面使用JavaScript来获取数据,但它使用旧的HTML方法来刷新页面。

它会添加HTML标记<meta http-equiv="refresh" content='**time**; url>,浏览器会在时间秒后重新加载页面。

你必须检查这个标签 - 如果你找到它然后你可以等,你必须再次加载页面。大多数情况下,您可以在不等待的情况下重新加载页面并获得数据,或者再次找到此标记。

import requests
from bs4 import BeautifulSoup
import time

site = 'some_site_name.com'
url = 'https://www.ssllabs.com/ssltest/analyze.html?d='+site

# --- 

while True:
    r = requests.get(url)

    soup = BeautifulSoup(r.text)

    refresh = soup.find_all('meta', attrs={'http-equiv': 'refresh'})
    #print 'refresh:', refresh 

    if not refresh:
        break

    #wait = int(refresh[0].get('content','0').split(';')[0])
    #print 'wait:', wait
    #time.sleep(wait)

# ---

table = soup.find_all('table', class_='reportTable', limit=5)

if table:
    table = table[-1]
    data = [str(td.text.split()[0]) for td in table.select("td.tableLeft")]
    print str(data)
else:
    print "[!] no data"