6.Python 爬虫 week2

发布于:2022-12-22 ⋅ 阅读:(547) ⋅ 点赞:(0)

Python 课堂作业

episode6  Python 网络编程技术与爬虫



前言

了解get&post区别

同:HTTP协议中的两种发送请求的方法,底层都是TCP/IP协议

👀——浏览器

get post
获取数据(也可提交) 提交数据
请求数据(参数)放在url中 请求数据放在body中
参数直接暴露在url上,不安全 较为安全
参数有长度限制 没有限制
回退无影响 回退时需重新提交请求
请求可以被缓存 请求不会被缓存

请求会被保存在👀历史记录中

可被bookmark

不会,也不可以被收藏为书签
只能进行url编码 支持多种编码方式
只接受ASCII字符 没有限制
通常产生一个TCP数据包 两个
会被浏览器主动cache 不会,除非手动设置

👀会把head和data一并发送

服务器响应200

先发送header---100

再发送data---200

 


一、http协议常见状态码有哪些以及含义?

当我们访问一个网页时,浏览器会向网页所在服务器发出请求,当服务器收到请求后,就会解析请求并做出响应,同时服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。但是这个过程并不百分百成功,并且情况也很复杂,所以状态码就起到至关重要的作用的作用。

1** 系列

服务器收到请求,表示临响应,需要请求者继续执行操作;

100 Continue 请求者(客户端)应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101(切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。


2** 系列

操作被成功接收并处理;

200 OK(成功) 务器已成功处理请求。通常表示服务器提供了请求的网页。如果是对robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。一般用于GET与POST请求
201(已创建) 请求成功并且服务器创建了新的资源。
202(已接受) 服务器已接受请求,但尚未处理。
203(非授权信息) 服务器请求成功,但返回的meta信息不在原始的服务器,可能来自另一副本。
204 No Content (无内容) 服务器请求成功,但没有返回任何内容。
205(重置内容) 服务器请求成功,但没有返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。
206(部分内容) 服务器成功处理了部分 GET 请求。


3** 系列

重定向,需要进一步的操作以完成请求;

300(多种选择) 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301(永久移动) 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。
302(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置。
303(查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。使用GET和POST请求查看。
304(未修改) 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。
305(使用代理) 使用代理,请求资源必须通过代理访问。如果服务器返回此响应,还表示请求者应使用代理。
307(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。

301、302、307常用 

391:永久重定向/移动请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替;

302:临时移动,与301相似,但资源只是临时被移动,客户端应继续使用原有URI;

307:临时重定向,与302相似,使用GET请求重定向。


4** 系列

客户端错误,请求包含语法错误或无法完成请求;

5** 系列

服务器错误,服务器在处理请求的过程中发生了错误;

二、Requests库是什么?

Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,与urllib相比,Requests更加方便,可以节约我们大量的工作,建议爬虫使用Requests库。Requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求。

三、使用步骤

1.通过pip3安装

pip3 install requests

2.验证安装

 导入库成功,说明requests安装成功。

3.基本用法

代码如下(示例):🌰🌰🌰

使用requests()库中的get()方法发送一个get请求。 

#导入requests库
import requests
#发送一个get请求并得到相应
r = requests.get('https://www.baidu.com')
#查看响应对象的类型
print(type(r))
#查看响应状态码
print(r.status_code)
#查看响应内容的类型
print(type(r.text))
#查看响应的内容
print(r.text)
#查看cookies
print(r.cookies)

运行结果:🌟 🌟 🌟 

<class 'requests.models.Response'>
200 
<class 'str'> 
<!DOCTYPE html>
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

其他类型的请求:🔍 🔍 🔍 

r = requests.post('https://www.baidu.com')
r = requests.put('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')
r = requests.options('https://www.baidu.com')

4.各个函数的功能介绍

get请求

核心代码:requests.get(url)

代码如下(示例): 🌰🌰🌰

import requests 
url = 'http://baidu.com' 
response = requests.get(url) 
print(response)

运行结果:🌟 🌟 🌟  

<Response [200]> 

打印出来的结果是:<Response [200]>。 <>表示这是一个对象,也就是我们这里获取的是一个response的对象,200表示状态码。

post请求

核心代码:requests.post(url,data={请求体的字典}

代码如下(示例): 🌰🌰🌰

from dataclasses import dataclass
import requests 
url = 'http://fanyi.baidu.com' 
data = {'from': 'zh',
        'to': 'en',
        'query': '人生苦短,我用python'
}
response = requests.post(url,data=data) 
print(response)

 运行结果:🌟 🌟 🌟 

<Response[200]> 

Response方法

获取网页的解码字符串

通过上述例子可以看到,不管是get请求还是请求,我们得到的返回都是一个Response[200]的对象,但是我们想要获取的,是与网页response一样的字符串对象,这时就需要用到response方法。

代码如下(示例): 🌰🌰🌰

import time #不引入,会报错
import requests
url = 'http://baidu.com'
response = requests.get(url)
response.encoding = 'utf-8'
print(response.text)

 运行结果:🌟 🌟 🌟  

 

 四、获取网页源码小结

1⃣️ response.contet.decode()

2⃣️response.content.decode('qbk')

3⃣️response.text

r.status_code 响应状态码

r.headers 响应头,以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None

r.cookies 响应cookies

r.text 响应文本,字符串形式,会自动根据响应头的字符编码进行解码

r.content 响应文本,字节形式,会自动解码、gzip和deflate压缩

r.encoing 当前编码

r.content 以字节形式(二进制)返回

r.raw 返回原始响应体,也就是urllib的response对象,使用r.raw.read()读取

r.json() Requests中内置的JSON解码器

r.raise_for_status() 失败请求(非200 OK响应)抛出异常

 代码如下(示例): 🌰🌰🌰

import requests
res= requests.get("http://www.baidu.com")
#获取请求头,向服务器发出请求
print(res.text)
print(type(res.headers),res.headers) #获取响应头,对发出的请求作出响应  
print(type(res.cookies),res.cookies) #获取响应cookie
print(type(res.url),res.url) #获取响应url  输出变量类型+变量内容
#获取请求url
print(res.url)

  运行结果:🌟 🌟 🌟 

 代码如下(示例)1: 🌰🌰🌰 

import requests
res = requests.get(url='http://www.itwhy.org') #最简单的get请求
print(r.status_code) #获取返回状态码

res = requests.get(url='http://dict.baidu.com/s',params={'wd':'python'})#带参数的get请求
print(r.url)
print(r.text) #打印解码后的返回数据

   运行结果1:🌟 🌟 🌟 

 

  代码如下(示例)2: 🌰🌰🌰 


import requests
#requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'})    #GET参数实例,错误的语法!!!
r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'}, timeout=60)
print(r.text)
r = requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'}, timeout=60)    #POST参数实例
print(r.content)

   运行结果2:🌟 🌟 🌟  

抛出异常:

ConnectionError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) ...

timeout限制时间 过长过短都会报错 ❓❗️

python requests没用_Python Requests中异常总结_weixin_39789399的博客-CSDN博客

python爬虫中处理超时的三种方法_Acheng1011的博客-CSDN博客_python超时处理

   代码如下(示例)3: 🌰🌰🌰 

import requests
import json

r = requests.post('https://api.github.com/some/endpoint',data=json.dumps({'some':'data'}))
print(r.json())

    运行结果3:🌟 🌟 🌟 

 


学习参考:Python爬虫Request轮子工具_顽强拼搏的阿k的博客-CSDN博客 

requests库的使用(一篇就够了)_上善若水。。的博客-CSDN博客_request库

requests介绍与使用_偷懒的肥猫的博客-CSDN博客_requests

总结

本文讲述了Python爬虫的前期认识,更为详细具体的信息资源爬取见下篇~

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到