Database
未读一 简介 MongoDB是一款强大、灵活、且易于扩展的通用型数据库 1、易用性 1234MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库。不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。由于没有固定的模式,根据需要添加或删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。 2、易扩展性 123456应用程序数据集的大小正在以不可思议的速度增长。随着可用带宽的增长和存储器价格的下降,即使是一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出了很多数据库的处理能力。过 ...
一 目标站点分析 123456789101112131415161718192021222324252627282930313233343536373839404142434445#一:实验前准备: 浏览器用Chrome 用Ctrl+Shift+Delete清除浏览器缓存的Cookie 打开network准备抓包,点击Preserve log保留所有日志#二:拉勾网验证流程: 1、请求登录页面: 请求url为:https://passport.lagou.com/login/login.html 请求头并没有什么内容,带上简单的Host,User-Agent把自己伪装成浏览器即可 响应头里包含有效的cookie信息 Set-Cookie:JSESSIONID=ABAAABAAADGAACFC0077EDC55EEC248392A667B221CE7AB; Path=/; HttpOnly Set-Cookie:user_trace_token=201711041 ...
Python
未读12345678910111213141516171819202122232425262728293031323334## requests+Beautifulsoup爬取汽车之家新闻import requestsfrom bs4 import BeautifulSoupresponse=requests.get('https://www.autohome.com.cn/news/')response.encoding='gbk'with open('a.html','w',encoding='utf-8') as f: f.write(response.text)soup=BeautifulSoup(response.text,'lxml')news=soup.find(id='auto-channel-lazyload-article').select('ul li a')for tag in news: lin ...
一 介绍 一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下 但一些网站加入了滑动验证码,最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/,下图是极验的登录界面 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家企业正在使用极验,每天服务响应超过四亿次,广泛应用于直播视频、金融服务、电子商务、游戏娱乐、政府企业等各大类型网站 对于这类验证,如果我们直接模拟表单请求,繁琐的认证参数与认证流程会让你蛋碎一地,我们可以用selenium驱动浏览器来解决这个问题,大致分为以下几个步骤 123456789101112131415#步骤一:点击按钮,弹出没有缺口的图片#步骤二:获取步骤一的图片#步骤三:点击滑动按钮,弹出带缺口的图片#步骤四:获取带缺口的图片#步骤五:对比两张图片的所有RBG像素点,得到不一样像素点的x值,即要移动的距离#步骤六:模拟人的行为习惯(先匀加速拖动后匀减速拖动),把需要拖动的总距离分成一段一段 ...
一 介绍 原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址) 所以实现分布式爬取的关键就是,找一台专门的主机上运行一个共享的队列比如Redis, 然后重写Scrapy的Scheduler,让新的Scheduler到共享队列存取Request,并且去除重复的Request请求,所以总结下来,实现分布式的关键就是三点: 123##1、共享队列##2、重写Scheduler,让其无论是去重还是任务都去访问共享队列##3、为Scheduler定制去重规则(利用redis的集合类型) 以上三点便是scrapy-redis组件的核心功能 12345##安装:pip3 install scrapy-redis##源码:D:\python3.6\Lib\site-packages\scrapy_redis 二 scrapy-redis组件 1、只使用scrapy-redis的去重功能 使用共享去重队列+源码分析 1234567891011121314151617181920212223242526272 ...
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架。因此Scrapy使用了一种非阻塞(又名异步)的代码来实现并发。整体架构大致如下 The data flow in Scrapy is controlled by the execution engine, and goes like this: The Engine gets the initial Requests to crawl from the Spider. The Engine schedules the Requests in the Scheduler and asks for the next Re ...
一 背景知识 爬虫的本质就是一个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=& ...