Python爬虫 Requests库

本文介绍了如何使用Python的Requests库进行网络爬虫,包括get(),head(),post()方法的使用,以及HTTP协议的理解。涵盖了网页抓取、头部信息修改、百度搜索关键词提交和网络图片爬取与存储的实例。
摘要由CSDN通过智能技术生成

学习嵩天老师的爬虫专题课,总结学习内容

嵩天老师慕课课程链接指路:Python网络爬虫与信息提取_中国大学MOOC(慕课) (icourse163.org)

目录

 Requests库的7个主要方法

Requests库的get()方法 

Response对象的属性

爬取网页的通用代码框架

HTTP协议

HTTP协议对资源的操作

Requests库的head()方法

 Requests库的post()方法

实例

更改头部信息,模拟浏览器向服务器发起HTTP请求

百度搜索关键词提交

网络图片的爬取和存储


 Requests库的7个主要方法

方法说明
requests.request()构造一个请求对象,是基础方法
requests.get()用于获取HTML网页
requests.head()用于获取HTML网页头信息
requests.post()用于向HTML提交POST请求
requests.put()用于向HTML提交PUT请求
requests.patch()用于向HTML提交局部修改请求
requests.delete()用于向HTML提交删除请求

Requests库的get()方法 

import requests
r = requests.get(url) # r用于接收一个包含服务器资源的Response对象

 request.get(url, params=None, **kwargs)

url:拟获取页面的链接

params:url中的额外参数,用字典或者字节流格式,可选

**kwargs:12个控制访问的参数,可选

Response对象的属性

属性说明
r.status_code

   HTTP请求的返回状态,200表示连接成功

r.textHTTP响应内容的字符串形式,即url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式

r.encoding:如果header中不存在charset字段,则接收到的返回编码为ISO-8859-1 

URL位置资源的头部信息:URL位置资源的响应消息报告(资源的大概内容)

爬取网页的通用代码框架

import requests

def getHTMLText(url):
    try:   # 异常处理
        r = request.get(url, timeout = 30)
        r.raise_for_status() # 若状态码不是200, 引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text # 一般会界定一个文本范围 r.text[:1000]
    except:
        return "产生异常"
  
if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

HTTP协议

HTTP,Hypertext Transfer Protocol,超文本传输协议

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议

用户发起请求,服务器响应;无状态:第一次和第二次请求之间没有联系

HTTP协议采用URL作为定位网络资源的标识,URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源

URL格式如下:

http://host[:port][path]

三个域

host:合法的Internet主机域名或IP地址
port::端口号,缺省端口为80
path::请求资源的路径,在服务器或者主机里的内部路径

http://202.181.111.188/duty     此IP地址下,duty文件夹里的资源

HTTP协议对资源的操作

GET HEAD DELETE 就是字面意思,不赘述,主要看剩下三种

方法说明
POST请求向URL位置的资源后附加新的数据
PUT请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH请求局部更新URL位置的资源,即改变该处资源的部分内容

注意区分PATCH和PUT:

假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段
需求:用户修改了UserName,其他不变

  • 采用PATCH,仅向URL提交UserName的局部更新请求
  • 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除

PATCH的最主要好处:节省网络带宽

Requests库的head()方法

r = requests.head('http://httpbin.org/get')
print(r.headers) # 展示反馈的头部信息内容,用很少的网络资源获得概要信息

 Requests库的post()方法

put()方法与之类似

payload = {'key1':'value1', 'key2':'value2'} # 提交一个字典
r = requests.post('http://httpbin.org/post', data = payload)
print(r.text) # 提交键值对或者字典,会被默认放到form表单的字段下

# 如果提交一个字符串,自动编码为data,放到data字段下
r = requests.post('http://httpbin.org/post', data = 'ABC')
print(r.text)

实例

更改头部信息,模拟浏览器向服务器发起HTTP请求

r = requests.get(url) 
print(r.status_code)   # 503,服务器无法处理请求
print(r.request.headers)
# 'User-Agent': 'python-requests/2.26.0'
# 更改头部信息 
kv = {'user-agent':'Mozilla/5.0'}  # Mozilla/5.0 标准浏览器的身份标识字段
url = ""
r = requests.get(url, headers= kv) # 更改User-agent信息
print(r.status_code)
print(r.request.headers)
print(r.text[:1000])

# 全部代码
url = ""
try:
    kv = {'user-agent': 'Mozilla/5.0'}
    r = requests.get(url, headers= kv)
    r.raise_for_status() # 判断返回的Response类型状态是不是200
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("爬取失败")

百度搜索关键词提交

用程序自动向百度搜索引擎提交关键词并获得搜索结果

百度的关键词API接口:http://www.baidu.com/s?wd=keyword

在网站上看到的人机交互方式,比如图形的,文本框的,需要点击按钮的,在正式地向后台服务器提交的时候,是以链接
的形式提交的,只要你能够去通过浏览器的解析知道向后台提交的链接形式,就可以用代码向服务器做正式的提交。

import requests
kv ={'wd':'Python'}
r = requests.get("http://www.baidu.com/s",params= kv )
print(r.status_code)
# 查看我们对百度提交的请求
print(r.request.url)
# 返回值:http://www.baidu.com/s?wd=Python
print(len(r.text))
# 1085590

网络图片的爬取和存储

#网络图片的爬取和存储
path = "D:/Develop/abc.jpg"  # 本地保存地址,命名为abc
# https://www.nationalgeographic.com/ 国家地理
# 图片地址
url = "https://i.natgeofe.com/n/8626826d-18fb-4be1-b62a-454259bbd3c7/White_Rhino_to_be_Released_Over_10_Years_Brent_Stirton_and_African_Parks.jpg?w=954&h=636"
r = requests.get(url)
print(r.status_code)
# 把二进制数据(图片)保存为文件
with open (path, 'wb') as f:
    f.write(r.content)
    f.close()

# 全部代码
import requests
import os
url = "https://i.natgeofe.com/n/8626826d-18fb-4be1-b62a-454259bbd3c7/White_Rhino_to_be_Released_Over_10_Years_Brent_Stirton_and_African_Parks.jpg" 
root = "D:/Develop//pics"
path = root + url.split('/')[-1]  # 以图片本身名字保存   
try:
    if not os.path.exists(root): # 如果路径不存在,创建一个目录
        os.mkdir(root)
    if not os.path.exists(path): # 如果文件不存在,去网页获取
        r = requests.get(url)
        with open (path, 'wb') as f:
          f.write(r.content)
          f.close()
          print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Re.no1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值