Python爬虫教程 - 100天从新手到大师(05Day)


1. SSL安全认证

在这里插入图片描述
原因:SSL的证书不安全导致 浏览器需要安装证书

"""
爬虫程序:SSLError

request.get(url,header=header,verify=False)   避开难

http协议
https协议  >> http + ssl  加密
"""

2. 代理IP

需求:短时间内多次访问同一个服务器 1s/100次
之前我们学过:
用户代理池:每一次请求都是一个不同的User-Agent,成功地骗过服务器
账户池:每一次请求都是一个不同的Cookie,成功地骗过服务器

2.1 为什么要使用代理

1.让服务器以为不是同一个客户端在请求
2.防止我们的真实地址被泄露,防止被追究

2.2 代理IP分类:

1.透明代理:毫无作用,服务器可以简单的检测到你使用了代理IP,并且知道你的真实IP
2.匿名代理:服务器可以简单的检测到你使用了代理IP,但是它检测不到你的真实IP
3.高匿代理:服务器既检测不到你使用了代理IP,也无法知道你的真实IP

建议付费代理IP 免费的就是不行

2.3 代理IP的使用

使用的是真实IP

import requests

if __name__ == '__main__':
    url_ = 'https://www.baidu.com/'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    response_ = requests.get(url_, headers=headers_)

    print(response_.text)

使用代理IP

import requests

if __name__ == '__main__':
    url_ = 'https://www.baidu.com/'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 构造代理IP字典
    # proxies代理IP字典中的键名(协议头) --> 需要跟请求的url协议头类型保持一致
    # proxies代理IP字典中的键值--> 协议头类型://IP地址:端口号   (必须是英文输入法状态下的冒号)
    proxies_ = {
        'http': 'http://1.1.1.1:8888'
    }

    # # 使用上代理IP,假的代理IP,无法使用的代理IP
    response_ = requests.get(url_, headers=headers_, proxies=proxies_)

    print(response_.text)

花钱购买的代理IP,也并不是百分之百全部能用的 1000个代理IP,800能用,200不能够使用

requests库的升级
requests库升级前:无法使用的代理IP,会直接报错
requests库升级后:如果代理IP无法使用,它就会使用你的真实IP

坏处是:无法过滤掉无法使用的代理IP
1000个 >> 800

如何处理:
特殊的url:http://myip.ipip.net/

import requests

if __name__ == '__main__':
    # 特殊测IP的url
    url_ = 'http://myip.ipip.net/'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 使用上代理IP,一个真实有效付费代理
    proxies_ = {
        'http': 'http://20.210.113.32:80'
    }

    response_ = requests.get(url_, headers=headers_, proxies=proxies_)

    str_data = response_.text
    print(str_data)

使用假的代理IP

import requests

if __name__ == '__main__':
    # 特殊测IP的url
    url_ = 'http://myip.ipip.net/'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 使用上代理IP,假的代理IP
    proxies_ = {
        'http': 'http://1.1.1.1:8888'
    }

    response_ = requests.get(url_, headers=headers_, proxies=proxies_)

    str_data = response_.text
    print(str_data)

一个代理IP池
1000个代理IP 使用循环 每一个代理IP 如果报错,就把它从代理IP池中移除

import requests
import random

if __name__ == '__main__':
    # 付费代理IP池
    ip_list = ['15.204.161.192:18080', '20.210.113.32:80', '20.111.54.16:8123', '20.24.43.214:80', '20.24.43.214:8123',
               '20.111.54.16:80']
    ip = random.choice(ip_list)
    print(ip)

    # 特殊测IP的url
    # url_ = 'http://myip.ipip.net/'
    # 访问目标网站
    url_ = 'https://www.jd.com'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 使用上代理IP,一个真实有效付费代理
    proxies_ = {
        'http': f'http://{ip}'
    }

    response_ = requests.get(url_, headers=headers_, proxies=proxies_)

    str_data = response_.text
    print(str_data)

3. timeout参数的使用

遇到网络波动怎么办?
解决办法:使用超时参数timeout

规定你的响应时间
每一个代理IP的响应时间不一样
1.剔除掉不能够使用的代理IP
2.有些响应时间过长,timeout用来剔除掉响应时间过长的代理IP

import requests


if __name__ == '__main__':
    # 特殊测IP的url
    url_ = 'http://myip.ipip.net/'

    headers_ = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }

    # 使用上代理IP,假的代理IP
    proxies_ = {
                'http':'http://1.1.1.1:8888'
            }


    response_ = requests.get(url_,headers=headers_,proxies=proxies_,timeout=3)  # 设置响应时间,秒为单位

    str_data = response_.text
    print(str_data)
import requests
import random

if __name__ == '__main__':
    # 付费代理IP池
    ip_list = ['15.204.161.192:18080', '20.210.113.32:80', '20.111.54.16:8123', '20.24.43.214:80', '20.24.43.214:8123',
               '20.111.54.16:80', '000']
    while True:
        try:
            ip = random.choice(ip_list)
            print(ip)

            # 特殊测IP的url
            # url_ = 'http://myip.ipip.net/'
            # 访问目标网站
            url_ = 'https://www.jd.com'

            headers_ = {
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
            }

            # 使用上代理IP,一个真实有效付费代理
            proxies_ = {
                'http': f'http://{ip}'
            }

            response_ = requests.get(url_, headers=headers_, proxies=proxies_, timeout=3)

            str_data = response_.text
            print(f'代理{ip}使用成功~~~~~~~')
            print(str_data)
            break
        except:
            print(f'代理{ip}异常,重新使用新的代理!!!!')

4. retrying模块

为什么:
使用超时参数能够加快我们整体的请求速度,但是在正常的网页浏览过成功,如果发生速度很慢的情况,我们会做的选择是刷新页面,那么在代码中,我们是否也可以刷新请求呢?

怎么做:
使用retrying模块提供的retry模块
通过装饰器的方式使用,让被装饰的函数反复执行

"""
如果由瞬间的网络波动,导致请求不成功 0.01s  

在这种情况下,多给几次机会发送请求,避免开由于瞬间的网络波动导致的请求不成功
"""

"""
第三方模块 pip install retrying -i https://pypi.doubanio.com/simple
"""

# from retrying import retry

# retry是一个三层函数的嵌套,并且返回了内部函数的引用   闭包
# 三层 >> 有参数的装饰器
import requests
from retrying import retry


class AAAA:
    def __init__(self):
        self.url_ = 'xxxx.com'
        self.num_ = 0

    @retry(stop_max_attempt_number=3)
    def send_request(self):
        self.num_ += 1
        print(self.num_)
        requests.get(self.url_)

    def run(self):
        try:
            self.send_request()
        except Exception as e:
            print(e)


if __name__ == '__main__':
    a = AAAA()
    a.run()

模拟瞬间的网络波动,只会进行一次请求 根据打印结果 1 2 3 就证明发送请求的那部分代码执行了三遍 retry的一个效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值