python异步爬虫之多线程

多线程,多进程(不建议使用)
优点:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作可以异步执行
弊端:无法无限制开启多线程或多进程。
原则:线程池处理的是阻塞且耗时的操作

单线爬虫示例:

import time

def get_page(str):
    print("正在下载:",str)
    time.sleep(2)
    print('下载成功:',str)

name_list = ['aa','bb','cc','dd']

start_time = time.time()

for i in range(len(name_list)):
    get_page(name_list[i])
end_time = time.time()
print('%d second'% (end_time-start_time))

多线程爬虫示例:

import time
# 导入线程池模块对应的类
from multiprocessing.dummy import Pool

start_time = time.time()
def get_page(str):
    print("正在下载:",str)
    time.sleep(2)
    print('下载成功:',str)

name_list = ['aa','bb','cc','dd']

# 实例化一个线程池对象
pool = Pool(4)
# 将列表中每一个列表元素传递给get_page进行处理
pool.map(get_page,name_list)

end_time = time.time()
print(end_time-start_time)

案例:

# 多线爬虫示例
import requests
from lxml import etree
import re
from multiprocessing.dummy import Pool

headers = {
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Content-type':'application/json',
}
# 对下述url发起请求解析出视频详情页的url和视频的名称
url = "https://pearvideo.com/category_5"
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@id="listvideoListUl"]/li')
urls = [] #存储所有视频的链接
for li in li_list:
    detail_url = 'https://pearvideo.com/' + li.xpath('./div/a/@href')[0]
    name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4'
    # 对详情页的url发起请求
    detail_page_text = requests.get(url=detail_url,headers=headers).text
    # print(detail_url,name)
    # 从详情页中解析出视频的地址(url)
    id = re.findall(r'\d+', detail_url)[0]
#     https://pearvideo.com/videoStatus.jsp?contId=1751458&mrd=0.32392817067398805
    detail_vedio_url = 'https://pearvideo.com/videoStatus.jsp?contId='+id

    header1s = {
        'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
        'Content-type': 'application/json',
        'referer':detail_url
    }
    vedio_text = requests.get(url=detail_vedio_url,headers=header1s).json()
    # print(vedio_text)
    vedio_url = vedio_text['videoInfo']['videos']['srcUrl']
    dic = {
        'name': name,
        'url': vedio_url
    }
    urls.append(dic)
    print(vedio_url)
def get_video_data(dic):
    url = dic['url']
    print(dic['name'],'正在下载......')
    data = requests.get(url=url,headers=header1s).content
#   持久化存储操作
    with open(dic['name'],'wb') as fp:
        fp.write(data)
        print(dic['name'],'下载成功')
# 使用线程池对视频数据进行请求(较为耗时的阻塞操作)
pool = Pool(4)
pool.map(get_video_data,urls)

pool.close()
pool.join()

到此这篇关于python异步爬虫之多线程的文章就介绍到这了,更多相关python爬虫多线程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章带你了解Python的进程,线程和协程

    目录 线程 线程锁 threading.RLock和threading.Lock 的区别 threading.Event threading.Condition queue 队列 生产者消费者模型 进程 Server process 进程池 协程 总结 线程 Threading用于提供线程相关的操作.线程是应用程序中工作的最小单元,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. threading 模

  • Python基础学习之认识线程

    目录 一.什么是线程? 二.再来解释线程的代码 三.线程触发业务函数,线程调用业务函数 四.多了一个线程是哪个? 五.总结 一.什么是线程? 我们知道工人都是同时在工厂工作,复制各自的工作的.他们就是一个一个独立运行的单位! 线程也是类似这样的一个独立的运行单位,多线程,就是多个独立的运行单位,同时执行同样的事情. 简单这样理解,后面会进行对比. threading.Thread 类是Python中的线程类,它封装了线程的信息和一些同用的方法. 线程有状态,拿工人一天的状态来比喻很合适,早上上班

  • python多线程互斥锁与死锁

    目录 一.多线程间的资源竞争 二.互斥锁 1.互斥锁示例 2.可重入锁与不可重入锁 三.死锁 一.多线程间的资源竞争 以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(数据大一些,太小的话执行太快,达不到验证的效果). import threading import time num = 0 def task1(nums):     global num     for i in range(nums):         num += 1     pr

  • python教程之进程和线程

    目录 进程和线程的区别和联系 多进程 线程池 多线程 总结 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个概念,就难倒过不少初学者——今天学了概念,明天就忘记:明天学了例子,又忘记了概念. 要理解进程和线程的联系和区别,我举个特简单的例子: 你的电脑有两个浏览器,一个谷歌浏览器,一个qq浏览器. 一个浏览器就是一个进程. 然后,你打开了谷歌浏览器,百度搜索了测试奇谭,又新开一个标签页,打开谭叔的文章,如下图所示: 你可以这样理解——在同一个浏览器打开的两个网页就是

  • python多线程方法详解

    处理多个数据和多文件时,使用for循环的速度非常慢,此时需要用多线程来加速运行进度,常用的模块为multiprocess和joblib,下面对两种包我常用的方法进行说明. 1.模块安装 pip install multiprocessing pip install joblib 2.以分块计算NDVI为例 首先导入需要的包 import numpy as np from osgeo import gdal import time from multiprocessing import cpu_c

  • python多线程互斥锁与死锁问题详解

    目录 一.多线程共享全局变量 二.给线程加一把锁锁 三.死锁问题 总结 一.多线程共享全局变量 代码实现的功能: 创建work01与worker02函数,对全局变量进行加一操作创建main函数,生成两个线程,同时调用两个函数 代码如下: import threading result = 0 # 定义全局变量result def work1(num): global result for i in range(num): result += 1 print('------from work1--

  • python队列基本操作和多线程队列

    目录 一.队列基本操作 二.多线程队列 一.队列基本操作 from queue import Queue q = Queue(5)  # 创建一个容量为5的队列.如果给一个小于0的数,则队列为无限大小.(这是官方的解释,实际不是无限大小,而是跟内存有关) # 存储数据 q.put(123)  # 数值  q.put('hello world!')  # 字符串 q.put(['hello', 'world'])  # 列表 q.put(('hello', 'world'))  # 元组 q.pu

  • python异步爬虫之多线程

    多线程,多进程(不建议使用)优点:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作可以异步执行弊端:无法无限制开启多线程或多进程.原则:线程池处理的是阻塞且耗时的操作 单线爬虫示例: import time def get_page(str):     print("正在下载:",str)     time.sleep(2)     print('下载成功:',str) name_list = ['aa','bb','cc','dd'] start_time = time.time(

  • Python异步爬虫多线程与线程池示例详解

    目录 背景 异步爬虫方式 多线程,多进程(不建议) 线程池,进程池(适当使用) 单线程+异步协程(推荐) 多线程 线程池 背景 当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),存在等待的时间,这样效率是很低的.那我们能不能在发送请求等待的时候,为其单独开启进程或者线程,继续请求下一个url,执行并行请求 异步爬虫方式 多线程,多进程(不建议) 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行 弊端:不能无限制开

  • Python异步爬虫实现原理与知识总结

    一.背景 默认情况下,用get请求时,会出现阻塞,需要很多时间来等待,对于有很多请求url时,速度就很慢.因为需要一个url请求的完成,才能让下一个url继续访问.一种很自然的想法就是用异步机制来提高爬虫速度.通过构建线程池或者进程池完成异步爬虫,即使用多线程或者多进程来处理多个请求(在别的进程或者线程阻塞时). import time #串形 def getPage(url): print("开始爬取网站",url) time.sleep(2)#阻塞 print("爬取完成

  • Python异步爬虫requests和aiohttp中代理IP的使用

    爬虫要想爬的好,IP代理少不了..现在网站基本都有些反爬措施,访问速度稍微快点,就会发现IP被封,不然就是提交验证.下面就两种常用的模块来讲一下代理IP的使用方式.话不多说,直接开始. requests中代理IP的使用: requests中使用代理IP只需要添加一个proxies参数即可.proxies的参数值是一个字典,key是代理协议(http/https),value就是ip和端口号,具体格式如下. try: response = requests.get('https://httpbin

  • python实现爬虫统计学校BBS男女比例之多线程爬虫(二)

    接着第一篇继续学习. 一.数据分类 正确数据:id.性别.活动时间三者都有 放在这个文件里file1 = 'ruisi\\correct%s-%s.txt' % (startNum, endNum) 数据格式为293001 男 2015-5-1 19:17 没有时间:有id.有性别,无活动时间 放这个文件里file2 = 'ruisi\\errTime%s-%s.txt' % (startNum, endNum) 数据格式为2566 女 notime 用户不存在:该id没有对应的用户 放这个文件

  • Python网络爬虫中的同步与异步示例详解

    一.同步与异步 #同步编程(同一时间只能做一件事,做完了才能做下一件事情) <-a_url-><-b_url-><-c_url-> #异步编程 (可以近似的理解成同一时间有多个事情在做,但有先后) <-a_url-> <-b_url-> <-c_url-> <-d_url-> <-e_url-> <-f_url-> <-g_url-> <-h_url-> <--i_ur

  • Python中利用aiohttp制作异步爬虫及简单应用

    摘要: 简介 asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块.关于asyncio模块的介绍,笔者会在后续的文章中加以介绍,本文将会讲述一个基于asyncio实现的HTTP框架--aiohttp,它可以帮助我们异步地实现HTTP请求,从而使得我们的程序效率大大提高. 简介 asyncio可以实现单线程并发IO操作,是Python中常用的异步处理模块.关于asyncio模块的介绍,笔者会在后续的文章中加以介绍,本文将会讲述一个基于asyncio实现的HTTP框架--ai

  • python爬虫中多线程的使用详解

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性. #多线程实战栗子(糗百) #用一个队列Queue对象, #先产生所有url,put进队列: #开启多线程,把q

  • Python爬虫利用多线程爬取 LOL 高清壁纸

    目录 页面分析 抓取思路 数据采集 程序运行 总结 前言: 随着移动端的普及出现了很多的移动 APP,应用软件也随之流行起来. 最近又捡起来了英雄联盟手游,感觉还行,PC 端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何,那今天我们使用到多线程的方式爬取 LOL 官网英雄高清壁纸. 页面分析 目标网站:英雄联盟 官网界面如图所示,显而易见,一个小图表示一个英雄,我们的目的是爬取每一个英雄的所有皮肤图片,全部下载下来并保存到本地. 次级页面 上面的页面我们称为主页面,次级页面也就是每一个

  • python 基于aiohttp的异步爬虫实战详解

    目录 引言 aiohttp是什么 requests和aiohttp区别 安装aiohttp aiohttp使用介绍 基本实例 URL参数设置 请求类型 响应的几个方法 超时设置 并发限制 aiohttp异步爬取实战 总结 引言 钢铁知识库,一个学习python爬虫.数据分析的知识库.人生苦短,快用python. 之前我们使用requests库爬取某个站点的时候,每发出一个请求,程序必须等待网站返回响应才能接着运行,而在整个爬虫过程中,整个爬虫程序是一直在等待的,实际上没有做任何事情. 像这种占用

随机推荐