使用 selenium 和 beautifulsoup 的慢代码

Posted

技术标签:

【中文标题】使用 selenium 和 beautifulsoup 的慢代码【英文标题】:Slow code using selenium and beautifulsoup 【发布时间】:2018-09-24 19:57:17 【问题描述】:

我正在尝试使用 selenium webdriver 和来自网站的美汤来获取数据。下面的代码段需要很长时间才能执行。

time1 = time.time()
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.bseindia.com/")
elem = driver.find_element_by_id("suggestBoxEQ")
elem.clear()
elem.send_keys("538707")  
elem.send_keys(Keys.RETURN)
print(driver.current_url)
html = driver.page_source
soup = BeautifulSoup(html, 'lxml')
driver.quit()
time2 = time.time()
print(time2-time1)

执行此代码需要13.876seconds。有什么方法可以加快当前代码的执行时间或另一种更快的方法来获取数据?

【问题讨论】:

你要抓取什么数据?输入号码会重定向到此 URL:bseindia.com/stock-share-price/… 我需要获取在 BSE 上市的公司的“交易日期、交易数量、可交付数量、可交付数量占交易数量的百分比、市值、证券 ID”等。为了实现这一点,我使用 selenium 获取页面的动态内容并使用 beautifulsoup 进行处理。 【参考方案1】:

在this URL输入538707后,页面重定向到this URL。

此页面上的表格和其他数据是从 AJAX 请求加载的。您可以直接从这些请求中获取数据以进行抓取。要查看 AJAX 请求,请转到 Developer tools 中 Network 选项卡下的 XHR 选项卡并刷新页面。您可以从此处看到的 XHR 请求中获取数据。

例如,表Securitywise Delivery Position 是从this URL 加载的。所以,你可以像这样直接获取表格:

import requests

r = requests.get('https://www.bseindia.com/stock-share-price/SiteCache/SecurityPosition.aspx?Type=EQ&text=538707')
soup = BeautifulSoup(r.text, 'lxml')
table = soup.find('table')

使用 BeautifulSoup 抓取此表。例如:

print(table.find('td', class_='newseoscripfig').text)
# 13 Apr 2018

同样,您可以找到几乎所有其他动态加载的数据 XHR 请求。由于这里没有使用 Selenium,所以脚本非常快。

【讨论】:

Keyur,我无法使用 XHR 获取“股票交易”、“市场深度”等表格的数据。 bseindia.com/stock-share-price/SiteCache/… , bseindia.com/stock-share-price/SiteCache/… 看来this url 需要标头来发出请求。使用 Request Headers 中显示的标头。 This Q/A on SO 可能会帮助您做到这一点。 This too. 在这个答案中,我向您展示了抓取所有动态元素的总体思路。如果您对特定 XHR 有任何问题,我认为您应该为此提出一个新问题。如果我在这个答案中添加这些东西,它会变得有点宽泛而且超出范围。 当然,我会问一个新问题。与 selenium 相比,XHR 非常快。谢谢 我在添加 Referer 标头后得到了响应。不,如果您复制并在另一个选项卡上打开链接,如果需要其他标头(如引用者、来源等),您将看不到数据。

以上是关于使用 selenium 和 beautifulsoup 的慢代码的主要内容,如果未能解决你的问题,请参考以下文章

python中技巧

python爬虫之BeautifulSoup

Python项目之requirements文件

爬取所有校园新闻

使用 selenium TestNG 和 selenium 进行并行测试

ImportError:无法导入名称“BeautifulSoup4”