【问题标题】:Python loop slowing downPython循环减慢
【发布时间】:2017-09-16 09:49:11
【问题描述】:

我有一个 python 循环,它使用 selenium 从网站获取一些数据并将其存储在 SQL 数据库中。一开始每个循环大约需要一秒钟,但一段时间后它越来越慢......我认为问题是内存问题,但我不知道如何解决它。 这是我的代码:

count = 0
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
con = sql.connect(user="user", passwd="passwd", db="db", host="localhost")
cur = con.cursor()


def create():
    if random.random() < 0.5:
        driver.get('http://www.example.com/w')
    else:
        driver.get('http://www.example.com/p')
    name = driver.find_element_by_xpath("//div[@class='address']/h3").text
    name1 = name.split(" ")[0]
    name2 = name.split(" ")[1]
    test = driver.find_element_by_xpath("//div[@class='adr']").text
    test2 = test.replace("\n", " ")
    dd = driver.find_element_by_xpath("(//dl[@class='dl-horizontal')[1]/dd").text
    dd2 = driver.find_element_by_xpath("(//dl[@class='dl-horizontal'])[2]/dd/a").text
    day = driver.find_element_by_xpath("(//dl[@class='dl-horizontal'])[5]/dd").text
    i = "','"
    try:
        values = unidecode("'" + name1 + i + name2 + i + dd + i + dd2 + i + day + i + test2 + "'")
        cur.execute("INSERT INTO accounts (name1,name2,dd,dd2,day,test2) VALUES (" + values + ")")
        con.commit()
        global anzahl
        anzahl += 1
        sys.stdout.write('.')
        sys.stdout.flush()
        gc.collect()

    except sql.Error as e:
        print("Error %d: %s" % (e.args[0], e.args[1]))
        gc.collect()


start = time.time()

for _ in range(200):
    create()

cur.close()
con.close()
end = time.time()

我看不出有什么会减慢循环速度。我试过gc.collect(),但它并没有改变任何东西。 我该怎么做才能让我的循环在一段时间后不会变慢?

【问题讨论】:

  • 我认为该站点可能会限制快速自动访问,这是在循环的后期迭代中实现的。
  • 你为什么打电话给gc.collect()?这可能会减慢您的代码速度。
  • 另外,这个问题让我很困扰。将其更改为cur.execute("""INSERT INTO accounts (name1, name2, dd, dd2, day, test2) VALUES (?,?,?,?,?,?)""", (name1, name2, dd, dd2, day, test2)),您可以删除所有字符串格式。根据您使用的 SQL,您可能需要将 ? 更改为不同的占位符,但目前您可以根据您从网站上抓取的任何内容进行 SQL 注入。
  • 我确定这是一个内存问题,因为其他所有内容(如 nano)也变得很慢我使用 MySQLdb 并且它与查询配合得很好
  • 并在每次迭代时停止提交,在所有迭代完成后提交一次。另外,在函数顶部定义全局变量

标签: python loops selenium memory


【解决方案1】:

可能会减慢您编写代码的速度:

  1. Web 服务器,可以减少带宽以防止 DoS,
  2. driver对象?
  3. 网络(数据库)可能很慢,
  4. I/O 访问(使用sys.stdout.writeprint),取决于实际流。是控制台吗?

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多