多线程快速抓取网页

一段简单的代码,用于抓取wiki百科数据,简单的多线程编程例子,很少占内存,线程数开大了后效率很高。
import sys, thread, threading, time;
import commands

finish_num = 0;
mutex = threading.Lock();

def extract_qid(id, num_of_thread):
    try:
        fin = open(sys.argv[1], "r");
        fout = open(sys.argv[2] + ".part" + str(id), "w");
        count = 0;
        for line in fin:
            try:
                line = line.strip();
                if count % num_of_thread != id:
                    count += 1;
                    continue;
                count += 1;
                _raw_query = line;
		cmd = "wget \"zh.wikipedia.org/zh-hans/${query}\" -O \"fetch_wiki/tmp_search_${id}\""
                cmd = cmd.replace("${query}", _raw_query).replace("${id}", str(id));
                commands.getoutput(cmd);

                tmp_fin = open("fetch_wiki/tmp_search_${id}".replace("${id}", str(id)), "r");
		fout.write("zh.wikipedia.org/zh-hans/${query}\n".replace("${query}",_raw_query))
                for tmp_line in tmp_fin:
                    fout.write(tmp_line)
                tmp_fin.close();

                commands.getoutput("rm -f \"fetch_wiki/tmp_search_${id}\"".replace("${id}", str(id)));
            except:
                continue;
        fout.close();
        fin.close();

        global finish_num;
        if mutex.acquire(1):
            finish_num += 1;
            mutex.release();

        return True;
    except Exception as e:
        print e;
        return False;

for i in range(0, int(sys.argv[3])):
    thread.start_new_thread(extract_qid, (i, int(sys.argv[3])));

while finish_num != int(sys.argv[3]):
    time.sleep(1);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
描述:由C#编写的多线程异步抓取网页络爬虫控制台程序 功能:目前只能提取络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常庞大的,如下代码理论上大概可以把整个互联网页链接都下来。 但事实上,由于处理器功能和络条件(主要是速)限制,一般的家用电脑最多能胜任12个线程左右的抓取任务,抓取速度有限。可以抓取,但需要时间和耐心。 当然,这个程序把所有链接下来是可能的,因为链接占系统空间并不多,而且有记录文件的帮助,已抓取网页的数量可以堆积下去, 甚至可以把所有的互联络链接都存取下来,当然,最好是分批次。建议设置maxNum为500-1000左右,慢慢累积下去。 另外因为是控制台程序,有时候显示字符过多会系统会暂停显示,这时候只要点击控制台按下回车键就可以了。程序假死的时候,可以按回车键(Enter)试试。 /// 使用本程序,请确保已创建相应的记录文件,出于简化代码的考虑,本程序做的并不健壮,请见谅。 /// 默认的文件创建在E盘根目录“已抓取址.txt”和“待抓取址.txt”这两个文本文件中,使用者需要自行创建这两个文件,注意后缀名不要搞错。 这两个文件里面的链接基本都是有效链接,可以单独处理使用。 本爬虫程序的速度如下: 10线程最快大概500个链接每分钟 6-8线程最快大概400-500个链接每分钟 2-4线程最快大概200-400个链接每分钟 单线程最快大概70-100个链接每分钟 之所以用多线程异步抓取完全是出于效率考虑,本程序多线程同步并不能带来速度的提升,只要抓取网页不要太多重复和冗余就可以,异步并不意味着错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值