Python爬虫_05_requests

葛意远
2023-12-01

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)) #<class 'requests.models.Response'>

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

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

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

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

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

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

2.get请求

requests.get()
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':'北京'
}
response = requests.get(url,params=data,headers=headers)
定制参数
参数使用params传递
参数无需urlencode编码
不需要请求对象的定制
请求资源路径中?可加可不加

例:

# 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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 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请求

requests.post()
百度翻译:
eg:
import requests
post_url = 'http://fanyi.baidu.com/sug'
headers={
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
data = {
'kw': 'eye'
}
r = requests.post(url = post_url,headers=headers,data=data)

例:

import requests
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
headers= {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
    'Cookie': 'BIDUPSID=F16CB27ACF03F17C663329DE31E4062A; PSTM=1636886727; __yjs_duid=1_55c745398f06267e3638446ca7d77d7f1636887396137; BAIDUID=6DEE7240C943288B149F4CCB41CDA797:FG=1; MCITY=-131%3A; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; APPGUIDE_10_0_2=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDRCVFR[_9ZHYSeLVAT]=788S7gSrw2CuvqEuvk-Uh7vQhP8; H_PS_PSSID=; delPer=0; PSINO=1; BDRCVFR[fPgyykSwtk3]=788S7gSrw2CuvqEuvk-Uh7vQhP8; BA_HECTOR=05al8h8585058l8lsl1h4so4k0r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1649067782,1649303702; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1649303702; ab_sr=1.0.1_OTIxYTM4NWNmMjQ0YmVjZTQzMDNmNjRiZTAwODhiYTY3MjA2MDg1NTQxODhiYWM1YWNhMzA3MGQ1YzdkNDc1NDM4NTAyMDg1ZDMwYjIwMDMyMDUyOGEwYTg1Zjk3MDM1MGMyNTllNTViODc1NjY5MzBhNGRmNTUwOGVhZjRmZDNlZjZjYWI4NmQwZjA5NGY3MGM1Y2UzN2UwOGFiMzhhZg=='
}

data= {
     'query': 'eye',
      'token': 'fcb141eb5cc8b83af203e132e27bcb76',
    'sign': 67056.386753,
}
# url请求地址
# data 请求参数
# kwargs 字典
response = requests.post(url=url,data=data,headers=headers)
content = response.text
print(content)
import json
obj = json.loads(content)
print(obj)

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

get和post区别?

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

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://www.baidu.com/s?'

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

data = {
    'wd': 'ip'
}

proxy = {
    # 'https' : '183.247.199.126:30001',
    # 'https': '117.94.113.72:90'
    'https': '212.129.251.55:16816'
}
response = requests.get(url=url,params=data,headers=headers,proxies=proxy)
content = response.text
print(content)

with open('dowload/template/daili_087.html','w',encoding='utf-8') as fp:
    fp.write(content)

5.cookie定制

cookie定制
	应用案例:
	(1)古诗文网(需要验证)
	(2)云打码平台
	用户登陆 actionuser action
	开发者登陆 actioncode action

例:利用cookie登录古诗文网

# 通过登录找到登录接口,我们发现 登录的时候需要的参数很多
'''
登录网页:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
登录请求接口
https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx
# post请求
# 参数
__VIEWSTATE: CHCHHuFBOA2/2kriMRXFpZ2CK/IVF2NyzSTbVSPd31dkjvTExPL+M6/2YDtFvNkG9PpGqFz/+2spAvr+6lFog7m6JlxCcLRBpHu47VNSjN6jhDLR3OprMH9+u6s=
__VIEWSTATEGENERATOR: C93BE1AE
from: http://so.gushiwen.cn/user/collect.aspx
email: 183xxxxx6269
pwd: 3132xxxxdfaf
code: Y7G5
denglu: 登录

我们观察到__VIEWSTATE,__VIEWSTATEGENERATOR,code是一个可以变化的量

难点:1 __VIEWSTATE,__VIEWSTATEGENERATOR, 一般情况下看不到的数据,都是在页面的源码中
        网页右键点击查看源码,Ctil+f检索__VIEWSTATEGENERATOR得到如下
        <div>
            <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="C93BE1AE" />
        </div>
        <div>
            <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CHCHHuFBOA2/2kriMRXFpZ2CK/IVF2NyzSTbVSPd31dkjvTExPL+M6/2YDtFvNkG9PpGqFz/+2spAvr+6lFog7m6JlxCcLRBpHu47VNSjN6jhDLR3OprMH9+u6s=" />
        </div>
        我们观察到这两个数据在页面的源码中,我们需要获取页面的源码然后进行解析就可以获取了

    2 验证码code
    通过F12的Elements,检索到验证码相关的代码
    <img id="imgCode" style="cursor: pointer; float:left; margin-left:5px; margin-top:1px;" width="60" height="27" src="/RandCode.ashx" οnclick="GetCodeImg()" alt="看不清,换一张">
    我们可以通过id检索imgCode获取img标签,在获取src=属性,通过域名+src属性,获取图片完整地址

    # 验证码识别,可以百度超级鹰
'''

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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
content = response.text  # 获取页面的源码
# print(content)
# 解析页面源码,然后获取__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')
# print(__VIEWSTATE)
# print(__VIEWSTATEGENERATOR)

# 获取验证码图片
code = soup.select("#imgCode")[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn'+ code
print(code_url)

# 将验证码保存到本地
# 有坑: 这里下载的验证码,并非是上面内容获取的验证码,因为不是一个请求,这里下载的时候又请求了一次,随机验证码被并非同一个
# 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 = response_code.content
# wb 就是将二进制写入到文件
with open('dowload/template/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': '登录'
}
# 这里不能用request,用session,保证请求是同一个
response_post = session.post(url=url,headers=headers,data=data_post)
content_post = response_post.text
with open('dowload/template/古诗文.html','w',encoding='utf-8') as fp:
    fp.write(content_post)

# 难点
# 1 隐藏域
# 2 验证码
 类似资料: