一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低。 需要强调的是:对于单线程下串行N个任务,并不完全等同于低效,如果这N个任务都是纯计算的任务,那么该线程对cpu的利用率仍然会很高,之所以单线程下串行多个爬虫任务低效,是因为爬虫任务是明显的IO密集型程序。 关于IO模型详见链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html 那么该如何提高爬取性能呢?且看下述概念 二 同步、异步、回调机制 1、同步调用:即提交一个任务后就在原地等待任务结束,等到拿到任务的结果后再继续下一行代码,效率低下 123456789101112131415import requestsdef parse_page(res): print('解析 %s' %(len(res)))def get_page(url): print('下载 %s' %url) re ...
Python
未读paramiko 一 介绍 12## 用于帮助开发者通过代码远程连接服务器,并对服务器进行操作。## pip3 install paramiko 二 通过用户名密码方式远程执行命令 12345678910111213141516171819import paramiko## 创建SSH对象ssh = paramiko.SSHClient()## 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())## 连接服务器ssh.connect(hostname='192.168.16.85', port=22, username='root', password='123456')## 执行命令stdin, stdout, stderr = ssh.exec_command('df')## 获取命令结果result = stdout.read()## 关闭连接ssh.close()print(result.d ...
Python
未读安装 1pip3 install pymysql 一 链接、执行sql、关闭(游标) 123456789101112131415161718192021222324import pymysqluser=input('用户名: ').strip()pwd=input('密码: ').strip()##链接conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')##游标cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示##cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)##执行sql语句sql='select * from userinfo where name="%s" and password=& ...
Python
未读b287d1b6e0bad61174d643199e7e340519a5ff6f3823822d82f8204f2dd22dcf75b6407adea6c9d9cc3ff389a6cb4796d77d962554297568dd336151faec49a9ebbdc334a6c4e91773e3220f4b528af4bd601bff42ae9637cff7c3b20e3978068ed5a60431d61370afb0bae3f228661303436f83e1c1887b187378a5fcef2783f031ce6c6f29b2bf8e9458256cf39b12d4acdb8742fea244ada11c8dfee96cf8f9a8bc59c9e393bd59dea51356c719be000ed190af83be8cce57f0c026d913e8b59a506750dad1e2065a8d7a486c39641f5fe1e99d8c781e45f9cc8e19bffe168596fb33e4ca492089952e4db116ef8e1b92895fbcc6c64de ...
##Beautifulsoup模块 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.你可能在寻找 Beautiful Soup3 的文档,Beautiful Soup 3 目前已经停止开发,官网推荐在现在的项目中使用Beautiful Soup 4, 移植到BS4 12345678910111213141516171819#安装 Beautiful Souppip install beautifulsoup4#安装解析器Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml:$ apt-get install Python-lxml$ easy_install lxml$ pip install lxml另一个可供选择的解析器是纯Python实现的 html5lib , html5lib的解析方 ...
Python HTTP库之requests模块 一、介绍 requests 是一个用于发送 HTTP 请求的 Python 库,其 API 比较简洁,使用起来比 urllib 更加便捷(本质是封装了 urllib3)。 注意事项 requests 库发送请求将网页内容下载下来以后,并不会执行 JavaScript 代码,这需要我们自己分析目标站点然后发起新的请求。 在正式学习 requests 前,建议先熟悉 HTTP 协议 安装 1pip3 install requests 常见请求方式 GET 和 POST 是最常用的请求方式。 其他请求方式包括 PUT, DELETE, HEAD, OPTIONS。 12345678910111213141516171819import requests# GET 请求r = requests.get('https://api.github.com/events')# POST 请求r = requests.post('http://httpbin.org/post', data={ ...
下载任意哔哩哔哩视频 一 寻找任意一个视频地址 例如这个: 拿出窗口中的链接:https://www.bilibili.com/video/av76609390,修改源代码中的url即可完成下载 1##由于哔哩哔哩视频音频是分开的,所以下来下来的视频是两个,一个音频,一个视频,要视频和音频合成,可看另一偏博客 二 分析页面 这个地址加载后会有该视频的视频信息和清晰度等信息,我们只需要取出视频和音频的地址,直接下载即可, 下面这两个地址就是一个视频,一个音频,分片下载的 我们用requests模块模拟即可,打开文件不停的发送请求加载数据写入即可 12345678910111213141516171819202122232425262728def download_video(old_video_url, video_url, audio_url, video_name): headers.update({"Referer": old_video_url}) print("开始下载视频:%s" % video_n ...
Python
未读requests 模块 介绍 1234567891011121314151617##介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)##注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求##安装:pip3 install requests##各种请求方式:常用的就是requests.get()和requests.post()>>> import requests>>> r = requests.get('https://api.github.com/events')>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})>>> r = requests.p ...
大白话布隆过滤器 不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,仿佛身在互联网,做着开发的,无人不知,无人不晓,哪怕对技术不是很关心的小伙伴也听过它的名号。我也花了不少时间去研究布隆过滤器,看了不少博客,无奈不是科班出身,又没有那么聪明的头脑,又比较懒…经过“放弃,拿起,放弃,拿起”的无限轮回,应该算是了解了布隆过滤器的核心思想,所以想给大家分享下。 布隆过滤器的应用 我们先来看下布隆过滤器的应用场景,让大家知道神奇的布隆过滤器到底能做什么。 缓存穿透 我们经常会把一部分数据放在Redis等缓存,比如产品详情。这样有查询请求进来,我们可以根据产品Id直接去缓存中取数据,而不用读取数据库,这是提升性能最简单,最普遍,也是最有效的做法。一般的查询请求流程是这样的:先查缓存,有缓存的话直接返回,如果缓存中没有,再去数据库查询,然后再把数据库取出来的数据放入缓存,一切看起来很美好。但是如果现在有大量请求进来,而且都在请求一个不存在的产品Id,会发生什么?既然产品Id都不存在,那么肯定没有缓存,没有缓存,那么大量的请求都怼到数据库,数据库的压力一下子就上来了,还有可能把数据库打死 ...