摘要:
''' 一 目标站点分析 浏览器输入https://github.com/login 然后输入错误的账号密码,抓包 发现登录行为是post提交到:https://github.com/session 而且请求头包含cookie 而且请求体包含: commit:Sign in utf8:✓ authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmD... 阅读全文
posted @ 2019-03-12 21:03
离去墨染
阅读(595)
评论(0)
推荐(0)
摘要:
介绍 原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址) 所以实现分布式爬取的关键就是,找一台专门的主机上运行一个共享的队列比如Redis,然后重写Scrapy的Scheduler,让新的Scheduler 阅读全文
posted @ 2019-03-12 20:59
离去墨染
阅读(221)
评论(0)
推荐(0)
摘要:
介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。 但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Ass 阅读全文
posted @ 2019-03-12 20:56
离去墨染
阅读(384)
评论(0)
推荐(0)
摘要:
介绍 基于GET请求 带参数的GET请求->params 带参数的GET请求->headers 带参数的GET请求->cookies 基于POST请求 发送post请求,模拟浏览器的登录行为 补充 响应Response response属性 编码问题 获取二进制数据 解析json Redirecti 阅读全文
posted @ 2019-03-12 20:41
离去墨染
阅读(157)
评论(0)
推荐(0)
摘要:
8. 用户管理工具 8.1. 用户 添加用户 $useradd -m username 该命令为用户创建相应的帐号和用户目录/home/username; 用户添加之后,设置密码: 密码以交互方式创建: $passwd username 删除用户 $userdel -r username 不带选项使 阅读全文
posted @ 2019-03-12 20:32
离去墨染
阅读(370)
评论(0)
推荐(0)
摘要:
9. 系统管理及IPC资源管理 9.1. 系统管理 查询系统版本 查看Linux系统版本: $uname -a $lsb_release -a 查看Unix系统版本:操作系统版本: $more /etc/release 查询硬件信息 查看CPU使用情况: $sar -u 5 10 查询CPU信息: 阅读全文
posted @ 2019-03-12 20:32
离去墨染
阅读(320)
评论(0)
推荐(0)
摘要:
7. 网络工具 7.1. 查询网络服务和端口 netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 列出所有端口 (包括监听和未监听的): 阅读全文
posted @ 2019-03-12 20:31
离去墨染
阅读(259)
评论(0)
推荐(0)
摘要:
6. 性能监控 在使用操作系统的过程中,我们经常需要查看当前的性能如何,需要了解CPU、内存和硬盘的使用情况; 本节介绍的这几个工具能满足日常工作要求; 6.1. 监控CPU 查看CPU使用率 $sar -u eg: $sar -u 1 2 [/home/weber#]sar -u 1 2 Linu 阅读全文
posted @ 2019-03-12 20:30
离去墨染
阅读(249)
评论(0)
推荐(0)
摘要:
5. 进程管理工具 使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程; 任何进程都与文件关联;我们会用到lsof工具(list opened files),作用是列举系统中已经被打开的文件。在linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。用好 阅读全文
posted @ 2019-03-12 20:29
离去墨染
阅读(190)
评论(0)
推荐(0)
摘要:
4. 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩; 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩; 4.1. 查看磁盘空间 查看磁盘空间利用大小: df -h -h: human缩写,以易 阅读全文
posted @ 2019-03-12 20:28
离去墨染
阅读(159)
评论(0)
推荐(0)
摘要:
3. 文本处理 3.1. find 文件查找 查找txt和pdf文件: find . \( -name "*.txt" -o -name "*.pdf" \) -print 正则方式查找.txt和pdf: find . -regex ".*\(\.txt|\.pdf\)$" -iregex: 忽略大 阅读全文
posted @ 2019-03-12 20:27
离去墨染
阅读(299)
评论(0)
推荐(0)
摘要:
2. 文件及目录管理 文件管理不外乎文件或目录的创建、删除、查询、移动,有mkdir/rm/mv 文件查询是重点,用find来进行查询;find的参数丰富,也非常强大; 查看文件内容是个大的话题,文本的处理有太多的工具供我们使用,在本章中只是点到即止,后面会有专门的一章来介绍文本的处理工具; 有时候 阅读全文
posted @ 2019-03-12 20:26
离去墨染
阅读(245)
评论(0)
推荐(0)
摘要:
1. 学会使用命令帮助 1.1. 概述 在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档; linux系统内置的帮助文档很详细,通常能解决我们的问题,我们需要掌握如何正确的去使用它们; 在只记得部分命令关键字的场合,我们可通过man -k来搜索; 需要 阅读全文
posted @ 2019-03-12 20:25
离去墨染
阅读(190)
评论(0)
推荐(0)
摘要:
from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR from selenium.webdriver.common.keys import Keys ... 阅读全文
posted @ 2019-03-12 20:21
离去墨染
阅读(294)
评论(0)
推荐(0)
摘要:
介绍 安装 基本使用 选择器 基本用法 xpath 获取标签属性 等待元素被加载 元素交互操作 其他 阅读全文
posted @ 2019-03-12 20:20
离去墨染
阅读(176)
评论(0)
推荐(0)
摘要:
#注意:网站都策略都是在不断变化的,精髓在于学习流程。下述代码生效与2017-11-7,不能保证永久有效 from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.com... 阅读全文
posted @ 2019-03-12 20:20
离去墨染
阅读(339)
评论(0)
推荐(0)
摘要:
#_*_coding:utf-8_*_ __author__ = 'Linhaifeng' ''' 强大而又灵活的网页解析库,如果你觉得正则写起来太麻烦,如果你觉得beutifulsoup 语法太难记,如果你熟悉jquery的语法,那么pyquery是最佳选择 安装pyquery pip3 install pyquery ''' html=''' 哈哈哈 ... 阅读全文
posted @ 2019-03-12 20:12
离去墨染
阅读(163)
评论(0)
推荐(0)
摘要:
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间. 你可能在寻找 Beautiful Soup3 的文档,Beautiful So 阅读全文
posted @ 2019-03-12 20:11
离去墨染
阅读(195)
评论(0)
推荐(0)
摘要:
import requests import re import time import hashlib def get_page(url): print('GET %s' %url) try: response=requests.get(url) if response.status_code == 200: retur... 阅读全文
posted @ 2019-03-12 20:05
离去墨染
阅读(270)
评论(0)
推荐(0)
摘要:
爬虫是什么 爬虫的基本流程 请求与响应 Request Response 总结 阅读全文
posted @ 2019-03-12 20:04
离去墨染
阅读(131)
评论(0)
推荐(0)
摘要:
数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表: Python的DB-API返回的数据结构就是像上面这样表示的。 但是用tuple表示一行很难看出 阅读全文
posted @ 2019-03-12 20:00
离去墨染
阅读(219)
评论(0)
推荐(0)
摘要:
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。 Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。 在使用 阅读全文
posted @ 2019-03-12 19:59
离去墨染
阅读(147)
评论(0)
推荐(0)
摘要:
MySQL是Web世界中使用最广泛的数据库服务器。SQLite的特点是轻量级、可嵌入,但不能承受高并发访问,适合桌面和移动应用。而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite。 此外,MySQL内部有多种数据库引擎,最常用的引擎是支持数据库事务的Inno 阅读全文
posted @ 2019-03-12 19:59
离去墨染
阅读(126)
评论(0)
推荐(0)
摘要:
TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的 阅读全文
posted @ 2019-03-12 19:58
离去墨染
阅读(164)
评论(0)
推荐(0)
摘要:
Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。 客户端 大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 举个例子,当我们在 阅读全文
posted @ 2019-03-12 19:57
离去墨染
阅读(147)
评论(0)
推荐(0)
摘要:
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。 正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来 阅读全文
posted @ 2019-03-12 19:56
离去墨染
阅读(147)
评论(0)
推荐(0)
摘要:
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器 阅读全文
posted @ 2019-03-12 19:54
离去墨染
阅读(168)
评论(0)
推荐(0)
摘要:
要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。 如果用多线程实现Master 阅读全文
posted @ 2019-03-12 19:53
离去墨染
阅读(175)
评论(0)
推荐(0)
摘要:
在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。 但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦: 每个函数一层一层调用都这么传参数那还得了?用全局变量?也不行,因为每个线程处 阅读全文
posted @ 2019-03-12 19:52
离去墨染
阅读(124)
评论(0)
推荐(0)
摘要:
多任务可以由多进程完成,也可以由一个进程内的多线程完成。 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。 由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。 阅读全文
posted @ 2019-03-12 19:51
离去墨染
阅读(188)
评论(0)
推荐(0)
摘要:
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子 阅读全文
posted @ 2019-03-12 19:50
离去墨染
阅读(161)
评论(0)
推荐(0)
摘要:
程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: 可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。 我们把变量从内存中变成可存储或传输 阅读全文
posted @ 2019-03-12 19:49
离去墨染
阅读(163)
评论(0)
推荐(0)
摘要:
如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。 如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。 打开Pyth 阅读全文
posted @ 2019-03-12 19:48
离去墨染
阅读(294)
评论(0)
推荐(0)
摘要:
StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写。 StringIO顾名思义就是在内存中读写str。 要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可: getvalue()方法用于获得写入后的str。 要读取StringIO,可以用一 阅读全文
posted @ 2019-03-12 19:47
离去墨染
阅读(257)
评论(0)
推荐(0)
摘要:
如果你经常阅读Python的官方文档,可以看到很多文档都有示例代码。比如re模块就带了很多示例代码: 可以把这些示例代码在Python的交互式环境下输入并执行,结果与文档中的示例代码显示的一致。 这些代码与其他说明可以写在注释中,然后,由一些工具来自动生成文档。既然这些代码本身就可以粘贴出来直接运行 阅读全文
posted @ 2019-03-12 19:46
离去墨染
阅读(127)
评论(0)
推荐(0)
摘要:
读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从 阅读全文
posted @ 2019-03-12 19:46
离去墨染
阅读(231)
评论(0)
推荐(0)
摘要:
如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。 比如对函数abs(),我们可以编写出以下几个测试用例: 输入正数,比如1、1.2、0.99,期待返回值与输入相同; 输 阅读全文
posted @ 2019-03-12 19:45
离去墨染
阅读(135)
评论(0)
推荐(0)
摘要:
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1。 用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结 阅读全文
posted @ 2019-03-12 19:44
离去墨染
阅读(274)
评论(0)
推荐(0)
摘要:
程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。 第一种方法简单直接粗暴有效,就是用print()把 阅读全文
posted @ 2019-03-12 19:44
离去墨染
阅读(151)
评论(0)
推荐(0)
摘要:
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。 比方说我们要定义一个Hello的class,就写一个hello.py模块: 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的clas 阅读全文
posted @ 2019-03-12 19:10
离去墨染
阅读(142)
评论(0)
推荐(0)
摘要:
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数。 除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮 阅读全文
posted @ 2019-03-12 19:09
离去墨染
阅读(139)
评论(0)
推荐(0)
摘要:
当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: 好处是简单,缺点是类型是int,并且仍然是变量。 更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能: 这样我们就获得了Month类型的枚举类 阅读全文
posted @ 2019-03-12 19:09
离去墨染
阅读(243)
评论(0)
推荐(0)
摘要:
继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能。 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗; Bat - 蝙蝠; Parrot - 鹦鹉; Ostrich - 鸵鸟。 如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次: 但是 阅读全文
posted @ 2019-03-12 19:08
离去墨染
阅读(170)
评论(0)
推荐(0)
摘要:
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: 这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: 现 阅读全文
posted @ 2019-03-12 19:06
离去墨染
阅读(221)
评论(0)
推荐(0)
摘要:
由于Python是动态语言,根据类创建的实例可以任意绑定属性。 给实例绑定属性的方法是通过实例变量,或者通过self变量: 但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: 当我们定义了一个类属性后,这个属性虽然归类所有,但 阅读全文
posted @ 2019-03-12 19:05
离去墨染
阅读(165)
评论(0)
推荐(0)
摘要:
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class: 然后,尝试给实例绑定一个属性: 还可以尝试给实例绑定一个方法: 但是,给一个实例绑定的方法,对另一个实例是不起作用的: 为了给所有实例都绑定方法,可以 阅读全文
posted @ 2019-03-12 19:05
离去墨染
阅读(100)
评论(0)
推荐(0)
摘要:
使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判断: 如果一个变量指向函数或者类,也可以用type()判断: 但是type()函数返回的是什么类型呢?它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同: 阅读全文
posted @ 2019-03-12 19:04
离去墨染
阅读(375)
评论(0)
推荐(0)
摘要:
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直 阅读全文
posted @ 2019-03-12 19:03
离去墨染
阅读(157)
评论(0)
推荐(0)
摘要:
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。 仍以Student类为例,在Python中,定义类是通过class关键字: class后面 阅读全文
posted @ 2019-03-12 19:02
离去墨染
阅读(143)
评论(0)
推荐(0)
摘要:
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性: 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Pyt 阅读全文
posted @ 2019-03-12 19:02
离去墨染
阅读(237)
评论(0)
推荐(0)
摘要:
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。 在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下: int()函数可以把 阅读全文
posted @ 2019-03-12 19:00
离去墨染
阅读(158)
评论(0)
推荐(0)
摘要:
由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。 函数对象有一个__name__属性,可以拿到函数的名字: 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“ 阅读全文
posted @ 2019-03-12 18:55
离去墨染
阅读(124)
评论(0)
推荐(0)
摘要:
在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: 通过对比可以看出,匿名函数lambda x: x * x实际上就是: 关键字lambda表示匿名函数,冒号前面的x表示函数参数。 匿名函数有个限制,就是 阅读全文
posted @ 2019-03-12 18:54
离去墨染
阅读(144)
评论(0)
推荐(0)
摘要:
数作为返回值 实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: 如果不需要立刻求和,而是返回求和的函数: 调用函数f时,才真正计算求和的结果: 在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_ 阅读全文
posted @ 2019-03-12 18:53
离去墨染
阅读(183)
评论(0)
推荐(0)
浙公网安备 33010602011771号