爬虫之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={...})

 

 

posted @ 2021-09-15 15:59  wddwyw  阅读(172)  评论(0编辑  收藏  举报