1. 基本使用

一个类型六个属性

  • 类型:models.Response
  • 属性:
    • r.text:获取网站源码
    • r.encoding:访问或定制编码方式
    • r.url:获取请求的url
    • r.content:获取响应的字节类型
    • r.status_code:响应的状态码
    • r.headers:相应的头信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import requests

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

response = requests.get(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请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests

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

data = {
'wd':'黑子的篮球'
}

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

response = requests.get(url=url,params=data,headers=headers)
response.encoding = 'utf-8'
content = response.text

print(content)

总结:

  • 参数用params传递
  • 参数无需urlencode编码
  • 不需要请求对象的定制
  • 请求资源路径中的?可加可不加

3. Post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import requests

url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'

data = {
'i': 'love',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16494072793394',
'sign': '58f09b7d5c54bad3cf13f284d1ad11eb',
'lts': '1649407279339',
'bv': 'cf0f0924f577526ad20c2e2b01510b6f',
'doctype': 'json',
'version': 2.1,
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
'cookie':'OUTFOX_SEARCH_USER_ID=394345011@10.169.0.102; OUTFOX_SEARCH_USER_ID_NCOO=1734306557.6906822; _ntes_nnid=ed414fcfa561a8574af03795d7aacf0f,1645673021070; fanyi-ad-id=305426; fanyi-ad-closed=1; JSESSIONID=aaaaPSk8l2vvngf7zviay; ___rl__test__cookies=1649407279337'
}

response = requests.post(url=url, data=data, headers=headers)

content = response.text
print(content)

get方式和post方式的区别和相同点?

  1. 区别:
    1. get请求方式的参数名字是params,post请求方式的参数的名字是data。
  2. 相同点:
    1. 都不需要手动编解码
    2. 都不需要请求对象的定制

4. 代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*-coding:utf-8-*-
# @Time:2022/4/108:14
# @Author:陈 玉 皓
# @File:代理.py
# @Sofeware:PyCharm

'''
proxy定制:
在请求中设置proxies参数
参数类型是一个字典类型
'''


import requests

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

headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
}
proxy = {
'http':'115.218.4.207:9000'
}

data = {
'wd': 'ip'
}

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

content = response.text

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

5.cookie定制

案例:登录古诗文网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# -*-coding:utf-8-*-
# @Time:2022/4/108:33
# @Author:陈 玉 皓
# @File:古诗文网登录案例.py
# @Sofeware:PyCharm


# 通过登录 进入到主页面
'''
__VIEWSTATE: 0jT+rlrbIVk5b2Vr9nfiJmkUQYCGOce8pRTotC5+WcuisZmBp0mHcX6f4IDi0J+B4yfNb0ABTvwFnP0r4uNpYGZUFyT51SAOpg9mS/iReKe81zr8fRay9e3aXqM=
__VIEWSTATEGENERATOR: C93BE1AE
from: http://so.gushiwen.cn/user/collect.aspx
email: 1772302265@qq.com
pwd: 15632453
code: NBAO
denglu: 登录
'''
#一般情况下,看不到的数据都是在页面的源码中
# 观察到__VIEWSTATE __VIEWSTATEGENERATOR 和 code是变化的


# 难点:(1)__VIEWSTATE __VIEWSTATEGENERATOR
#观察到这两个数据在页面的源码中,所以只需要获取页面的源码,然后进行解析就可以获取了
# (2)验证码code
import requests
from bs4 import BeautifulSoup

#登录页面
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/99.0.4844.82 Safari/537.36',
}

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

content = response.text


#解析数据
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
#print(code_url)

#session()方法的返回值可以使请求变成同一个对象

session = requests.session()
#验证码的url的内容
response_code = session.get(code_url)
# 注意:此事要使用二进制的形式,因为图片的下载使用的是二进制
content_code = response_code.content
with open('code.jpg','wb') as f:
f.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': '1772302265@qq.com',
'pwd': 'wodemaa520....',
'code': code_name,
'denglu': '登录',
}

response_post = session.post(url=url_post,headers=headers,data=data_post)

content_post = response_post.text

with open('gushiwen.html','w',encoding='utf-8') as f:
f.write(content_post)