爬虫二、response、cookie、代理ip使用

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

    扫描二维码关注公众号,回复: 5037599 查看本文章

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

猜你喜欢

转载自blog.csdn.net/weixin_42670402/article/details/86361330