python-requests-基本使用/请求方式/代理/实战

文章目录

  • 前言
  • 一、基本使用
  • 二、requests_请求方法
    • 1.get请求
    • 2.post请求
  • 三、代理
    • 快代理
  • 四、实战

前言

经常会遇到需要向第三方发送http请求的场景,python中的requests库可以很好的满足这一要求,Requests模块是一个用于网络请求的模块,主要用来模拟浏览器发请求。其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。但是这些模块都复杂而且差不多过时了,requests模块简单强大高效,使得其在众多网络请求模块中脱引而出。

一、基本使用

1、文档

	官方文档
		https://docs.python.org/zh-cn/3.7/
		https://requests.readthedocs.io/en/latest/
	快速上手
		https://requests.readthedocs.io/en/latest/user/quickstart/
	    https://blog.csdn.net/thmail/article/details/74330626?ops_request_misc=&request_id=&biz_id=102&utm_term=requests%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%96%87%E6%A1%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-74330626.142^v73^control,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187	    

2、安装

sudo pip3 install requests

安装结果
python-requests-基本使用/请求方式/代理/实战_第1张图片
3、1个类型和6个属性

代码如下(示例):requests_基本使用.py

# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 1:25 PM
# @Author : yanhh
# @File : requests_基本使用
# @Project : pythonProject
import requests

url = 'http://www.baidu.com'
response = requests.get(url=url)
# 一个类型和六个属性
# 一个类型Response
# <class 'requests.models.Response'>
# print(type(response))

# 六个属性

# 0、设置响应的编码格式
response.encoding = 'utf-8'

# 1、以字符串的形式来返回了网页的源码
# print(response.text)

# 2、获取请求的url:http://www.baidu.com/
# print(response.url)

# 3、响应的字节类型 b'<!DOCTYPE html>\r...
# print(response.content)

# 4、返回响应状态码 200
# print(response.status_code)

# 5、返回响应头 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 27 Feb 2023 07:35:11 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:29 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
print(response.headers)

二、requests_请求方法

1.get请求

代码如下(示例):request_get请求.py

# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 3:39 PM
# @Author : yanhh
# @File : request_get请求
# @Project : pythonProject

import requests

url = 'https://www.baidu.com/s'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
data = {
    'wd': '北京'
}

# url 请求资源路径
# params参数
# kwargs字典
response = requests.get(url=url, params=data, headers=headers)

content = response.text

print(content)

# 总结
# 1、参数使用params传递
# 2、参数无需urlencode编码
# 3、不需要请求对象的定制
# 4、请求路径中的?可以不加

2.post请求

代码如下(示例):requests_post请求.py

# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 3:57 PM
# @Author : yanhh
# @File : requests_post请求
# @Project : pythonProject

# 爬取百度翻译

import requests

url = 'https://fanyi.baidu.com/sug'
data = {
    'kw': 'eye'
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}

# url 请求地址
# data请求参数
# kwargs 字典
response = requests.post(url=url, data=data, headers=headers)
content = response.text

import json

obj = json.loads(content, encoding='utf-8')
print(obj)

# 总结
# 1、post请求,不需要编解码
# 2、post的请求参数是data
# 3、不需要请求对象的定制

结果
在这里插入图片描述

三、代理

代码如下(示例):requests_代理.py

# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 4:27 PM
# @Author : yanhh
# @File : requests_代理
# @Project : pythonProject

import requests

url = 'http://www.baidu.com/s?'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
data = {
    'wd': 'ip'
}
# 代理
proxy = {
    'http': '60.211.218.78:53281'
}

response = requests.get(url=url, params=data, headers=headers, proxies=proxy)

content = response.text
# 内容写入 agent.html
with open('agent.html', 'w', encoding='utf-8') as fp:
    fp.write(content)

快代理

https://www.kuaidaili.com/free/intr/
python-requests-基本使用/请求方式/代理/实战_第2张图片

四、实战

# 通过登陆  然后进入到主页面
 
 
# 通过找登陆接口我们发现 登陆的时候需要的参数很多
# _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: [email protected]
# pwd: xxxx
# code: PId7
# denglu: 登录
 
# 我们观察到_VIEWSTATE   __VIEWSTATEGENERATOR  code是一个可以变化的量
 
# 难点:(1)_VIEWSTATE   __VIEWSTATEGENERATOR  一般情况看不到的数据 都是在页面的源码中
#     我们观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
#     (2)验证码
 
import requests
 
 
# 这是登陆页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
 
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
 
# 获取页面的源码
response = requests.get(url = url,headers = headers)
content = response.text
 
# 解析页面源码  然后获取_VIEWSTATE   __VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
 
soup = BeautifulSoup(content,'lxml')
 
# 获取_VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
 
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
 
 
# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code
 
# 有坑
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# requests里面有一个方法 session()  通过session的返回值 就能使用请求变成一个对象
 
session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据  因为我们要使用的是图片的下载
content_code = response_code.content
# wb的模式就是将二进制数据写入到文件
with open('code.jpg','wb')as fp:
    fp.write(content_code)
 
 
 
 
# 获取了验证码的图片之后 下载到本地 然后观察验证码  观察之后 然后在控制台输入这个验证码 就可以将这个值给
# code的参数 就可以登陆
 
code_name = input('请输入你的验证码')
 
 
# 点击登陆
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
 
data_post = {
    '__VIEWSTATE': viewstate,
    '__VIEWSTATEGENERATOR': viewstategenerator,
    'from': 'http://so.gushiwen.cn/user/collect.aspx',
    'email': '[email protected]',
    'pwd': 'action',
    'code': code_name,
    'denglu': '登录',
}
 
response_post = session.post(url = url, headers = headers, data = data_post)
 
content_post = response_post.text
 
with open('gushiwen.html','w',encoding= ' utf-8')as fp:
    fp.write(content_post)
 
 
# 难点
# (1) 隐藏域
# (2) 验证码
 

你可能感兴趣的:(爬虫,python,开发语言)