【发布时间】: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