1. Response常用的属性
- response.headers 响应头
- rsponse.request.headers 请求头
- response.status_code 状态码
- response.request.url 请求的url
- response.url 响应的url
2. 带headers的请求
headers = {"User-Agent":"从浏览器复制"}
request.get(url=url,headers=headers)
3. 带参数请求
params = {"wd":""}
requests.get(url=url,headers=headers,params=params)
4. URL编码和解码
# url解码
url = requests.utils.unquote(url)
# url 编码
requests.utils.quote(url)
5. 迭代器和可迭代
class Meta():
def __init__(self):
self.num = 0
def __iter__(self):
return self
def __next__(self):
if self.num < 10:
self.num += 1
return self.num
raise StopIteration
"""
1. 判断 Meta()对象是不是一个可迭代对象,查看是否具有__iter__()方法
2. 获取__iter__()的返回值,判断是否是一个迭代器对象,查看是否同时具有__iter__()和__next__()方法
3. 不停的调用__next__()的返回值,将其交给x,直到该方法抛出StopIteration异常
"""
for x in Meta():
print(x)
6. 百度翻译
import requests
import json
class BaiduFanyi(object):
def __init__(self, query_string):
self.query_string = query_string
self.headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
}
self.fanyi_url = "https://fanyi.baidu.com/basetrans"
self.lan_url = "https://fanyi.baidu.com/langdetect"
self.lan_from = "zh"
self.lan_to = "en"
def run(self):
# 1.准备语言检测接口需要的数据
lan_data = self.get_lan_data()
# 2. 发起语言检测请求,返回响应
lan_json_str = self.parse_post_url(self.lan_url, lan_data)
# 3. 解析语言检测结果
self.get_lan_ret(lan_json_str)
# 2. 准备数据
data = self.get_data()
# 3. 发起请求,获得响应
json_str = self.parse_post_url(self.fanyi_url, data)
# 4. 解析json,提取数据
ret = self.get_fanyi_ret(json_str)
print(ret)
def get_data(self):
"""
组装翻译接口的数据
:return:
"""
return {
"query": self.query_string,
"from": self.lan_from,
"to": self.lan_to
}
def parse_post_url(self, url, data):
"""
发起post请求,返回响应
:param url:
:param data:
:return:
"""
resp = requests.post(url=url, data=data, headers=self.headers)
return resp.content.decode()
def get_fanyi_ret(self, json_str):
"""
返回翻译的结果
:param json_str:
:return:
"""
ret_dict = json.loads(json_str)
return ret_dict['trans'][0]['dst']
def get_lan_data(self):
"""
组装语言检测的数据
:return:
"""
return {
"query": self.query_string
}
def get_lan_ret(self, lan_json_str):
"""
解析语言检测的结果,并修改翻译需要的from和to的值
:param lan_json_str:
:return:
"""
ret_dict = json.loads(lan_json_str)
lan = ret_dict['lan']
if lan == "en":
self.lan_from = "en"
self.lan_to = "zh"
if __name__ == '__main__':
query_str = input(":")
fanyi = BaiduFanyi(query_str)
fanyi.run()
7. 代理ip
单个ip频繁请求一个网站的时候,很容易被识别是一个爬虫,为了应对网站的反爬措施,可以使用代理
# 代理字典,key是代理的协议
proxies = {
"https": "https://119.127.17.80:6395"
}
url = "https://www.youtube.com/"
resp = requests.get(url=url, proxies=proxies)
代理ip的分类
- 透明代理:对方知道在使用代理,并且知道爬虫的真实ip
- 匿名代理:对方知道在使用代理,但不清楚爬虫的真实的ip
- 高匿代理:对方不知道在使用代理,更不清楚爬虫的真实的ip
8. requests处理cookies之Session
创建一个session类的实例对象,和requests库一样,可以直接使用get和post方法
第一次使用session.post()的时候,网站会通过响应头set-cookies读取需要保存的cookies信息,并保存在session对象的cookies属性中,下一次再发送请求的时候,会自动将保存的cookie写入请求头中,就可以访问登陆后的页面数据了。
import requests
session = requests.Session()
data = {
"email": "xxx",
"password": "xxxx"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0"
}
resp = session.post("http://www.renren.com/PLogin.do", data=data, headers=headers)
resp = session.get("http://www.renren.com/966796789/profile", headers=headers)
print(resp.content.decode())