本片文章主要记录最近所学基础内容,日后会有补充。
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"
}
"""
基本用法
- 从下面的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) #以文本形式打印网页源码
- 上面的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"
}"""
- 上面的方法不太人性化,如果内容量过多,也不便于管理
- params
import requests
data={
'name':'zhang', #注意逗号
'age': '18'
}
r=requests.get('http://httpbin.org/get',params=data)
print(r.text) #结果同上
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型
"""
- 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是二进制流
所以,content可以用来保存图片,音频,视频等
- 添加headers
前面说过,不加User-Agent的请求得到的东西不全,有些网页还要加cookies等,否则将无法得到响应,这些东西都加在headers里。
import requests
r=requests.get('https://zhihu.com/explore')
print(r.status_code) #400 错误请求
加上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 成功
上面的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)
- 那么问题来了,params和data参数的区别是什么?
- params用于GET,data用于POST
- 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)
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": {}, #结果里省略了很多,自己跑一遍
"""
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)
这里的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
"""
我们可以忽略警告或者指定crt,key两个文件,并指定路径,传给cert作为证书
代理设置
爬虫发送请求很快很频繁,容易被服务器识别,为了解决这个问题,我们可以设置代理来解决
没用过,以后写
设置超时
有时因网络或服务器问题甚至无响应时,我们会很费时间,所以timeout参数就很重要了,timeout默认为None,这意味着无时间限制,给定数值后,若在规定时间内没完成发送请求和响应的任务,就会返回超时错误,这有助于我们提高爬虫效率
re正则表达式
我们用请求库得到的是包含渲染的HTML文本,里面有很多我们不需要的内容,因此就需要处理工具选出我们想要的东西,正则是一个强大但不方便的工具。
- 上网搜正则表达式测试工具,可以帮我们确定我们写的表达式是否有效