当前位置: 首页>移动开发>正文

Python(六十四)代理、模拟登陆、重试

1. 代理

(1)透明代理
代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理ip,并且知道客户端的真实ip地址
(2)普通匿名代理
代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。
(3)高匿名代理
使用高匿名代理就可以隐藏自己的真实ip
你用别人的电脑,去访问你要的网站

03_代理、模拟登陆、重试/01_代理.py

import requests

"""
(1)透明代理
    代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理ip,并且知道客户端的真实ip地址
(2)普通匿名代理
    代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。
(3)高匿名代理
    使用高匿名代理就可以隐藏自己的真实ip
你用别人的电脑,去访问你要的网站
"""
url = "https://www.baidu.com/"

proxie = {
    "http":'117.95.214.75:4245'
}

response = requests.get(url=url,proxies=proxie)

# 解决乱码
response.encoding = response.apparent_encoding
print(response.text)

2. 模拟登陆

requests.session() 会话保持
说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象,求该网站的其他网页都会默认使用该session之前使用的cookie
等参数跨请求
请求不同的网站就是跨请求携带同样的cookie等参数
在什么时候进行使用:
1.需要爬虫保持登陆状态
2.爬虫需要携带一些特定的参数。比如购物网站的无登录状态下的推荐,主要是cookie HTTP API接口:
只需要我们进行请求调用,传递特定的数据后api会返回数据。数据格式大多为 json
注意:
先要进行session的实例化。实例化之后所有的请求都使用实例化的变量进行get/post方法调用。如: session.post()
requests.post()这种方法将不会携带之前的cookie等参数,相当于重新来过

03_代理、模拟登陆、重试/02_模拟登陆.py:

import requests
from requests.utils import dict_from_cookiejar

"""

"http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201202950"

requests.session()      会话保持
    说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象,求该网站的其他网页都会默认使用该session之前使用的cookie
等参数跨请求
    请求不同的网站就是跨请求携带同样的cookie等参数
    在什么时候进行使用:
        1.需要爬虫保持登陆状态
        2.爬虫需要携带一些特定的参数。比如购物网站的无登录状态下的推荐,主要是cookie HTTP API接口:
        只需要我们进行请求调用,传递特定的数据后api会返回数据。数据格式大多为 json
    
    注意:
        先要进行session的实例化。实例化之后所有的请求都使用实例化的变量进行get/post方法调用。如: session.post()
        requests.post()这种方法将不会携带之前的cookie等参数,相当于重新来过

"""

"""

思路:
    1.准备登录的URL  一个api接口(你传输东西给我,我返回东西给你)
    2.发送请求,获取响应
    3.验证
    
"""

# 1.准备登录的URL  一个api接口(你传输东西给我,我返回东西给你)(api接口不返回HTML页面,如果返回的是json数据,则是api接口,反之是页面)
url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20201202950"
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}

# 2.发送请求,获取响应
data = {
    'email':'182730',
    'password':'Pj7159',
}

session = requests.session()    # 会话维持

response = session.post(url=url,headers=headers,data=data)
print(response.text)
print(dict_from_cookiejar(response.cookies))      # 转成Python的字典

# 3.验证
Homeurl = "http://www.renren.com/"
resp = session.get(url=Homeurl,headers=headers)
print(resp.text)

03_代理、模拟登陆、重试/03_模拟登陆.py:

"""

https://accounts.douban.com/j/mobile/login/basic

c的主页
https://www.douban.com/......

"""
import requests
from requests.utils import dict_from_cookiejar

url = "https://accounts.douban.com/j/mobile/login/basic"
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36",
    "Referer" : "https://accounts.douban.com/passport.....",  # 参考的网页
}

# name和password为正确的账号密码
data = {
    'ck':'',
    'remember':'true',
    'name':'18030......',
    'password':'a913......',
}

session = requests.session()    # 会话维持

response = session.post(url=url,headers=headers,data=data)
print(response.text)
print(dict_from_cookiejar(response.cookies))      # 转成Python的字典

# Homeurl为登录后的个人主页路由
Homeurl = "https://www.douban.com/people......"
resp = session.get(url=Homeurl,headers=headers)
print(resp.text)

3. cookie

cookie:
保持网站的登陆状态,存储网站中某个特定的数据参数
是有有效期的,超过有效期cookie将会清除作废,所以在编写一个cookie爬虫代码的时候,并不是一次编写永久运行,每隔一个时间段就需要更新
cookie。
什么时候用这种方法?
1.当模拟登陆不好编写时(结构复杂,有加密)
2.只有cookie没有账号密码
3.网站根据cookie对用户进行推荐,专门爬取某人的个人推荐时...
在代码中利用cookie常用的两种方法:
1.将cookie写入headers中
2.使用get方法中的cookies参数进行传递注意:参数必须为字典类型
注意:
1,自定义headers中的cookie,后面没有s(非cookies)
2. get方法中的cookies参数cookies后面有s
3. cookie一定是键值对存在的

03_代理、模拟登陆、重试/04_cookie.py:

"""
    cookie:
        保持网站的登陆状态,存储网站中某个特定的数据参数
        是有有效期的,超过有效期cookie将会清除作废,所以在编写一个cookie爬虫代码的时候,并不是一次编写永久运行,每隔一个时间段就需要更新
cookie。
    什么时候用这种方法?
        1.当模拟登陆不好编写时(结构复杂,有加密)
        2.只有cookie没有账号密码
        3.网站根据cookie对用户进行推荐,专门爬取某人的个人推荐时...
    在代码中利用cookie常用的两种方法:
        1.将cookie写入headers中
        2.使用get方法中的cookies参数进行传递注意:参数必须为字典类型
    注意:
        1,自定义headers中的cookie,后面没有s(非cookies)
        2. get方法中的cookies参数cookies后面有s
        3. cookie一定是键值对存在的
"""
import requests

# # cookie为正确的登录后的个人页面首页cookie
# cookie = 'll="118181"; bid=EqD-tZ3xcK8; 
#
# # cookie 字符串转成字典
# cookie_dict = {}
# for i in cookie.split("; "):
#     cookie_dict[i.split("=")[0]] = i.split("=")[1]
# print(cookie_dict)
# # outputs:{'ll': '"118181"', 'bid': ......}

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                 'Chrome/98.0.4758.102 Safari/537.36',
    'Referer':'https://www.douban.com/',
    'Cookie':'ll="118181"; bid=EqD-tZ3xcK8;'
}

# response = requests.get(url="https://www.douban.com/people",headers=headers,cookies=cookie_dict)
response = requests.get(url="https://www.douban.com/people",headers=headers)

print(response.text)

4. 禁止重定向

03_代理、模拟登陆、重试/05_禁止重定向.py:

import requests

url = "https://h5.pipix.com/s/JFfpN5J/"

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

response = requests.get(url=url,headers=headers,allow_redirects=False)
print(response.url)
print(response.text)

# outputs:
# https://h5.pipix.com/s/JFfpN5J/
# {"message":"404 not found"}

"""
重定向之前的URL:
https://h5.pipix.com/s/JFfpN5J/
重定向之后的URL:(找不到页面了)
{"message":"404 not found"}
"""

5. 超时处理

03_代理、模拟登陆、重试/06_超时处理.py:

import requests

url = "https://google.com"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                 'Chrome/98.0.4758.102 Safari/537.36',
}

# 可能存在错误,则报的错误要指明
try:
    # response = requests.get(url=url,headers=headers,timeout=2)      # 如果5秒没有返回结果,则报错ConnectTimeout
    response = requests.get(url=url,headers=headers,timeout=(3,7))      # 请求时间,响应时间,即timeout=10(3+7)
    print(response.text)
except requests.exceptions.ConnectionError as e:
    print("超时",e)
except NameError as e:
    print("名字错误",e)

6. 重试模块

03_代理、模拟登陆、重试/07_retrying模块.py:

from retrying import retry

# @retry      # 如出现异常会一直重试,直到不报错为止
# @retry(stop_max_attempt_number=3)       # 用来设定最大的尝试次数,超过该次数就停止重试
# @retry(stop_max_delay=3000)     # 设置失败重试的最长时间,单位毫秒,超出时间,则停止重试,3秒之后报错
# @retry(wait_fixed=2000)     # 设置失败重试的间隔时间
@retry(wait_random_min=1000,wait_random_max=5000,stop_max_attempt_number=3)     # 设置失败重试的随机性间隔时间,有时快,有时慢
def demo():
    print("--------")
    raise       # RuntimeError: No active exception to reraise

demo()

03_代理、模拟登陆、重试/08_爬虫重试.py:

import requests
from retrying import retry

class Spider:
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/98.0.4758.102 Safari/537.36',
        }
        self.count = 1

    def demo(self):
        print('请求没成功')

    # 若没有请求成功,每隔4秒请求一次
    @retry
    def requestMethod(self,url):
        print(url)
        print("第",self.count,"次连接")
        self.demo()
        self.count += 1
        response = requests.get(url=url,headers=self.headers,timeout=4)
        return response

if __name__ == '__main__':
    urllist=["https://www.baidu.com","https://www.google.com"]
    run = Spider()
    for url in urllist:
        print(run.requestMethod(url).url)

文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

Editor:Lonelyroots


https://www.xamrdz.com/mobile/4ds1997074.html

相关文章: