网络爬虫的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)

 

返回目录

posted @ 2021-09-15 22:18  微纯册  阅读(344)  评论(0编辑  收藏  举报