首页 > 其他分享 >线程池处理爬虫电影票房排行榜

线程池处理爬虫电影票房排行榜

时间:2023-01-18 23:22:24浏览次数:44  
标签:name text year tr 爬虫 线程 time 电影票房

  • 需求:爬取1996-2023年电影票房排行榜
  • 首先,我们先爬取一年的数据,然后通过循环,逐一爬取每一年的数据。通过测试,话费时间32秒,代码如下:
import requests
from lxml import etree
import time

#处理数据,电影排行末尾  有的有空行,有的没有
def str_tool(lst):
    if lst:
        s = ''.join(lst)
        return s.strip()
    else:
        return ""

#获取某一年的数据
def get_info(year):
    url = f"http://www.boxofficecn.com/boxoffice{year}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
        }

    res = requests.get(url=url,headers=headers)
    tree = etree.HTML(res.text)
    trs = tree.xpath("//table/tbody/tr")[1:]

    f = open(f'data/{year}.csv','w',encoding='utf-8')
    for tr in trs:
        num = tr.xpath("./td[1]//text()")
        year = tr.xpath("./td[2]//text()")
        name = tr.xpath("./td[3]//text()")
        money = tr.xpath("./td[4]//text()")

        num = str_tool(num)
        year = str_tool(year)
        name = str_tool(name)
        money = str_tool(money)

        f.write(f'{num},{year},{name},{money}\n')
    f.close()

if __name__ == '__main__':
    start = time.time()
    for i in range(1996,2024):
        get_info(year=i)

    end = time.time()
    print(f"使用单线程循环获取需要时间:{end - start}")  #32.553248167037964
  • 下面我们再次通过线程池的方案爬取相同的数据,代码如下:
import requests
from lxml import etree
import time
from multiprocessing.dummy import Pool

#处理数据,电影排行末尾  有的有空行,有的没有
def str_tool(lst):
    if lst:
        s = ''.join(lst)
        return s.strip()
    else:
        return ""

#获取某一年的数据
def get_info(year):
    url = f"http://www.boxofficecn.com/boxoffice{year}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
        }

    res = requests.get(url=url,headers=headers)
    tree = etree.HTML(res.text)
    trs = tree.xpath("//table/tbody/tr")[1:]

    f = open(f'data/{year}.csv','w',encoding='utf-8')
    for tr in trs:
        num = tr.xpath("./td[1]//text()")
        year = tr.xpath("./td[2]//text()")
        name = tr.xpath("./td[3]//text()")
        money = tr.xpath("./td[4]//text()")

        num = str_tool(num)
        year = str_tool(year)
        name = str_tool(name)
        money = str_tool(money)

        f.write(f'{num},{year},{name},{money}\n')
    f.close()

if __name__ == '__main__':
    start = time.time()
    years = [year for year in range(1996,2024)]
    #创建一个线程池,开启了5个线程
    pool = Pool(5)
    利用线程池中的5个任务,去处理任务,任务个数就是years列表中的元素个数
    pool.map(get_info,years)
    end = time.time()
    print(f"使用线程池获取需要时间:{end - start}")   #20.008408784866333
  • 通过上面两种方法,可以看到,爬取相同的数据,使用线程池快12s。如果在数据量大时,速度会有更明显的差别,特别是在下载图片视频等IO阻塞的任务时。总结:对应需求中可能出现的上千甚至上万次的客户端请求,“线程池”或“连接池”或许可以缓解部分压力,但是不能解决所有问题。总之,多线程模型可以方便高效的解决小规模的服务请求,但面对大规模的服务请求,多线程模型也会遇到瓶颈。

  • 线程池有两种编码方法:第一种使用Pool,上述代码使用,还要一种如下:

from concurrent.futures import ThreadPoolExecutor

start = time.time()
    with ThreadPoolExecutor(5) as t:
        for y in range(1996,2024):
            t.submit(get_info,y)
    end = time.time()
    print(f"使用线程池获取需要时间:{end - start}")

标签:name,text,year,tr,爬虫,线程,time,电影票房
From: https://www.cnblogs.com/xwltest/p/17060845.html

相关文章

  • 【并发编程】线程安全性问题
    文章目录1.什么是线程安全性2.原子性操作3.深入理解synchronized3.4.volatile关键字3.5.happens-before规则3.6.如何避免线程安全性问题1.什么是线程安全性当......
  • 【并发编程】线程的基础知识篇
    文章目录1.进程与线程的区别2.线程的状态相互转换3.创建线程的方式4.线程的挂起和恢复5.线程的中断操作6.线程的优先级7.守护线程1.进程与线程的区别(1)什么是......
  • jmeter添加全局变量,跨线程组传递参数
    在软件测试中,当我们想把某个变量值想设置为全局变量,也就是在任何一个线程组都可以使用该变量时,我们就要用到BeanShell取样器,示例如下:1.拿到某个接口的变量值2.通过BeanSh......
  • Python爬虫-第四章-2-协程与异步
    协程:    单线程执行多任务执行时,当执行中程序处于I/O期间,异步可以让CPU选择性的切换到其他任务上#DemoDescribe:协程importasyncioimporttime'''协程所针对的......
  • 【Python】爬虫笔记-开源代理池haipproxy使用
    大规模的数据采集需要用到代理池来突破IP封锁。一般代理池的构建是先爬取网上的免费代理,校验后存到数据库中,再提供给其他程序api。github上有很多现成的代理池能拿来用,在......
  • 小满nestjs(第二十章 nestjs 爬虫)
    其实爬虫是一个对计算机综合能力要求比较高的技术活。首先是要对网络协议尤其是 ​​http​​ 协议有基本的了解,能够分析网站的数据请求响应。学会使用一些工具,简单的情......
  • 多线程知识总结
    多线程1、线程简介1、关键字:任务、进程、进程、多线程2、普通方法调用和多线程3、核心概念线程是独立的执行路劲在程序运行时,及时没有自己创建线程,后台也会有......
  • 如何使用Java异步编程(多线程CompletableFuture)
    1、创建异步线程任务根据supplier创建CompletableFuture任务//使用内置线程ForkJoinPool.commonPool(),根据supplier构建执行任务publicstatic<U>CompletableFuture......
  • 简单几步快速完成爬虫任务
    #一、引入seleniumfromseleniumimportwebdriverfromtimeimportsleep#fromselenium.webdriver.chrome.optionsimportOptions#importxlrdimportcsvimportos#固定c......
  • 爬虫就应该这样学
    新人如何学习Python爬虫其实也很简单,根据之前学习的步伐,大体上分为四个阶段,这也是我学习爬虫的一些心得,下面我就将我详细学习Python爬虫所制定的学习路线分享给大家吧。......