Python爬虫、正则表达式

爬虫

什么是爬虫

一段可以从指定的网站爬取数据的程序。

爬虫所依赖的知识基础

1、网络协议基础:http/https、HTML页面基本知识

2、如何发起请求:通过代码发起请求并获取相应,然后解析内容。知识点如Python、Json、RegExp、BeautifulSoup

、xpath

3、保存数据:数据库操作、文件操作

爬虫的两大难点

1、如何破解反爬措施:JS反爬、验证码反爬

2、如何高效大规模爬取:分布式、高并发

HTTP协议基础

特点:请求-相应式协议

一次完整的HTTP请求过程

1、建立TCP连接。

2、浏览器向服务器发送请求命令(GET/POST)。

3、浏览器发送请求头信息,如‘UserAgent,host’等关于自身的信息,最后发送一个空请求头代表请求头信息发送完毕,如果POST提交,就会继续提交请求体

4、服务器应答

5、服务器发送应答头信息,关于自己的信息及被请求的文档,最后发送一个空白行表示头信息发送结束。

6、服务器向浏览器发送数据,以‘Content-Type’应答头信息所描述的格式,发送用户所请求的实际数据。

7、服务器关闭TCP连接。(如果添加Connection:keep-alive则TCP连接在发送后仍将保持打开状态,避免每一次都重新创建TCP连接)

GET和POST请求的区别是什么

GET请求一般用于向服务器请求一个资源,没有副作用,一般会在客户端做缓存。POST请求一般用于向服务器段提交数据并让服务器完成一件事,有副作用,不会再客户端做缓存。

GET请求发送数据的时候,一般会将请求数据放在url中发给服务器,从安全性角度来看相对没有POST请求安全性高,所以GET请求一般不会用于比较隐私的数据传输,而POST请求时将请求数据放在请求体里面。

常见HTTP代码

1**:临时相应并需要请求者继续执行操作

2**:请求成功 OK

3**:重定向代码

4**:客户端错误,请求包含语法错误或者无法完成请求

5**:服务器错误,服务器在请求的过程中发生错误

Cookie和Session的作用:

HTTP协议是一个无状态协议,这两者都是为了让服务器来记住客户端

两者区别:Cookie保存在客户端,而Session是保存在服务器端

Cookie一般保存不敏感信息

Chrome抓包分析

最简单的抓包方式:右键->检查

其中

Element:网页的元素,用于定位页面元素

Console:运行一些命令行,相当于在页面上运行JS代码

Sources:JS逆向,破解时使用

Network:抓包,会显示所有请求的地址、信息等等

Request库

导入使用:

1
import request

get请求使用:

1
resp = request.get('www.xxxx.com')

其中,构造请求头使用:

1
2
3
headers = {'User-Agent' : 'Mozilla/5.0.....'}

resp = request.get('www.xxxx.com', headers = headers)

POST请求使用

1
2
3
data = {'key1' : 'value1', 'key2' : 'value2'}

resp = request.get('www.xxxx.com', data = data)

POST请求也可以添加UA,与前面一样

Cookie嵌入使用:

1
2
3
headers = {'Cookie' : 'xxx'}

resp = request.get('www.xxxx.com', headers = headers)

如何利用requests保持Session会话:

1
2
3
4
sess = requests.Session()

sess.post('', data, headers)
sess.get('', data, headers)

正则表达式

用于搜索或查找特定数据的语法格式,由一堆符号组成

正则表达式简单使用

|:管道符号

.:匹配除去\n之外的任何字符

^:匹配字符串其实部分

$:匹配字符串中之字符

如何在python中使用正则

所有要抓取的内容在正则表达式中用括号括起来

1
2
3
4
5
6
import re

log = 'now : 2020-04-15 23:44:34 id: STU001 status: nok'

result = re.findall("\s+(\d{4}-\d{2}-\d{2}.*id:\s+(STU\d{3}))\s+status:\s+(\w+)", log)
print(result)

输出:[(‘2020-04-15’, ‘STU001’, ‘nok’)]

贪婪模式和非贪婪模式

贪婪模式尽可能多的匹配正则前面的符号,如

1
2
3
4
5
6
import re
content = 'STUID 123456 CLASSA MATHS'

result = re.findall('.*(\d+)', content)

print(result)

输出:[‘’6’]

非贪婪模式,如下:

1
2
3
4
5
6
import re
content = 'STUID 123456 CLASSA MATHS'

result = re.findall('.*?(\d+)', content) # 比贪婪模式多加了个问号

print(result)

输出:[‘123456’]

.*?的用法

将想要匹配的值全部换成.*?即可

re.S的用法

拿取换行符,如下:

1
2
3
4
5
6
7
8
import re

content = '''<li><a href = '111.htm'>
<a href = '222.htm'>
'''
result = re.findall('href = (.*?)', content, re.S) #注意后面加的参数

print(result)

输出:[‘111.htm’, ‘222.htm’]