python爬虫基础

链路层 传输层 网络层 应用层

IDE 集成开发环境
1.属性前面添加下划线 使对象属性私有化
2. for循环迭代 iter() 生成迭代器 减少空间占用
3.python语法糖 具有特殊功能的函数
4.列表生成试 a = [x*2 for x in range(10)]
5.类的动态创建 是指当满足某一条件时所创建的类
6.type class 创建类的关键字
class Test{}
Test2 = type("Test2", (), {}) 元类

def printNum(self):
print("---num--%d--"%self.num)
Test2 = type("Test2", (), {})
等价于 class printNum2:
def print(self):
print("--num--%d--"%self,Num)
7.内建函数:数组中排序
sorted([1,2,35,5,6,6,56])
sorted(['a','g','h','e','y','h'])
8:去除重复
a = [11,3,3,,5,6,,62,,6,3,6,36,3,6,3,6]
b = set(a)
a = b
9. 求交集a&b 求并集a 求差集 a-b 对称差集 a^b
10. pdb: l list 显示当前的代码
n next 向下执行一行代码
c continue 继续执行代码
b break 添加断点
clear 删除断点
p step 进入到一个函数
a args 打印所有的形参数据
r return 快速执行到最后一行
q quit 推出程序
11.os.getpid()查看子进程id os.getppid()查看父进程id
12.os.fork() 多进程创建 生成 while True:
os.fork() 炸弹
ret = os.fork() (底层)
if ret==0:
子进程
else:
父进程
13.p1 = Process(target=xxx)
p1.start()
Process语法机构(进程):
target:表示这个进程实例所调用的对象
args:表示调用对象的位置参数元组
kwargs:表示调用对象的关键字参数字典
name:为当前进程实例的别名
group:大多数情况用不到
Process类常用方法:
is_alive():判断进程实例还在执行
join:是否等待进程实例执行结束,或等待多少秒
start():启动进程实例(创建子进程)
run():如果没有给定target参数,对这个对象调用start()方法,就将执行对象中的run()方法
terminate():不管任务是否完成,立即终止
14.pool = Pool(30)
pool.apply_async(xxx)
#主进程一般用来等待,真正的任务都在子进程中执行
15.socket套接字 tcp 服务器
①socket创建一个套接字
②bind绑定ip和port
③listen使套接字变为可以被动链接
④accept等待客户端的链接
⑤recv/send接收发送数据

import socket
s = socket.cocket.(socket.AF_INET, cocket.SOCK_STREAM)

16.UDP广播
192.168.0.0 网络号
192.168.0.255 广播地址

import socket,sys
dest = ('<broadcast>', 7788) 更通用
s = socket.socket(socket.AF_INET, socket_SOCK_DGRAM)
#对这个余姚发送广播的数据的套接字进行修改设置
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1_
s.send("Hi", dest)

17.arp 根据ip找mac地址
rarp 根据mac地址找ip
icmp ping的时候用
DHCP 自动的发现局域网里没有IP的电脑并分配IP
DNS 服务器找域名
网络掩码 看主机的网段
默认网关 寻找不在某一网段
tcp 长链接(例如:abacusd 一个一个字母的发 访问百度)
短链接(例如:agagaga 一次发送多个 看视频)
一次访问百度所经历的环节:
1.先解析出baidu.com对应的ip地址
1.先知道默认网关的mac
2.组织数据 发送给默认网关(ip还是DNS服务器的ip,但是mac地址是默认网关的mac地址)
3.默认网关拥有转发数据的能力,把数据转发给路由器
4.路由器根据自己的路由协议,来选择一个合适的较快的路径 转发数据给目的网关
5.目的网关 (DNS服务器所在的网关),把数据转发给DNS服务器
6.DNS服务器查询解析出baidu.com对应的IP地址,并把它原路返回给请求这个域名的client
2.得到了baidu.com对应的IP地址后,会发送tcp的3次握手,进行连接
3.使用http协议发送请求给web服务器
4.web服务器收到数据后,通过查询自己的服务器得到相应的结果,原路返回给浏览器
5.浏览器接收到数据后 通过浏览器自己的渲染功能来显示这个页面
6.浏览器 关闭tcp连接,即4次挥手
完成访问...
18.为什么有了IP地址还需要MAC地址?
整体与局部信息传递时候,需要知道的其实是两个地址:
终点地址(Final destination address)下一跳的地址(Next hop address)IP地址本质上是终点地址,
它在跳过路由器(hop)的时候不会改变,而MAC地址则是下一跳的地址,
每跳过一次路由器都会改变。这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。
19.DDOS攻击 tcp半链式攻击
tcp半链式攻击称为:SYN FLOOD(SYN洪水)
是一种典型的DOS(Denial of Service 拒绝服务)攻击
效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接请求
20.DNS攻击 域名解析上做文章 udp广播 伪造DNS应答包
冒充假的DNS服务器主动给电脑提供钓鱼网站(假的域名),让用户访问,以此获取用户密码。
21.arp攻击
伪造数据包 伪造mac地址 中间人做路由器 收到数据保存数据库
22. 正则表达式
import re
r = re.match("匹配方","被匹配方")
r.group() #查看匹配的字符
. 匹配任意一个字符{除了 }
[] 匹配[]中列举的字符
d 匹配数字
D 匹配非数字
s 匹配空白 tab键
S 匹配非空白
w 匹配单词字符 即 a-z A-Z 0-9 _
W 匹配非单词
* 匹配前一个字符出现0次或者无限次
+ 匹配前一个字符出现一次或者无限次
? 匹配前一个字符出现一次或者0次
{m} 匹配前一个字符出现m次
{m.} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
^ 匹配字符串开头
$ 匹配字符串结尾
 匹配一个单词的边界
B 匹配非单词边界
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
um 引用分组num匹配到的字符
{?P<name>} 分组起别名
{?P<name>} 引用别名为name分组匹配到的字符串
re.sub{r"要替换的内容","替换后的内容","全部的内容"}
匹配网址:re.sub{r"(http://.+?/).*", lambda x: x.group(1), s}
23.单链表的操作
is_empty()链表是否为空
length()链表长度
travel()便利整个链表
add(item)链表头部添加元素
append(item) 链表尾部添加元素
insert(pos, item)指定位置添加元素
remove(item)删除节点
search(item)查找节点是否存在
24.爬虫
import urllib.request #导包
url = 'http://www.baidu.com' #目标网址
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'} #模拟浏览器请求包头
request = urllib.request.Request(url, headers=header) #构造请求
response = urllib.request.urlopen(request) #请求回复
html=response.read() #读数据
print(html) #打印数据
print(response.getcode()) #返回HTTP的响应码,成功返回200,4服务器页面出错,5服务器问题...
print(response.geturl()) #返回请求网址

原文地址:https://www.cnblogs.com/jake-jin/p/11435761.html