网络爬虫的re模块入门和requests模块
爬虫入门与使用
- re模块
- 爬虫入门模块
- 网络请求的方式
- HTTP协议
- request模块使用
re模块
在python代码中使用正则表达式需要调用内置模块re
模块方法findall
文本数据,在匹配的时候是全局匹配不会匹配到一个就停止
返回结果为一个列表 内部包含正则匹配到的所有内容
eg:
# 调用re模块 import re # 声明变量 l='''ddf ddffew adff ddf dff a''' # 查找包含d开头f结尾的字符,非贪婪模式 res=re.findall('d.*?f',l) # 输出结果 print(res)
1.findall分组优先展示
会优先展示括号内正则表达式匹配到的内容,即先匹配后输出优先内容
eg: l='dafa' # 匹配a res =re.findall('(a)',l) print(res)
# 匹配后优先输出a
res =re.findall('d(a)f',l)
print(res)
eg: l='dafadff' res =re.findall('(a|f)',l) print(res) res =re.findall('d(a|f)',l) print(res)
2.取消分组优先展示
# 注意只是取消掉展示优先,并没有取消优先
eg: l='dafadff' res =re.findall('da|f',l) print(res) res =re.findall('d(?:a|f)',l) print(res)
l='dafadff' res =re.findall('d(a)',l) print(res) res =re.findall('d(?:a)',l) print(res)
模块方法finditer
文本数据,返回结果为一个迭代器(节省空间),
主动向其索要才会产生数据,否则永远只占一块空间,可用与大量数据查询时
eg: # 调用re模块 import re # 声明变量 l='''ddf ddffew adff ddf dff a''' # 查找包含d开头f结尾的字符,非贪婪模式 res=re.finditer('d.*?f',l) # 输出结果 print(res) # 启用迭代器 for i in res: print(i.group())
模块方法search
匹配到一个符合条件的数据就结束
l='dafadffdbba' res =re.search('d.*?a',l)
print(res) print(res.group())
模块方法match
只能从头开始匹配,头部不符合直接停止
l='dafadffdbba' res =re.match('d.*?a',l) print(res) print(res.group()) l='afadffdbba' res =re.match('d.*?a',l) print(res)
该知识点相关内容复习
什么是模块?
模块是一顿具有功能性代码的文件或包
导入模块的本质:
让模块和程序之间的关系在名称空间中生成,把代码的函数名和变量名存放在名称空间中,使用该模块时指向模块的名称空间
有哪些常用模块,及其的功能
time时间模块:时间戳、输出当前日期、输出时分秒
datatime时间模块:输出当前日期、输出当前日期和时间、加一天、减一天
os模块:文件常见增、删、减、查操作、路径拼接、判断文件大小
random模块:随机数,随机选择,随机抽样,随机打乱
haslib模块:加密,加密加盐处理,解密,加密常见算法:md5 base64 hmac sha系列
logging模块:日志模块,级别大小(从左到右,由大到小):debug < info < warming < error < critical
jason模块:序列化、反序列化、文件反序列化和序列化
爬虫模块request
作用
可以模拟浏览器向服务器发送请求获取数据,
缺点:但是不支持js代码
直系模块:
''' request-html模块 是书写requests作者后续开发的 功能比request模块并支持执行js代码 '''
request模块下载
方法1:
打开cmd终端、或者pycharm的terminal输入
pip3 install requests -i 网络地址
-i 用于转换远程仓库,如果网速快可以不用
方法2:
1.点击:file>>>settings
2.Project:....>>>python interpreter>>>点击加号键
3.在搜索框输入request,点击install
下载遇见的问题和解决
1.问题:提示信息有timeout
解决:更换网络地址,或多执行几次
2.问题:提示版本落后
解决方法:复制提示信息执行
3.问题:报错信息里面没有任何关键字就是一堆红色字体
解决:下载之前预先准备好环境配置(百度搜一下)
该知识点相关内容复习
远程仓库:用于存放数据的网络地址
模块的三种下载方法,DOS界面,pycharm的Terminal界面,快捷方式
使用pip3下载模块:1.配置环境变量;2.在终端输入命令
pip3 install 模块名 -i 网络地址
网络请求方法
网络请求方法有八种之多 但是目前需要我们掌握只有两种get和post
get请求
简而言之,向服务端获取目的数据
params # get请求体,具体位置
例如:浏览器地址栏输入网址,就是在发送get请求服务器索要首页
查看请求方法:f12>>>network>>>第一行文件>>>headers
get请求也可以携带额外数据 但是数据量有限制最多2-4KB 并且直接写在网址之后
eg:
url?xxx=yyy&zzz=mmm
post请求
向服务端提交数据
data # post登录信息请求体
eg:用户注册登录需要输入用户名和密码之后点击按钮发送post请求将数据提交给远程服务器
post请求也可以携带数据,数据大小没有限制,敏感性的数据都是由post请求完成,数据放在请求体中
该知识点相关内容复习
8bit=1Byte
1024B=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
1024TB=1PB
http协议
规定浏览器与服务器之间的数据交互关系
四大特性
1.基于请求响应(被动,不接受到请求,是不会发送信息的)
2.基于TCP/IP协议作用于应用层之上的协议
补充:
TCP/IP协议:即传输控制/网络协议,是一种面向广域网的通信协议,ip可以增加网络用户数量
网络应用层:为应用软件提供了很多服务,例如数据库服务、电子邮件其他网络软件服务。
3.无状态
不保存客户端的状态,即记不住任何东西
4.无连接
请求一次回应一次,就断开连接
数据请求格式
请求数据格式
请求首行(请求方法、地址...)
请求头(一大堆K:V键值对)
空行
请求体(get请求没有请求体,post请求有,多为敏感信息)
响应数据格式
响应首行(响应状态数、地址)
响应头(K:V键值对)
空行
响应体(浏览器展现给用户看的数据)
status code 响应状态码
用简单简单的数字来表示一串中文意思
1XX:服务端已经成功接收客户端的数据,并正在处理,客户端可以继续提交信息或等待
2XX:200 服务器成功接收响应
3XX:重定向(原本访问A页面却跳转B页面)
4XX:403 请求不符合条件 404 请求资源、网络地址不存在
5XX:服务器内部出现故障
""" 一些公司还会自己自定义响应状态码(HTTP的状态码太少不够用) eg: 10001 10002 参考网址:聚合数据 """
该知识点相关内容复习
五层网络结构:应用层、传输层、网络层、链路层和物理层
七层网络结构:即物理层、网络层、传输层、会话层、表示层和应用层
requests模块使用
发送网络请求
语法:
import requests # 发送post请求 requests.get(url)
params # get请求体,具体位置 # 发送post请求 requests.post(url)
data # post登录信息请求体
简单的get请求获取页面并报错
import requests # 向百度发送get请求获取首页 res = requests.get('https://www.baidu.com/') # 输出状态响应码 print(res.status_code)
可以查看到该网络使用字符编码为UTF8
# 选择字符编码 res.encoding='utf8' # 获取网页字符串,纯文本形式 print(res.text)
# 获取网页字符,返回bytes数据为二进制数据
print(res.content) # 创建html文件写入派去数据,数据为bytes类型(在python中可以直接看成是二进制) with open(r'baidu.html','wb') as f: f.write(res.content)
携带参数的get请求
语法
requests.get(url,params={})
例子:
import requests # 向搜狗猪搜索页面发送get请求获取页面 res = requests.get('https://www.sogou.com/web', params={'query':"猪"} ) # 创建html文件写入派去数据,数据为bytes类型(在python中可以直接看成是二进制) with open(r'搜狗.html','wb') as f: f.write(res.content)
如何携带请求头数据
语法
requests.get(url,headers={})
该知识点相关内容复习
字符编码:记录人使用的文字和数字对应关系
各国的字符编码:美国ASCII码,中国GBK,全世界unicode,全世界升级UTF8
文件读写模式:t文本模式,默认模式,可以操作文本文件,要申明字符编码
b啥都可以操作模式,ab,wb,rb,不需要申明字符编码
a追加写,w先删光写,r读光标移底
编码:
encode() 将字符转化为二进制 语法: 变量名.encode('字符编码')
解码:
decode() 将二进制转化为编码 语法: 变量名.decode('字符编码')
防爬措施
大多数的网站都反感爬虫,所以会设置防爬措施,例如上一个爬取搜狗网搜索‘猪’页面,无法获取需要验证
效验当前请求是否是浏览器发出的
主要效验的时get请求里User-Agent键值对
只要请求里面有键值对就表示客户端是个浏览器,反之不是浏览器
解决防爬措施
在浏览器输入相关命令
按‘f12’键>>>network>>>相应文件(记住该图标)>>> 查找user-Agent
将user-agent加入请求头即可
import requests # 向搜狗猪猪搜索页面发送get请求获取页面 res = requests.get('https://www.sogou.com/web', params={'query':"猪"}, headers={ "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } ) # 创建html文件写入派去数据 with open(r'搜狗.html','wb') as f: f.write(res.content)