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())