1

我有大约 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
4

2 回答 2

3

在你的循环中启动一个线程来下载一些东西,然后你立即阻塞直到它完成并且结果变得可用(q.get()阻塞)。

这意味着尽管使用了线程,但您的程序确实是按顺序运行的,所以它很慢也就不足为奇了。

为了使程序并行工作,您需要一个工作线程池之类的东西,它不断地从工作队列中拉出他们的工作,然后将结果放入另一个队列,另一个线程可以从那里拉出它们并写入数据库...

于 2013-04-11T23:06:01.560 回答
0

有一些异步网络库,例如geventtwisted。这些类型的库是无阻塞的,这意味着它们能够在没有线程编程的情况下同时进行多次下载。

示例 gevent 爬虫 https://bitbucket.org/raptorz/gcrawler/src/1f081cde224a86051a50e3d7c252f2555dd4b581/src/gcrawler.py?at=default

于 2013-04-12T00:13:03.650 回答