目录
一、Requests 简介
1.1、requests是什么
requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多
1.2、安装
1.3、response的属性及类型
类型 | models.Response |
response.text | 获取网站源码 |
response.encoding | 访问或定制编码方式 |
response.url | 获取请求的url |
response.content | 响应的字节类型 |
response.status_code | 响应的状态码 |
response.headers | 响应的头信息 |
import requests
url = 'https://www.baidu.com'
response = requests.get(url=url)
# 一个类型和六个属性
print(type(response))
# 设置响应的编码格式
response.encoding = 'utf8'
# 以字符串的形式返回网页源码
print(response.text)
# 返回一个url地址
print(response.url)
# 返回二进制的数据
print(response.content)
# 返回响应的状态码
print(response.status_code)
# 返回响应头信息
print(response.headers)
二、requests使用
2.1、requests 的 get 请求
(1)参数使用params传递
(2)参数无需urlencode编码
(3)不需要请求对象的定制
(4)请求资源路径中的?可加可不加
import requests
url = 'http://www.baidu.com/s?'
# 反反爬手段,向请求中加入headers
headers = {
'Cookie': '',
'User-Agent': '',
}
data = {
'wd': '北京'
}
# url:请求资源路径
# params:参数
# kwargs:字典
response = requests.get(url=url, params=data, headers=headers)
content = response.text
print(content)
2.2、requests 的 post 请求
(1)post 请求,不需要编解码
(2)post 请求的参数是 data
(3)不需要请求对象的定制
import requests
import json
url = 'https://fanyi.baidu.com/sug'
# 反反爬手段,向请求中加入headers
headers = {
'User-Agent': '',
}
data = {
'kw': 'eye'
}
# url:请求资源路径
# data:请求参数
# kwargs:字典
response = requests.post(url=url, data=data, headers=headers)
content = response.text
obj = json.loads(content, encoding='utf-8')
print(obj)
2.3、request 代理
用快代理获取ip:快代理 - 企业级HTTP代理IP云服务
import requests
url = 'http://www.baidu.com/s?'
# 反反爬手段,向请求中加入headers
headers = {
'User-Agent': '',
}
data = {
'wd': 'ip'
}
proxy = {
'http': 'ip:端口号'
}
response = requests.get(url=url, params=data, headers=headers, proxies=proxy)
content = response.text
with open('daili.html', 'w', encoding='utf8') as fp:
fp.write(content)
2.4、cookie登录
2.4.1、难点:
1、登陆参数获取:
对于下列参数,__VIEWSTATE和__VIEWSTATEGENERATOR的值的获取
# 通过找登录接口,发现登陆参数有很多 # __VIEWSTATE: yBR7i/CfOluitzhWj0BEY3LZQ4IALwhDwIaRLd3rhTSdj7NIIqmnF8TcTn8RvDNnG0fM6kvPDW7DA5KCdOgE0Ls2CKxJbZFTBduqurV/NvQIa2IwZmc1PrKPyHmI5gno8pkx8YE1WTtcrRsol9c3EQS0ZmA= # __VIEWSTATEGENERATOR: C93BE1AE # from: http://so.gushiwen.cn/user/collect.aspx # email: # pwd: # code: 7DFJ # denglu: 登录
2、验证码的获取:验证码在随时变动,且通过图片告知登陆者
2.4.2、解决
1、登陆参数:一般在页面源码中存在参数,大多存在隐藏域中
2、验证码:通过requests的session()方法获取并利用session发起验证码输入请求。
2.4.3、代码
import requests
from bs4 import BeautifulSoup
# 登陆页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
'User-Agent': '',
}
# 获取页面的源码
response = requests.get(url=url, headers=headers)
content = response.text
# 解析页面源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR
soup = BeautifulSoup(content, 'lxml')
# 获取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print(viewstate)
print(viewstategenerator)
# 获取验证码图片
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_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': '',
'pwd': '',
'code': code_name,
'denglu': '登录'
}
response_post = session.post(url=url, headers=headers, data=data_post)
content_post = response_post.text
with open('gushici.html', 'w', encoding='utf8') as fp:
fp.write(content_post)
本文含有隐藏内容,请 开通VIP 后查看