我有大约50,000多个网站,并希望将html内容保存到数据库中。所以我写了这段代码;但是,它对于50,000多个网站来说太慢了。是否有更好的方法来获取页面内容并将其保存到数据库?
我的代码:
import requests
import MySQLdb
from threading import Thread
import Queue
db = MySQLdb.connect('127.0.0.1','root','','random_db') # connect
cursor = db.cursor()
result = cursor.execute("SELECT id , url from sites where html=''")
result = cursor.fetchall()
c = 1
def save_to_db(q,data):
try:
content = requests.get("http://" + data[1]).text
except:
content = 'empty'
query = "UPDATE sites SET html='%s' WHERE id=%d"\
%(MySQLdb.escape_string(str(content)), data[0])
q.put(query)
q = Queue.Queue()
for data in result:
t = Thread(target=save_to_db,args=(q,data))
t.start()
cursor.execute(q.get())
if c > 2000:
db.commit()
c = 0
答案 0 :(得分:3)
在你的循环中启动一个线程来下载一些东西,然后你立即阻塞直到它完成并且结果可用(q.get()
阻塞)。
这意味着尽管使用线程,你的程序确实按顺序工作,所以难怪它很慢。
要使程序并行工作,您需要像工作线程这样的工作,从工作队列连续拉出工作,然后将结果进入另一个队列,从另一个线程可以拉出它们并写入数据库...
答案 1 :(得分:0)
有一些异步网络库,例如gevent或twisted。这些类型的lib是 unblock ,这意味着它们可以在没有线程编程的情况下同时进行多次下载。
示例gevent抓取工具 https://bitbucket.org/raptorz/gcrawler/src/1f081cde224a86051a50e3d7c252f2555dd4b581/src/gcrawler.py?at=default