【问题标题】:Extract content from a continuously updating web page , using Python使用 Python 从不断更新的网页中提取内容
【发布时间】: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


【解决方案1】:

页面不会动态更新,加载需要很长时间。 与

driver.set_page_load_timeout(3600)

并且有很大的耐心(超过 30 分钟)它会起作用。

带有请求的会话也可以,但服务器会立即重置与默认用户代理的连接,所以我不确定它们是否要自动爬网。请检查网站并成为一名优秀的网民!

【讨论】:

  • 这实际上是一个有用的点。我会联系他们。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-04-21
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2021-01-14
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多