仅在使用Python请求延迟数据加载后才能刮取html?

问题描述:

我想学习使用python的数据刮擦,并已使用Requests和BeautifulSoup4库。它适用于普通的html网站。但是当我试图从延迟数据加载的网站中获取一些数据时,我发现我得到了一个空值。一个例子是仅在使用Python请求延迟数据加载后才能刮取html?

from bs4 import BeautifulSoup 
from operator import itemgetter 
from selenium import webdriver 
url = "https://www.example.com/;1" 
browser = webdriver.PhantomJS() 
browser.get(url) 
html = browser.page_source 
soup = BeautifulSoup(html, 'lxml') 
a = soup.find('span', 'buy') 
print(a) 

我想从这里抢: (值)

我已经提到过类似的话题,并试图类似的路线这里提供的解决方案执行我的代码。但不知何故,似乎没有工作。我是新手,所以需要帮助完成这项工作。 How to scrape html table only after data loads using Python Requests?

该表(内容)可能是由JavaScript生成的,因此无法“看到”。我正在使用python3.6/PhantomJS/Selenium,这里提供了很多答案。

+0

你可以使用一些这http://selenium-python.readthedocs.io/waits.html或只加'time.sleep(N)' – AndMar

+0

可以请你检查网址?看来;有一个错字,并可能导致您的刮板 – jabargas

+0

@AndMar time.sleep错误似乎在这种情况下工作。请建议您建议我在哪里添加? – fazal

您必须运行无头浏览器才能运行延迟刮取。请使用硒。 这里是示例代码。代码使用Chrome浏览器作为驱动程序

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
browser = webdriver.Chrome(<chromedriver path here>) 
browser.set_window_size(1120, 550) 
browser.get(link) 
element = WebDriverWait(browser, 3).until(
    EC.presence_of_element_located((By.ID, "blabla")) 
) 
data = element.get_attribute('data-blabla') 
print(data) 
browser.quit() 
+0

它像一个魅力使用铬webdriver。但它实际上打开了浏览器窗口。相反,有没有类似无头浏览器?也许如果你有类似的代码phantomjs或不打开一个物理浏览器,但在控制台窗口左右的排序下工作?再次感谢。一旦我得到你的回应,我将把这个帖子标记为已回答。 – fazal

+0

请将webdriver.chorme()替换为webdriver.PhantomJS()。所有其他过程都是一样的。 – songxunzhao

+0

谢谢我会试一试。 – fazal

您可以通过来自API的requesting it directly访问所需的值并分析JSON响应。

import requests 
import json 

res = request.get('https://api.example.com/api/') 
d = json.loads(res.text) 

print(d['market']) 
+0

感谢您的回复。虽然api会为这个网站做些什么。最初的想法是仍然理解如何在数据加载稍有延迟的情况下获得在此类网站上获得的价值。这是这篇文章的关键问题。 – fazal