Python爬虫 - Requests模块

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3。以上内容来自Requests官网文档

:requests库发送请求以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求。

一、安装Requests

pip install requests

二、六种请求方式(post和get最常见)

requests.get('you url')         # GET请求
requests.post('you url')        # POST请求
requests.put('you url')         # PUT请求
requests.delete('you url')      # DELETE请求
requests.head('you url')        # HEAD请求
requests.options('you url')     # OPTIONS请求
import requests

r = requests.get('https://www.baidu.com/')                                             # 发起get请求
# r = requests.request(method='get',url='https://www.baidu.com/')                        # 另一种写法,和上边效果一样

# r = requests.post('you url',data={'key':'value'})                                      # 发起post请求(发送字典)
# r = requests.post('you url',data=json.dumps({'key':'value'}))                          # 发起post请求(发送json)
# r = requests,request(method='post',url='you url',data={'key':'value'})                 # 另一种写法
# r = requests,request(method='post',url='you url',data=json.dumps({'key':'value'}))     # 另一种写法

print(r) # 打印结果为状态码,<Response [200]>表示请求成功

三、Requests参数详情

1、添加headers(请求头)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

response = requests.get("http://www.baidu.com/", headers=headers)

print(response) # 返回结果为<Response [200]>说明请求成功

2、添加params(给url添加参数)

import requests

kw = {'wd':'python'}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)

print(response) # 返回结果为<Response [200]>说明请求成功

3、添加proxies(代理)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}

# {'类型':'ip:端口'}
proxies = {
    'http':'106.110.212.206:9999'
}
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
#proxy = { "http": "mr_mao_hacker:[email protected]:9999" }

response = requests.get("http://www.baidu.com/", headers=headers, proxies = proxies)

print(response) # 返回结果为<Response [200]>说明请求成功

代理IP可以在免费的网站上获取:西刺代理,大家都懂,免费的质量上不是很乐观,测试还是没问题的,可以多试几个。

4、添加data(post请求)

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
data = {
    "key":"value"
}

response = requests.post("you url", data = data, headers = headers)
print(response)

5、添加auth(Web客户端验证)

import requests

auth = ('test', '123456')

response = requests.get('you url', auth=auth)

print(response) # 返回结果为<Response [200]>说明请求成功

6、设置超时时间

import requests

response = requests.get('url',timeout=10)    #设置秒数超时,仅对于连接有效

7、添加verify(跳过证书验证)

例如这样的页面就可以使用verify
程序会报错:SSLError: (“bad handshake: Error([(‘SSL routines’, ‘ssl3_get_server_certificate’, ‘certificate verify failed’)],)”,)
在这里插入图片描述

import requests

response = requests.get("https://www.12306.cn/mormhweb/", verify = False)

print(response) # 返回结果为<Response [200]>说明请求成功

四、获取响应的内容

response.encoding              # 获取当前的编码
response.encoding = 'utf-8'    # 设置编码
response.text                  # 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
response.content               # 以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。

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

response.status_code           # 响应状态码
response.raw                   # 返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()   
response.ok                    # 查看r.ok的布尔值便可以知道是否登陆成功
 #*特殊方法*#
response.json()                # Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
response.raise_for_status()    # 失败请求(非200响应)抛出异常
response.cookies               # 返回cookie
response.history               # 返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向
import requests

response = requests.get('https://www.baidu.com/')   # 发起get请求
print('当前的编码:',r.encoding)
response.encoding = 'utf-8'   #设置编码
print('设置后的编码:',response.encoding)
print('以encoding解析返回内容:',response.text)
print('以字节形式(二进制)返回:',response.content)
print('响应头:',response.headers)
print('响应状态码:',response.status_code)
print('返回原始响应体:',response.raw)
print('是否登陆成功:',response.ok)

# print('以json形式返回:',response.json()) #确保返回的内容是json格式的,不然解析出错会抛异常
print('失败请求抛出异常:',response.raise_for_status())
print('结果为状态码',response)
print('cookie:',response.cookies)
print('重定向信息:',response.history)
# 运行结果
当前的编码: ISO-8859-1
设置后的编码: utf-8
以encoding解析返回内容: <!DOCTYPE html><!--STATUS OK--><html> <head>...太多了,略一部分
以字节形式(二进制)返回: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head>...太多了,略一部分
响应头: {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 09 Jan 2020 03:31:29 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
响应状态码: 200
返回原始响应体: <urllib3.response.HTTPResponse object at 0x000001A9337809B0>
是否登陆成功: True
失败请求抛出异常: None
结果为状态码 <Response [200]>
cookie: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
重定向信息: []

五、定制cookie信息

import requests

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'}
cookie = {'key':'value'}
response = requests.get('your url',headers=header,cookies=cookie) 

六、操作Sission实现人人网登录

import requests

# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()

# 2. 处理 headers
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}

# 3. 需要登录的用户名和密码
data = {"email": "用户名", "password": "密码"}

# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data=data)

# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")

# 6. 打印响应内容
print(response.text)

七、会话对象,能够跨请求保持某些参数

import requests

s = requests.Session()
s.auth = ('user','pwd')
s.headers = {'key':'value'}
r = s.get('you url1')
r1 = s.get('you url2') 
欢迎关注同名微信公众号:程序猿杂记

程序猿杂记

技术|交流|福利
发布了63 篇原创文章 · 获赞 87 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_44110998/article/details/103902665