爬虫高性能相关

高性能相关

如何实现多个任务的同时进行 而且还效率高

串行实现

效率最低最不可取

import requests

urls = [
    ‘http://www.baidu.com/‘,
    ‘https://www.cnblogs.com/‘,
    ‘https://www.cnblogs.com/news/‘,
    ‘https://cn.bing.com/‘,
    ‘https://stackoverflow.com/‘,
]

for url in urls:
    response = requests.get(url)
    print(response)

多线程

多线程存在线程利用率不高的问题

import requests
import threading

urls = [
    ‘http://www.baidu.com/‘,
    ‘https://www.cnblogs.com/‘,
    ‘https://www.cnblogs.com/news/‘,
    ‘https://cn.bing.com/‘,
    ‘https://stackoverflow.com/‘,
]

def task(url):
    response = requests.get(url)
    print(response)

for url in urls:
    t = threading.Thread(target=task,args=(url,))
    t.start()

协程+IO切换

gevent内部调用greenlet(实现了协程)

基于协程比线程更加省资源

from gevent import monkey; monkey.patch_all()
import gevent
import requests

def func(url):
    response = requests.get(url)
    print(response)

urls = [
    ‘http://www.baidu.com/‘,
    ‘https://www.cnblogs.com/‘,
    ‘https://www.cnblogs.com/news/‘,
    ‘https://cn.bing.com/‘,
    ‘https://stackoverflow.com/‘,
]
spawn_list = []
for url in urls:
    spawn_list.append(gevent.spawn(func, url))    # 创建协程 

gevent.joinall(spawn_list)

事件循环

基于事件循环的异步非阻塞模块:Twisted

from twisted.web.client import getPage, defer
from twisted.internet import reactor

def stop_loop(arg):
    reactor.stop()

def get_response(contents):
    print(contents)

deferred_list = []

url_list = [
    ‘http://www.baidu.com/‘,
    ‘https://www.cnblogs.com/‘,
    ‘https://www.cnblogs.com/news/‘,
    ‘https://cn.bing.com/‘,
    ‘https://stackoverflow.com/‘,
]

for url in url_list:
    deferred = getPage(bytes(url, encoding=‘utf8‘)) # 拿到了要爬取的任务,并没有真正的执行爬虫
    deferred.addCallback(get_response)    # 要调用的回调函数
    deferred_list.append(deferred) # 将所有的任务加入带一个列表里面

dlist = defer.DeferredList(deferred_list)    # 检测所有的任务是否都被循环
dlist.addBoth(stop_loop)    # 如果列表中的任务都完成了就停止循环,执行停止的函数 

reactor.run()

原文地址:https://www.cnblogs.com/shijieli/p/10360799.html

时间: 2024-11-09 10:24:41

爬虫高性能相关的相关文章

爬虫高性能相关(主要基于异步io)

一背景常识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,采用串行的方式执行,只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是:串行并不意味着低效,如果串行的都是纯计算的任务,那么cpu的利用率仍然会很高,之所以爬虫程序的串行低效,是因为爬虫程序是明显的IO密集型程序. 关于IO模型详见链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html 那么该如何提高爬取性能呢? 二同步,异

python之路 -- 爬虫 -- 高性能相关

高性能爬虫方案: 多进程 多线程 利用"异步非阻塞"模块实现单线程并发请求. 本质 1 sk = socket() 2 # 阻塞 3 sk.connect(('www.cnblogs.com',80)) 4 5 sk.sendall(b"GET /wupeiqi http1.1\r\n.....\r\n\r\n") 6 sk.sendall(b"POST /wupeiqi http1.1\r\n.....\r\n\r\nuser=alex&pwd=

如何提升爬虫性能相关的知识点

如何提升爬虫性能相关的知识点 爬虫的本质是伪造socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个url结束后才能继续下一个,这样我们就会发现效率非常低. 原因:爬虫是一项IO密集型任务,遇到IO问题就会阻塞,CPU运行就会停滞,直到阻塞结束.那么在CPU等待组合结束的过程中,任务其实是呈现出卡住的状态.但是,如果在单线程下进行N个任务且都是纯计算的任务的话,那么该线程对cpu的利用率仍然会很高,所以单线程下串行多个计算密集型任务

爬虫安装相关软件

我们用到的第三方库有 Requests.Selenium.Aiotttp 等. 进行爬虫安装相关软件说明; 参考文档:https://germey.gitbooks.io/python3webspider/content/1.2.1-Requests%E7%9A%84%E5%AE%89%E8%A3%85.html requests安装: 1. 相关链接 GitHub:https://github.com/requests/requests PyPy:https://pypi.python.org

爬虫性能相关

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

网络爬虫的相关综述

前言:对网络爬虫很感兴趣 —————————————————————————————————————————————— 一.网络爬虫的工作原理 1.1等同于浏览器访问网页的工作原理.(详细情况见本文末尾博文链接) (1)是一种真人的行为驱动 (2)通过浏览器来自动执行人为的动作,将动作自动程序化. 1.2网络爬虫就是将浏览器访问网页的过程,再次抽象成了程序. 二.网络爬虫的分类 2.1通过链接的访问层次先后来分:宽度优先和广度优先 宽度优先:在下载网页链接时,是一层一层的通过链接来爬取: 广度优

爬虫-高性能异步爬虫

异步爬虫方式 目的:在爬虫中使用异步实现高性能的数据爬取操作 异步爬虫方式: 多进程,多线程(不建议) 好处:可以为先关阻塞操作单独开启进程或者线程,阻塞操作就可以异步执行 坏处:无法无限制开启 线程池,进程池(适当使用) 好处:可以降低系统对进程或者线程创建和销毁的评率,进而降低系统开销 坏处:池中线程或进程的数量有上线 单线程+异步协程(推荐) event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上, 当满足某些条件的时候,函数就会被循环执行. corou

爬虫请求相关

urllib.request import urllib.request url = 'http://www.baidu.com/' response = urllib.request.urlopen(url).read() #使用urllib.request.urlopen可以读取网页内容 import urllib.request url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec

Scrapy 框架,爬虫文件相关

Spiders 介绍 由一系列定义了一个网址或一组网址类如何被爬取的类组成 具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. 简单来说就是帮助你爬取数据的地方 内部行为 #1.生成初始的Requests来爬取第一个URLS,并且标识一个回调函数 第一个请求定义在start_requests()方法内默认从start_urls列表中获得url地址来生成Request请求默认的回调函数是parse方法.回调函数在下载完成返回response时自动触发 #2.在回调函数中,解析respons