刮除50,000多个网站的快速方法

时间:2013-04-11 22:19:57

标签: python multithreading web-scraping

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

2 个答案:

答案 0 :(得分:3)

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

这意味着尽管使用线程,你的程序确实按顺序工作,所以难怪它很慢。

要使程序并行工作,您需要像工作线程这样的工作,从工作队列连续拉出工作,然后将结果进入另一个队列,从另一个线程可以拉出它们并写入数据库...

答案 1 :(得分:0)

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

示例gevent抓取工具 https://bitbucket.org/raptorz/gcrawler/src/1f081cde224a86051a50e3d7c252f2555dd4b581/src/gcrawler.py?at=default