当前位置:   article > 正文

requests和re正则基础_request re

request re

本片文章主要记录最近所学基础内容,日后会有补充。

requests

  • requests是一个第三方模块,可以用pip install requests命令行安装

requests的各种请求

import requests
r=requests.get('http://httpbin.org/get')
r=requests.post('http://httpbin.org/post')
r=requests.put('http://httpbin.org/put')
r=requests.delete('http://httpbin.org/delete')
r=requests.head('http://httpbin.org/head')
r=requests.options('http://httpbin.org/options')
print(r.text)
"""
结果:这里只贴了第一个的,其他自己试试(下面没给结果的代码,主要是因为结果内容过多,可以自己跑一边)
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.22.0"
  }, 
  "origin": "117.32.216.103, 117.32.216.103", 
  "url": "https://httpbin.org/get"
}
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

基本用法

  • 从下面的type ( r )可以知道,请求得到的是Response对象,所以它有以下方法:
import requests
r=requests.get('http://www.baidu.com')   #以get方法请求网页
print(type(r))        #结果:<class 'requests.models.Response'>
print(r.status_code)  #状态码  200表示成功
print(type(r.text))   #<class 'str'>
print(r.cookies)      # 打印cookie信息
print(r.url)          #结果:https://www.baidu.com/
print(r.headers)      # 打印头信息
print(r.content)      #以字节流形式打印
print(r.text)         #以文本形式打印网页源码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 上面的cookies,headers,content,text得到的值不全,若想要全的,因该在get函数后面给headers参数传User-Agent

带参数的GET请求

  • 第一种直接将参数放在url内
import requests
r=requests.get('http://httpbin.org/get?name=zhang&age=18')
print(r.text) #这个网址是专门用来测试各种请求的,所以可以不加headers
"""  结果
{
  "args": {
    "age": "18", 
    "name": "zhang"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.22.0"
  }, 
  "origin": "117.32.216.103, 117.32.216.103", 
  "url": "https://httpbin.org/get?name=zhang&age=18"
}"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 上面的方法不太人性化,如果内容量过多,也不便于管理
  • params
import requests
data={
	'name':'zhang',   #注意逗号
	'age': '18'
}
r=requests.get('http://httpbin.org/get',params=data)
print(r.text)   #结果同上
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

JSON

  • 这里讲的json是requests库里的json,requests得到的页面返回值实际是str类型(上面‘基本用法’第五行代码),是JSON格式。所以requests库就提供了json()方法进行解析
import requests
r=requests.get('http://httpbin.org/get')
print(r.json())
print(type(r.json()))
"""结果
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '117.32.216.103, 117.32.216.103', 'url': 'https://httpbin.org/get'}
<class 'dict'>   json()方法把str转成dict型
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • content
    这个东西在上面的基本方法也提到过,是输出二进制文本也就是字节流,那么,它有什么用呢?
import requests
r=requests.get('https://github.com/favicon.ico')
with open('D:/favicon.ico','wb') as f:   #注意路径和扩展名
	f.write(r.content)  #wb是以二进制写入文件,content是二进制流
  • 1
  • 2
  • 3
  • 4

所以,content可以用来保存图片,音频,视频等

  • 添加headers
    前面说过,不加User-Agent的请求得到的东西不全,有些网页还要加cookies等,否则将无法得到响应,这些东西都加在headers里。
import requests
r=requests.get('https://zhihu.com/explore')
print(r.status_code)  #400    错误请求
  • 1
  • 2
  • 3

加上headers之后就可以了

import requests
headers={
	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}   #把headers存成字典,方便管理;字典名可以改动
r=requests.get('https://zhihu.com/explore',headers=headers)
print(r.status_code)  #200  成功
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上面的User-Agent可以在网页源码的Network下找到:
在这里插入图片描述
当然headers还可以加其他内容

POST请求

import requests
da={
	'name':'yu',   #注意逗号分隔
	'age':18
}  #保存为字典
r=requests.post('https://httpbin.org/post',data=da)  #传参,和GET的params分清楚
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 那么问题来了,params和data参数的区别是什么?
  1. params用于GET,data用于POST
  2. params会直接把数据加到链接后面,会修改url,而data会把数据加入表单,不修改url
import requests
da={
	'name':'yu',
	'age':18
}  #data传入字典
r=requests.post('https://httpbin.org/post',data=da)
print(r.text)
dat=(('na','meng'),('na','men'))   
r=requests.post('https://httpbin.org/post',data=dat)  #data传入元祖
print(r.text)
"""  这里我只放了不同的地方
  "form": {
    "na": [
      "meng", 
      "men"
    ]
  },"""
data=(('na','meng'),('neee','menggdfgg'))    #data传入元祖的第一个值不同时和字典没区别
r=requests.post('https://httpbin.org/post',data=data)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

requests上传文件

有的网站需要上传文件时,也可以用requests完成

import requests
files={'wenjian':open('D:/favicon.ico','rb')} #注意路径和打开方式,r不行
r=requests.post('http://httpbin.org/post',files=files)
print(r.text)
"""
"files": {
    "wenjian": "data:application/octet-stream;base64,.....Rf/FRUX/xUVF/8VFRf/FRA="
  },               #它没有像data一样传入form,而是在files字段里
  "form": {},      #结果里省略了很多,自己跑一遍
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Cookies

cookies的作用是维持登陆状态,所以在需要登陆的界面,我们就要传递cookies值
cookies
我们先登陆一个网址,这里我用的是知乎,然后在Network下找到Cookies和User-Agent的值,复制到headers里,就可以请求网页看见登陆后的界面了

import requests
headers={
	'cookie': '_xsrf=0lSl6Q1K2BTD0p6PtZ7i5MXhvFloFdpo; _zap=e9af415b-23bf-47b3-b11b-c04553c19a77; d_c0="AHBv5MBilQ-PTiHu5txEdg-bXz9GFtmdtRg=|1560503146"; q_c1=578bb87686ba49ef9d6b1abd137e86e9|1563422369000|1563422369000; __utma=51854390.1797018928.1563422372.1563422372.1563422372.1; __utmz=51854390.1563422372.1.1.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/question/330333967; __utmv=51854390.100-1|2=registration_date=20180429=1^3=entry_date=20180429=1; tgw_l7_route=578107ff0d4b4f191be329db6089ff48; capsion_ticket="2|1:0|10:1563540046|14:capsion_ticket|44:ZjM4ZDU0Nzk4ZmJjNDFjNzk3MGRmMzdhZTMwNDE1ZGY=|4fcd7ab9ef1a812d93fb0a95a9a7c7fe76e7dbd0f143973febece205e957f8b1"; z_c0="2|1:0|10:1563540060|4:z_c0|92:Mi4xbGFTLUJRQUFBQUFBY0dfa3dHS1ZEeVlBQUFCZ0FsVk5YQWdmWGdCTGxGelhaclR6VnVXRnRKQ3RXMVJ4cE16TFdB|21dc1ae7ee6d798243f8e6fdd0e14f99d8fba00ad00e2d226bf03b16b291d7e3"; tshl=; tst=r',
	'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
r=requests.get('https://www.zhihu.com',headers=headers)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这里的Cookies和User-Agent可以换成自己的

会话维持

为了确保请求的是同一人的网站,我们可以设置Session对象,它常用来模拟登陆成功后的下一步操作,具体后面再讲,我还没用过!!!!!!!!!!!

SSL证书验证

我们可以在GET请求中加入verify参数(认证证书的开关),默认为True

import requests
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
"""
C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\urllib3\connectionpool.py:851: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)  结果里有个警告
200
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们可以忽略警告或者指定crt,key两个文件,并指定路径,传给cert作为证书

代理设置

爬虫发送请求很快很频繁,容易被服务器识别,为了解决这个问题,我们可以设置代理来解决
没用过,以后写

设置超时

有时因网络或服务器问题甚至无响应时,我们会很费时间,所以timeout参数就很重要了,timeout默认为None,这意味着无时间限制,给定数值后,若在规定时间内没完成发送请求和响应的任务,就会返回超时错误,这有助于我们提高爬虫效率


re正则表达式

我们用请求库得到的是包含渲染的HTML文本,里面有很多我们不需要的内容,因此就需要处理工具选出我们想要的东西,正则是一个强大但不方便的工具。

  • 上网搜正则表达式测试工具,可以帮我们确定我们写的表达式是否有效

常用匹配规则

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/735386
推荐阅读
相关标签
  

闽ICP备14008679号