【发布时间】:2019-12-06 18:23:21
【问题描述】:
我正在尝试从以下页面提取表格数据:
http://www.mfinante.gov.ro/patrims.html?adbAdbId=4283
问题是页面似乎在不断地动态添加行,并且使用请求只返回没有表格的 html。我还尝试使用 selenium 来等待页面完全加载(因为行数是有限的),但是 selenium 会等待页面加载,直到浏览器耗尽内存并崩溃(大约 100K 行)。
我的问题是,我如何获取要发送到页面的内容(可能以块的形式)并保存? 有没有办法模拟浏览器正在做的调用?
这是我用 selenium 管理的,它适用于较小的样本(例如:adbAdbId=30):
import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
data = ''
delay = 800
options = webdriver.ChromeOptions()
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path="chromedriver.exe")
driver.set_page_load_timeout(1000)
url = 'http://www.mfinante.gov.ro/patrims.html?adbAdbId=30'
driver.get(url)
try:
myElem = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.ID, 'patrims')))
print("Page is ready!")
except TimeoutException:
print("Loading took too much time!")
rows = driver.find_elements_by_xpath("//table[@id='patrims']/tbody/tr")
print(len(rows))
listofdicts = []
def builder(outputlist, inputlist):
#i =0
for row in inputlist:
#i+=1
#print(i)
soup = BeautifulSoup(row.get_attribute('innerHTML') , 'html.parser')
td= soup.find_all('td')
d = { "Legend" : soup.find("legend").get_text().strip(),
"Localitatea" : td[2].get_text().strip(),
"Strada" : td[4].get_text().strip(),
"Descriere Tehnica" : td[6].get_text().strip(),
"Cod de identificare" : td[-7].get_text().strip(),
"Anul dobandirii sau darii in folosinta " : td[-6].get_text().strip(),
"Valoare" : td[-5].get_text().strip(),
"Situatie juridica" : td[-4].get_text().strip(),
"Situatie juridica actuala" : td[-3].get_text().strip(),
"Tip bun" : td[-2].get_text().strip(),
"Stare bun" : td[-1].get_text().strip(),
}
outputlist.append(d)
print('done!')
builder(listofdicts, rows)
print('writing result')
frame = pd.DataFrame(listofdicts)
frame.to_csv(r'output30.csv')
【问题讨论】:
-
你试过执行脚本吗?
-
不,不知道该怎么做。我也尝试使用 requests.session,但它得到了相同的结果。或者我没有正确使用它。
-
也许你可以试试漂亮的汤来代替硒。据我所知,它创建了与 selenium 不同的站点快照:crummy.com/software/BeautifulSoup/bs4/doc
-
问题是漂亮的汤取决于获取 html 的请求。并且请求没有得到完整的 html
标签: python selenium python-requests