最简便的爬虫效率提升方法
admin
2023-07-30 21:13:46
0

昨晚发现放在腾讯云主机上通过crontab定时执行用以爬去斗鱼分类页面数据的爬虫在执行的时候速度特别慢,于是想通过多线程来提高效率。
打开浏览器,键入关键字“python 多线程”,发现大多数内容都是使用threading、Queue这些看起来很笨重的实例。不过直到multiprocessing.dummy出现在眼前之后,一切都变得辣么简单。

multiprocessing.dummy 大杀器

multiprocessing.dummy 是multiprocessing的一个子库,二者的不同之处就是前者应用于线程后者主要应用于进程,而它们实现并行化操作的关键则是map()函数。
以我的两段代码为例:

def insert_info():
    \'\'\'
    通过遍历游戏分类页面获取所有直播间
    \'\'\'
    session = requests.session()
    pagecontent = session.get(Directory_url).text
    pagesoup = BeautifulSoup(pagecontent)
    games = pagesoup.select(\'a\')
    col.drop()
    for game in games:
        links = game[\"href\"]
        Qurystr = \"/?page=1&isAjax=1\"
        gameurl = HOST + links + Qurystr
        gamedata = session.get(gameurl).text
        flag = get_roominfo(gamedata)
    aggregateData()

上边这段是之前运行在云主机速度真的跟爬似的代码,通过Directory_url这个地址,获取到页面中所有的标签,并获取到它们的\’href\’,再逐条获取每个链接中的内容,获取想要的东西,最终完成入库工作。所有的一切都看似按部就班哈。在我的笔记本上做测试,完成所有2032条数据的爬取共耗时140.5s(好特么慢=。=)。

但是在加入multiprocessing.dummy之后,真的是有飞一般的感觉:

from multiprocessing.dummy import Pool

pool = Pool()

def insert_info():
    \'\'\'
    通过遍历游戏分类页面获取所有直播间
    \'\'\'
    session = requests.session()
    pagecontent = session.get(Directory_url).text
    pagesoup = BeautifulSoup(pagecontent)
    games = pagesoup.select(\'a\')
    gameurl = [HOST + url[\"href\"] + \"/?page=1&isAjax=1\" for url in games]
    col.drop()
    g = lambda link: session.get(link).text
    gamedata = pool.map(g, gameurl)
    ginfo = lambda data: get_roominfo(data)
    pool.map(ginfo, gamedata)
    aggregateData()

同样通过Directory_url这一地址获取页面中所有标签,然后通过pool.map(g, gameurl)完成\’href\’值的获取,最后再用一次pool.map(ginfo,gamedata)完成所有页面内容的提取和入库。再一次测试,只需要33.1s即可完成。

所以说,如果你的爬虫也要处理类似的过程,不妨尝试一下multiprocessing。

更多详细信息可以参考官方文档。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...