利用协程爬取某网站

利用协程爬取m3u8视频 利用协程爬取m3u8视频 ​ 在进行了爬虫的相关学习之后,自己尝试爬取了一些视频,但动辄ts文件就几百个,单线程伤不起那时间,一个一个等实在太慢了,想利用多线程,查看相关资料,又说python是假的多线程,而且爬取视频这操作也属于IO阻塞操作多的那种,感觉时间提升也不大,多线程和多进程还有协程,协程挺适合这种的,就毅然决然的使用协程了。注:各位大佬轻喷 一.查看网站并分析 1.找到各集数对应网站 首先理清爬取思路,对我这种刚入门的菜鸡来说,爬视频就是看它是不是mp4,或者是不是m3u8格式的,但如标题所言, 阅读详情

爬取详情页

import gevent
from gevent import monkey
monkey.patch_all()
import requests
import redis
from queue import Queue
import json

# 定义一个函数用于请求每一个id对应的详情页
def request_detail(poiId_queue,comment_queue):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    # 4567条   350
    # 定义一个列表,处理协程
    g_list = []
    for i in range(len(poiId_queue)):
        # 评论url
        comment_url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?id=%d&offset=%d&pageSize=%d"
        # 每次抓取300条
        # 对于大于300的部分,取整作为总页数,对于小于300的部分取余作为余页中评论中的条数
        totalPage = int(comment_queue[i]/300)
        moreComment = comment_queue[i]%300
        if totalPage != 0:
            for page in range(0,totalPage):
                # 拼接url
                page_url = comment_url%(poiId_queue[i],page*300,300)
                print("正在请求:",page_url)
                g = gevent.spawn(func,page_url,headers,poiId_queue[i])
                # res = requests.get(url=page_url,headers=headers)
                g_list.append(g)
        if moreComment != 0:
                # 拼接url
                page_url = comment_url%(poiId_queue[i],(page+1)*300,moreComment)
                print("正在请求:",page_url)
                g = gevent.spawn(func, page_url, headers,poiId_queue[i])
                # res = requests.get(url=page_url,headers=headers)
                g_list.append(g)
        gevent.joinall(g_list)
# 定义一个函数,用于处理协程
def func(url,headers,poiId):
    res = requests.get(url=url,headers=headers)
    # 解析存储
    try:
        c_dict = json.loads(res.text)
        # 取出评论列表
        c_list = c_dict["data"]["comments"]
        # print(c_list)
        for c in c_list:
            item = {}
            item["poiId"] = poiId # 商户的Id
            item["user"] = c["userName"]
            item["comment"] = c["comment"]
            print(item)
            #   存入redis数据库
            print("%s已经存入redis数据库!"%item["user"])
            rds.lpush("foodComments",json.dumps(item))
    except Exception as e:
        print("该商家暂无评论信息!")


if __name__ == '__main__':
    # 1、从redis数据库中将详情页的id值提取出来放入到一个队列中
    rds = redis.StrictRedis(host="*******",port=6379,db=8)
    lens = rds.llen("foodlist")
    foodlist = rds.lrange("foodlist",0,lens )
    food_id_queue = []
    # 创建一个队列,用于存储评论的条数
    comment_queue = []
    for food in foodlist:
        # print(food)
        food_dict = json.loads(food)
        # food_dict["poiId"]
        food_id_queue.append(food_dict["poiId"])
        comment_queue.append(food_dict["comments"])

    # 调用详情页请求
    request_detail(poiId_queue=food_id_queue,comment_queue=comment_queue)

爬取主页面

import requests
import re
import threading
from time import sleep
import redis
from queue import Queue
import json

# 封装一个爬虫类,采用多线程机制
class CrawlThread(threading.Thread):
    def __init__(self,start_url,page_queue,data_queue,name):
        super().__init__()
        self.start_url = start_url
        self.page_queue = page_queue
        self.data_queue = data_queue
        self.name = name

    def run(self):
        # 1)取页面编号 2)组合url发起请求 3)将响应的数据放入数据队列中
        # 问题:run函数由于是系统的回调函数,我们无法获取取返回值,我们如何从run函数中提取出请求的html页面源码?
        while True:
            if self.page_queue.empty():
                break
            # 出队一个编号
            page = self.page_queue.get()
            # 拼接url
            url = self.start_url + "pn" + str(page) + "/"
            # 发起请求
            print("当前线程为:%s,正在请求页面:%s"%(self.name,url))
            res = requests.get(url=url,headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'})
            # 取出res中的html字符串,加入到数据队列中
            self.data_queue.put(res.text)
            print("当前已经入队了%d个页面"%self.data_queue.qsize())
            sleep(1)

# 定义一个解析类,采用多线程机制
class ParseThread(threading.Thread):
    def __init__(self,data_queue,name,page_queue):
        super().__init__()
        self.data_queue = data_queue
        self.name = name

    def run(self):
        while True:
            if self.data_queue.empty():
                continue
            # 1、从数据队列中取出一个页面的html
            html = self.data_queue.get()
            # 2、解析数据
            self.parse(html)
            # 3、判断所有的页面是否全部处理完,如果处理完了就退出当前线程
            if page_queue.empty():
                break
    # 封装一个函数用于解析
    def parse(self,html):
        # 用正则表达式将美食店列表json字符串匹配出来
        pat = re.compile(r'"poiLists":(.+),"comHeader"')
        s = pat.findall(html)[0]
        # print(s)
        # 将json字符串转成字典
        jsondict = json.loads(s)
        foodlist = jsondict["poiInfos"]
        # print(foodlist)
        # 解析美食的内容
        for food in foodlist:
            item = {}
            item["poiId"] = food["poiId"]
            item["title"] = food["title"]
            item["avgScore"] = food["avgScore"]
            item["avgPrice"] = food["avgPrice"]
            item["address"] = food["address"]
            rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=13)
            print("当前线程为:%s,正在向redis数据库中存入数据:%s"%(self.name,item['title']))
            rds.lpush("foodlist",json.dumps(item))


if __name__ == '__main__':
    start_url = "https://bj.meituan.com/meishi/"
    # 定义一个队列,用于保存待爬取的页面的编号
    page_queue = Queue()
    for i in range(1,68):
        page_queue.put(i)
    # 定义一个队列,用于保存每次爬虫线程请求出来的网页源码
    data_queue = Queue()

    # 创建3个爬虫线程来开启并发的对67个页面进行抓取
    crawl_names = ["爬虫1","爬虫2","爬虫3"]
    for name in crawl_names:
        t = CrawlThread(start_url=start_url,page_queue=page_queue,data_queue=data_queue,name=name)
        t.start()
    # 创建3个解析线程
    parse_name = ["解析1","解析2","解析3"]
    for name in parse_name:

        t = ParseThread(data_queue=data_queue,name=name,page_queue=page_queue)
        t.start()
Python小爬虫之协程爬虫快速上手 文章目录前言协程协程快速上手协程异步运行工作流程任务管理aiohttp异步保存异步回调 前言 爬虫是个好东西,最近要用用这玩意,所以顺便把以前的小东西给发出来,水几篇博客~ 协程 首先明确一点,线程不是多线程,线程本质上还是单线程,但是这个线程的特点是当当前线程进入到IO状态的时候,CPU会自动切换任务从而提高系统的整体运行效率。没错这个协程其实就和操作系统的多道处理机制是一样的。实现的效果有点类似使用多线程,或者线程池,但是协程是更加轻量级的,本质上就是一个单线程在来回切换。 协程快速上手 那么接下来我们 阅读详情

相关推荐

python爬虫案例——使用aiohttp模块异步请求网站,利用协程加快爬取速度(17)

本篇文章主要通过一个爬虫小案例来教会大家如何使用协程来编写代码,加快爬取数据的速度;由于请求网站时使用的requests模块发起的是同步请求,无法与协程相配合达到加快程序运行速度的目的;所以我们需要学习一个新的模块aiohttp,该模块用于发送异步请求;与协程配合可以大大缩短程序运行的时间。

@优快云盲敲代码的阿豪的博客 656

python爬虫 --协程

协程,相较线程来说更加轻量级的;它不被操作系统的内核所管理,完全由程序所控制,不需要CPU内核的切换,也能实现并发。

weixin_53333436的博客 1172

python3爬虫中异步协程的用法

在本篇文章里小编给大家整理的是关于python3爬虫中异步协程的用法,需要的朋友们可以学习参考下。

python学习笔记(八)协程、爬取网页

协程又叫微线程,但与线程是完全不同的概念。线程之间是并发的,开发者不知道它们在什么时候切换;而协程是属于一个线程的,它们之间的切换开发者是明确的。在介绍完协程后会给出一个使用urllib爬取网页中图片的地址的例子演示协程。

君浪的博客 1099

python协程gevent案例 爬取斗鱼图片过程解析

主要介绍了python协程gevent案例 爬取斗鱼图片过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

超声波清洗机拆解实录:从电路板到换能器,一文看懂内部构造(附高清图)

本文详细拆解了超声波清洗机的内部构造,从电路板设计到换能器工作原理,揭示了其核心技术。通过高清图片和详细分析,展示了功率放大电路、高频变压器及压电换能器等关键部件,为电子爱好者和维修技术人员提供了实用的故障诊断和元件二次利用指南。

grape的博客 1183

python使用异步协程爬取图片

异步操作,爬取图片内容

wanggaoxingH的博客 930

Element Server Suite社区版Helm部署:私有Matrix聊天服务器快速搭建指南

在云原生和微服务架构日益普及的今天,容器化部署已成为现代应用交付的标准范式。Kubernetes作为容器编排的事实标准,通过声明式配置和自动化管理,极大地简化了复杂分布式系统的部署与运维。Helm作为Kubernetes的包管理器,通过预定义的Chart模板,将应用及其依赖打包,实现了真正的“一键部署”,显著提升了部署效率和可重复性。这种技术组合的价值在于,它让开发者能够专注于业务逻辑,而非底层基础设施的复杂性,尤其适用于需要快速搭建、易于维护的服务场景。Element Server Suite Commu

weixin_42610010的博客 300

python:多协程爬取数据(队列)

一、知识点理解 异步:在一个任务未完成时,就可以执行其他多个任务,彼此不受影响。 同步:一个任务结束后才能启动下一个。 比较:异步执行任务会比同步更节省时间,能减少不必要的等待。 多协程(非抢占式异步技术):一个任务在执行过程中,如果遇到等待,就先去执行其他的任务,当等待结束,再回来继续之前的任务。在计算机的世界中这些任务的回切速度非常迅速,看上去就像多个任务被同时执行一样。 要求:实现多个爬虫同时执行任务,实现异步的爬虫方式。 二、多协程爬虫实现 前提:安装gevent库:pip install geve

qq_39408590的博客 730

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 947

【转载】参数估计(Parameter Estimation):频率学派(最大似然估计MLE、最大后验估计MAP)与贝叶斯学派(贝叶斯估计BPE)

基础 频率学派与贝叶斯学派 http://www.douban.com/group/topic/16719644/ http://www.zhihu.com/question/20587681 最大似然估计(Maximum likelihood estimation,MLE) http://baike.baidu.com/view/1918804.htm http://baike.baidu.co

影 的专栏 3413

利用python的协程和队列爬取网站小说

from gevent import monkey monkey.patch_all()#把程序变成协作式运行模式,这样就能实现程序异步 import requests,time,gevent,csv,random from gevent.queue import Queue from bs4 import BeautifulSoup #以上引入需要的库和模块,gevent帮我们实现多协程;tim...

weixin_30662847的博客 329

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

H5调用公共获取图片文件方法,在android手机端,H5主要依赖Webview,这边在webview声明并重写该方法onShowFileChooser使用工具类打开相机或相册,可以两种方式安卓原生方式或者利用第三方组件库方式选中图片,返回uri列表给H5H5收到uri照片列表,并且使用前端方式展示创造价值,乐哉分享!

m0_74823947的博客 3096

Python利用gevent协程和xpath正则表达式来爬取某一网站的图片

爬虫 lxml xpath 网站图片 python 保存

爱学习的JackYang的博客 507

安检机图像处理避坑指南:从条纹校正到物质分类,那些论文里没写的工程细节

本文深入探讨了双能X射线安检机图像处理中的关键工程实践,从条纹校正到物质分类,揭示了论文中未提及的实用技巧。针对探测器校正、物质分类模糊、伪彩色系统设计等核心问题,提供了动态参数更新、空间上下文分析和自适应色彩映射等解决方案,助力提升安检系统的准确性和鲁棒性。

weixin_30325487的博客 888

欧姆龙OMRON PLC之HostLink通讯协议(四)-FINS命令进阶应用与调试技巧

本文深入探讨欧姆龙OMRON PLC的HostLink通讯协议中FINS命令的进阶应用与调试技巧。文章聚焦实战排错,详细解析命令帧解剖、响应帧解读与网络抓包三大核心方法,并分享性能优化策略,如合并读写与异步设计。同时介绍了强制操作、多存储区访问等高级命令的应用场景,旨在帮助工程师高效解决现场通讯问题,提升系统稳定性与效率。

nept的博客 750

python中data.find_all爬取网站为空列表_利用Python 多协程和队列爬取豆瓣图书

基本思路了解豆瓣图书网页结构导入相关模块包gevent、request、BeautifulSoup、csv使用monkey.patch_all()方法变成协作式运行利用request获取网页响应内容利用BeautifulSoup解析网页内容,并提取所需的标签内容创建队列对象,利用队列相应的方法,创建多任务执行保存为CSV文件格式点击此处,获取海量Python学习资料!爬取豆瓣图书​利用多协程和队列...

weixin_39939276的博客 242

Unity开发HoloLens应用:从打包到部署的完整指南

本文为Unity开发者提供了将应用部署到HoloLens设备的完整实战指南。详细讲解了从环境准备、Unity项目配置、生成Visual Studio工程,到最终构建APPX安装包并通过设备门户或Visual Studio进行部署的全流程,帮助开发者高效完成混合现实应用的打包与安装。

red88的博客 1019

python实战之利用协程爬取壁纸

电脑该换壁纸了,教你如何爬取壁纸网站。

2401_84097724的博客 591

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python爬虫笔记——多协程(gevent and queue)

1、爬取8个网站(包括百度、新浪、搜狐、腾讯、网易、爱奇艺、天猫、凤凰)。用多协程来爬取。 from gevent import monkey #从gevent库里导入monkey模块。 monkey.patch_all() #monkey.patch_all()能把程序变成协作式运行,就是可以帮助程序实现异步。 import gevent,time,requests #导入gevent、time、requests。 start = time.time() #记录程序开始时间。 url_list = [

Fo*(Bi)的博客 1185

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

多协程爬虫

要实现异步的爬虫方式的话,需要用到多协程。 一.gevent库 同步的爬虫方式爬取这8个网站 : import requests,time #导入requests和time start = time.time() #记录程序开始时间 url_list = ['https://www.baidu.com/', 'https://www.sina.com.cn/', 'http://www.sohu.com/', 'https://www.qq.com/', 'https://www...

SpringBears的博客 478

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python协程

这里写目录标题啰嗦两句协程实例找到数据解析数据和提取数据保存数据认识协程翻页 啰嗦两句 习惯性啰嗦两句,不论在学习的过程中遇到什么困难,请尽力去解决它,虽然眼下不如意,但是真的要相信越努力的越幸运,只有努力了才能把握机会。我也是小白,也是刚刚起步编程的路上,我觉得不管你现在怎样,最重要的还是看态度问题,你是不是真的想把事情做好,有没有努力去做。自我开始写博客,朋友看了说你写又没人看,为什么还要写呢?我在意的不是有多少人看,而在意的是能否坚持,余晖的某个角落,就是我在偷偷学习的地方。听到最多的就是,你不行,我

qq_51604151的博客 210

如何用协程扒光一部小说

用协程爬取一部小说

2403_87530627的博客 931

python多协程爬虫示例

写python协程时使用gevent模块和queue模块可以大大提高爬虫速度。在同时爬取多个网站时,原来用for循环一个网站一个网站按循序顺序爬,就像先烧饭后烧菜,两个步骤异步进行。使用多协程可以让爬虫自己选择爬取顺序,就像边烧饭边烧菜,两个步骤同步进行,速度自然快了。不多说了,来看下代码吧: from gevent import monkey monkey.patch_all() #打上多协程布...

chengduan37102900的博客 536

记录-爬取智联招聘

最近准备找工作了,想从智联上爬一下青岛和上海的python和java相关岗位信息,所以决定写个爬虫,记录一下。 前戏 正式开搞之前先揉捏一下要爬取的智联的搜索界面: 1、动态还是静态? 2、url,headers,params? 1、动态还是静态? 首先是第一个问题,F12找了一下需要爬取的信息在class="contentpile"的div中。 源代码中看了一眼,发现里面除了有个加载中显示的图...

DDua_CN的博客 1219

Python使用协程的方式调用爬虫去爬取相应的网站

from gevent import monkey # monkey.patch_all() import gevent from urllib.request import urlopen def f(url): print('GET:%s' % url) resp = urlopen(url) data = resp.read() # with ope...

软件测试老痞 339
上一篇: Scrapy框架基础
下一篇: greenlet实现协程
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值