爬虫模块之requests

目录

  • re模块
  • 爬虫模块之requests
  • 网络请求的方式
  • requests模块演示

 

 

re模块

演示准备

import re

s = """
eva ben tom mary
ben ben
ben
"""

演示一

res = re.findall('b.*?n',s)
print(ret)

"""
findall(正则,文本数据)
    在匹配的时候是全局匹配不会因为匹配到一个就停止 
    返回的结果是一个列表 内部包含正则匹配到的所有的内容
"""

 演示二

res = re.finditer('b.*?n',s)
for i in res:
    print(i.group())


"""
finditer(正则,文本数据)
    返回的结果是一个迭代器,只有主动索要才会产生数据,否则永远只占一块空间,节省了内存空间
"""

 演示三

# 匹配到一个符号条件的数据就结束
res = re.search('b.*?n',s)
print(res)

 演示四

# 只能从头开始匹配 头部不符合直接停止
res = re.match('b.*?n',s)
print(res)

 

 分组优先级

演示准备

import re
ret = re.findall('www.(baidu).com', 'www.baidu.com')
print(ret)

优先展示

"""
findall分组优先展示,会优先展示括号内正则表达式匹配到的内容
"""

ret = re.findall('www.(baidu).com', 'www.baidu.com')
print(ret)

 

 取消分组优先展示

# 在括号内容前面加上问号和冒号

ret = re.findall('www.(?:baidu).com', 'www.baidu.com')
print(ret)

 

爬虫模块之requests

# 作用
可以模拟浏览器发送网络请求获取数据

# 如何下载
在pycharm终端里敲写pip3 install requests
或直接快捷键操作即可

# 如何导入
import requests

 

 网络请求方法

get请求

朝服务器索要数据

eg:浏览器地址栏输入百度网址回车其实就是在发送get请求朝百度服务器索要百度首页

补充

# get请求也可以携带额外的数据
但是数据量有限制最多2~4KB,并且是直接写在网址的后面
        
url?xxx=yyy&zzz=bbb

 

 post请求

朝服务器提交数据

eg:用户注册登录需要输入用户名和密码之后点击按钮发送post请求将数据提交给远程服务器

补充

post请求也可以携带额外的数据 并且数据大小没有限制
敏感性的数据都是由post请求携带
而数据放在请求体中

 

 HTTP协议

规定了浏览器与服务端之间数据交互的方式

四大特性

1.基于请求响应

2.基于TCP、IP作用于应用层之上的协议

 

 

3.无状态
不保存客户端的状态

 

 

4.无连接
限制每次连接只处理一个请求
服务器处理完客户的请求,并收到客户的应答后,即断开连接

数据请求格式

请求数据格式

        请求首行(请求方法 地址...)
        请求头(一大堆K:V键值对)
        # 此处换行一定不能忘
        请求体(get请求没有请求体,post请求有,里面是敏感数据)

响应数据格式

        响应首行(响应状态码 协议版本...)
        响应头(一大堆K:V键值对)
        # 此处换行一定不能忘
        响应体(一般都是给浏览器展示给用户看的数据)    

响应状态码

用简单的数字来表示一串中文意思类似于暗号

举例

1XX——————服务端已经成功接收到了用户的数据正在处理 用户可以继续提交或者等待
2XX——————200 == OK请求成功服务端发送了响应
3XX——————重定向(原本想访问A页面但是内部自动跳到了B页面)
4XX——————403请求不符合条件    404请求资源不存在(图一)
5XX——————服务器内部错误

 自定义响应状态码

因为HTTP的状态码太少不够用
所以有些公司创建了自定义响应状态码
eg:        
10001————xxx    
10002————yyy

# 参考网址: 聚合数据

 

 

requests模块基本使用

发送网络请求
    import requests
    requests.get(url)  # 发送get请求
    requests.post(url)  # 发送post请求

获取响应状态码

# print(res.status_code)

指定字符编码

# res.encoding = 'utf8'
# print(res.text)  # 获取网页字符串数据

获取bytes类型的数据

print(res.content)

获取页面

import requests

res = requests.get('https://www.baidu.com/')
with open(r'baidu1.html', 'wb') as f:
    f.write(res.content)

携带参数的get请求

requests.get(url,params={})

如何携带请求头数据

requests.get(url,headers={})

演示

import requests


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'
}
res = requests.get('https://www.baidu.com/s',
                    params={'wd':"蜘蛛侠"},
                    headers=headers
                   )
with open(r'zzx.html','wb') as f:
    f.write(res.content)
View Code

 

 

代码版搜索引擎

import requests


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'
}
keyword = input('请输入你想搜索的数据>>>:').strip()
res = requests.get('https://www.baidu.com/s',
                    params={'wd':keyword},
                    headers=headers
                   )
with open(r'zzx.html','wb') as f:
    f.write(res.content)
View Code

防爬措施

校验当前请求是否是浏览器发出的
需请求头里面的User-Agent键值对
只要请求里面含有该键值对,就表示自己是个浏览器,没有则不是

 

 

posted @ 2021-09-15 20:41  陌若安然  阅读(43)  评论(0)    收藏  举报