python爬虫7-request

1.基本使用

1.文档:
	官方文档
		http://cn.python‐requests.org/zh_CN/latest/
	快速上手
		http://cn.python‐requests.org/zh_CN/latest/user/quickstart.html
2.安装
pip install requests
3.response的属性以及类型
	类型 :models.Response
	r.text : 获取网站源码
	r.encoding :访问或定制编码方式
	r.url :获取请求的url
	r.content :响应的字节类型
	r.status_code :响应的状态码
	r.headers :响应的头信息

import requests


url = 'http://www.baidu.com'


response = requests.get(url=url)

# 一个类型和六个属性
# Response类型
# print(type(response))

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

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

# 返回一个url地址
# print(response.url)

# 返回的是二进制的数据
# print(response.content)

# 返回响应的状态码
# print(response.status_code)

# 返回的是响应头
print(response.headers)

2.get请求


# urllib
# (1) 一个类型以及六个方法
# (2)get请求
# (3)post请求   百度翻译
# (4)ajax的get请求
# (5)ajax的post请求
# (6)cookie登陆 微博
# (7)代理


# requests
# (1)一个类型以及六个属性
# (2)get请求
# (3)post请求
# (4)代理
# (5)cookie  验证码


import requests

url = 'https://www.baidu.com/s'

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'
}

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)请求资源路径中的?可以加也可以不加

3.post请求

get和post区别?
1: get请求的参数名字是params post请求的参数的名字是data
2: 请求资源路径后面可以不加?
3: 不需要手动编解码
4: 不需要做请求对象的定制


import requests

url = 'https://fanyi.baidu.com/sug'

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'
}

data = {
    'kw': 'eye'
}

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

# 方式1:
content = response.json()

# 方式2
# content = response.text
# import json
# content = json.loads(content)


print(content)

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

4.代理

	proxy定制
	在请求中设置proxies参数
	参数类型是一个字典类型
	eg:
		import requests
		url = 'http://www.baidu.com/s?'
		headers = {
			'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
		like Gecko) Chrome/65.0.3325.181 Safari/537.36'
		}
		data = {
			'wd':'ip'
		}
		proxy = {
			'http':'219.149.59.250:9797'
		}
		r = requests.get(url=url,params=data,headers=headers,proxies=proxy)
		with open('proxy.html','w',encoding='utf‐8') as fp:
			fp.write(r.text)

示例:



import requests

url = 'https://zh-hans.ipshu.com/my_info'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
}

# data = {
#     'wd':'ip'
# }


proxy = {
    'https':'112.194.89.38:41122'
}

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

content = response.text

with open('daili.html','w',encoding='utf-8')as fp:
    fp.write(content)

4.cookie登入

我们首先输入错误的信息登入,同时观察network界面,network界面会出现login
一般login是登入接口。
通过登入接口我们发现 登入时候需要的登入参数很多
我们一个一个的进行分析
在这里插入图片描述

from: http://so.gushiwen.cn/user/collect.aspx
__VIEWSTATE: RfbE0QXSx6E6uCM8MtbCh9VWBwt7spo8d1IykqWl3aQZs7ghQUO4W0Y8VrOufF55KBAABmLDZcd9DLsh3SYi1kHYjQ4OCVqePM9daLTjdvnvhlxu68gXNMO/yb105ul2BTo5Zsqya/i+ZDGZF8eypXIBppA=
__VIEWSTATEGENERATOR: C93BE1AE
from: https://www.gushiwen.cn/
email: 12345678902
pwd: 12312432
code: Au17
denglu: 登录

其中我们发现这些都有其的对应关系
from–>网址
email–>账号
pwd–>密码
code–>验证码
其中只有三个参数是变量

__VIEWSTATE: 
__VIEWSTATEGENERATOR:
code:

难点:
(1)_VIEWSTATE __VIEWSTATEGENERATOR 一般情况看不到的数据 都是在页面的源码中
我们观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
(2)验证码

我们通过右键查看页面的源码,ctrl+f查找_VIEWSTATE ,我们可以看到hiddenhidden是一个隐藏域,在页面中不显示,但是在页面中存在

接下来我们获取验证码
我们定位到该元素,id=imgcode
在这里插入图片描述
src后面跟随着一个网站,我们打开该网站我们发现就是登入页面的验证码

在这里插入图片描述

# 获取了验证码的图片之后 下载到本地 然后观察验证码  观察之后 然后在控制台输入这个验证码 就可以将这个值给
# code的参数 就可以登

接下来我们获取登入接口,我们在获取时建议将在这里插入图片描述
勾选上,如果是老版本的chrome浏览器没有勾选上,在登入成功之后会将login文件删除,勾选上了之后登入信息便会保存下来

我们发现登入接口是post请求在这里插入图片描述
我们将Request URL复制下来作为url_post
我们将其参数都粘贴下来,其中要注意的是
__VIEWSTATE:,_VIEWSTATEGENERATOR: code是变化的参数,我们将它们各自获取的值赋值给它的value

在这里插入图片描述

# 通过登陆  然后进入到主页面


# 通过找登陆接口我们发现 登陆的时候需要的参数很多
# _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 595165358@qq.com
# pwd: action
# 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'),
# 原因是如果在下面进行请求的话,
# response_post = requests.post(url = url, headers = headers, data = data_post)上面下载的验证码和下面请求到的验证码就不是同一个验证码,所以会导致出现验证码错误的页面
# requests里面有一个方法 session()  通过session的返回值 就能使用请求变成一个对象,但是我们在请求时需要将requests改成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': '595165358@qq.com',
    '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) 验证码


需要注意的是我们需要先到资源管理器中查看该图片,后面在到pycharm中才能看到该文件,因为pycharm中加载的比较慢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值