按照我前面的问题,我已经成功地完成了任务的一些小部分。
到目前为止,我总结了以下内容:
import os
from collections import namedtuple
from operator import itemgetter
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
song = namedtuple('song', 'artist title album duration artistlink songlink albumlink')
path = os.environ['APPDATA'] + '\Mozilla\Firefox\Profiles'
path = (path + '\\' + os.listdir(path)[0]).replace('\\', '/')
profile = webdriver.FirefoxProfile(path)
Firefox = webdriver.Firefox(profile)
wait = WebDriverWait(Firefox, 30)
Firefox.get('https://music.163.com/#/playlist?id=158624364&userid=126762751')
iframe = Firefox.find_element_by_xpath('//iframe[@id="g_iframe"]')
Firefox.switch_to.frame(iframe)
wait.until(EC.visibility_of_element_located((By.XPATH, '//table/tbody/tr')))
rows = Firefox.find_elements_by_xpath('//table/tbody/tr')
entries = []
for row in rows:
column1 = row.find_element_by_xpath('td[2]/div/div/div/span/a')
title = column1.text
songlink = column1.get_attribute('href')
duration = row.find_element_by_xpath('td[3]/span').text
column3 = row.find_element_by_xpath('td[4]/div/span/a')
artist = column3.text
artistlink = column3.get_attribute('href')
column4 = row.find_element_by_xpath('td[5]/div/a')
album = column4.text
albumlink = column4.get_attribute('href')
entries.append(song(artist, title, album, duration, artistlink, songlink, albumlink))
等待是必须的,因为javascript需要一些时间来加载所有这些条目,如果过早地刮表,最多只能有1000首歌曲。
我关心的是循环部分,处理2748个条目需要三分钟以上。
这一行:
rows = Firefox.find_elements_by_xpath('//table/tbody/tr')
它获取整个表的速度非常快(不到三秒),但我不知道为什么在循环中使用多个find_element\u by_xpath()
和get_attribute()
会导致代码运行缓慢。
在短时间内多次调用这些方法对浏览器来说是否太费力,或者创建命名元组本身就很慢?
如何优化?
这不是关于你的代码速度,而是关于它的正确性
在for
循环中,您每次都试图在特定行中搜索,但我不确定您是否得到了预期的结果
在父节点元素中搜索子元素时,应使用启动XPath表达式
说“从这里”,从这个节点元素开始。否则,您将使用相对XPath搜索整个网页,如
td[2]/div/div/div/span/a
<在这里你可以看到这个解释
请尝试一下,并告诉我这是否带来了一些变化:
for row in rows:
column1 = row.find_element_by_xpath('.//td[2]/div/div/div/span/a')
title = column1.text
songlink = column1.get_attribute('href')
duration = row.find_element_by_xpath('.//td[3]/span').text
column3 = row.find_element_by_xpath('.//td[4]/div/span/a')
artist = column3.text
artistlink = column3.get_attribute('href')
column4 = row.find_element_by_xpath('.//td[5]/div/a')
album = column4.text
albumlink = column4.get_attribute('href')
entries.append(song(artist, title, album, duration, artistlink, songlink, albumlink))
我遵循这个链接制作一个CRF模型。我使用以下命令制作模型。 模型制作成功,但我的训练数据非常多,花费了太多时间。当我仔细观察系统中发生的事情时。它只使用了我电脑的一个核心 我能否以使用计算机多个核心的方式运行此命令?看起来它是作为单个线程实现的。是否支持多线程?如果是,请分享。
此select语句返回4k行。在我的应用程序中占用时间的是while循环。单循环就需要2到4分钟。关于如何优化它有什么想法吗? 不要太担心查询本身,因为它不会在查询响应上花费太多时间。
我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存
问题内容: 我有一本书得很长。我使用setText()方法在JTextArea中显示它。它冻结了UI,并花费大量时间。我该如何解决? 这是SSCCE: 问题答案: 在与构造GUI分开的单独线程中创建DefaultStyledDocument似乎是创建巨大文本区域的最快方法。DefaultStyledDocument是线程安全的。 这是我用来测试DefaultStyledDocument的代码。我用
任何解决这一问题的建议都将不胜感激。或者我们可以用另一种方式来计数?我想补充一些细节。滑动大小是一个事件和窗口大小超过10小时(每秒大约有300个事件),我们需要对每个事件做出反应。所以在这种情况下,我们没有使用Flink提供的窗口。我们使用来存储前面的信息。在中用于触发旧数据的清理作业。最后dinstinct键的数量非常多。
我在本地文件系统中有24GB文件夹。我的任务是将该文件夹移动到HDFS。我有两种方法。1)hdfs dfs-复制来自本地 /home/data/ /home/ 这大约需要 15 分钟才能完成。 2)使用水槽。 这是我的经纪人 这一步花了将近一个小时将数据推送到HDFS。 据我所知,Flume是分布式的,所以Flume加载数据的速度应该比copyFromLocal命令更快。