爬虫之re模块与requests模块
re模块
findall(正则,文本数据)
在匹配的时候是全局匹配,不会因为匹配到一个就停止。
返回的结果是一个列表,内部包含正则匹配到的所有的内容。
import re s = """ eva jyb tony yuan jyb jyb jyb a """ ret = re.findall('j.*?n', s) # 返回所有满足匹配条件的结果,放在列表里 print(ret)
finditer(正则,文本数据)--暂时了解即可
返回的结果是一个迭代器,只有主动索要才会产生数据,否则永远只占一块空间。
import re s = """ eva jyb tony yuan jyb jyb jyb a """ res = re.finditer('j.*?n', s) for i in res: print(i.group())
匹配到一个符合条件的数据就结束
import re s = """ eva jyb tony yuan jyb jyb jyb a """ res = re.search('j.*?n', s) print(res)
只能从头开始匹配,头部不符合直接停止
import re s = """ eva jyb tony yuan jyb jyb jyb a """ res1 = re.match('j.*?n', s) print(res1)
findall分组优先展示
会优先展示括号内正则表达式匹配到的内容。
import re # 分组优先 ret = re.findall('www.(oldboy).com', 'www.oldboy.com') print(ret)
取消分组优先
import re # 取消分组优先 ret1 = re.findall('www.(?:oldboy).com', 'www.oldboy.com') print(ret1) ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') print(ret2)
requests模块
作用
可以模拟浏览器发送网络请求获取数据。
下载
pip3 install requests
由于下载较慢,建议换源再下载。
导入使用
import requests
网络请求方法
一般有八个网络方法,目前只需要掌握两个。
get请求
朝别人索要数据。
eg:浏览器地址栏输入百度网址回车其实就是在发送get请求朝百度服务器索要百度首页。
get请求也可以携带额外的数据,但是数据量有限制最多2~4KB,并且是直接写在网址的后面。
url?xx=yy&zz=kk
post请求
朝别人提交数据
eg:用户注册登录需要输入用户名和密码之后点击按钮发送post请求将数据提交给远程服务器。
post请求也可以携带额外的数据,并且数据大小没有限制,敏感性的数据都是由post请求携带。
数据放在请求体中
HTTP协议
规定了浏览器与服务端之间数据交互的方式。
四大特性
基于请求响应
基于TCP、IP作用于应用层之上的协议。
无状态:即不保存客户端的状态。
无连接
数据请求格式
请求数据格式
请求首行(请求方法,地址......)
请求头(一大堆K:V键值对)
请求体(get请求没有请求体,post请求有,里面是敏感数据)
响应数据格式
响应首行(响应状态码,协议版本)
响应头(一大堆K:V键值对)
响应状态码
用简单的数字来表示一串中文意思
1XX
服务端已经成功接收到了你的数据正在处理,你可以继续提交或者等待。
2XX
请求成功服务端发送了响应。
3XX
重定向(原本想访问A页面但是内部自动跳到了B页面)
4XX
403请求不符合条件 404请求资源不存在
5XX
服务器内部错误
公司还会自己自定义响应状态码(HTTP的状态码太少不够用)
参考网站:聚合数据:https://www.juhe.cn/docs
requests模块基本使用
发送网络请求 import requests requests.get(url) # 发送get请求 requests.post(url) # 发送post请求 # 1.简单的get请求获取页面并报错 import requests # 朝百度发送get请求获取首页数据 res = requests.get('https://www.baidu.com/') # print(res.status_code) # 获取响应状态码 # 指定字符编码 # res.encoding = 'utf8' # print(res.text) # 获取网页字符串数据 # print(res.content) # 获取bytes类型的数据(在python中可以直接看成是二进制) with open(r'baidu.html', 'wb') as f: f.write(res.content) # 2.携带参数的get请求 requests.get(url,params={}) # 3.如何携带请求头数据 requests.get(url,headers={})
防爬措施
校验当前请求是否是浏览器发出的
用于校验的核心就在于请求头里面的User-Agent键值对
只要请求里面含有该键值对就表示你是个浏览器没有则不是浏览器
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36
解决措施在请求头中加上即可
requests.get(url,headers={...})