python爬虫反反爬机制:动态User-Agent+动态ip


参考文章: python3之爬虫代理IP的使用+建立代理IP池

动态User-Agent

User-Agent是浏览器的头部信息,不设置时会被识别出Python。因此一般将自己的浏览器User-Agent传入。
这里可以使用fake_useragent包传入随机动态user-agent:

from fake_useragent import UserAgent
headers = {'User-Agent': UserAgent().random}

动态ip

ip是计算机在网络中的地址,如果同一个ip同时访问该网站,即使换了user-agent依然会被识破。因此还需要动态更换ip。

获取可用ip池

网络上有很多免费的ip地址,但是对我们的目标网站不一定能用,因此需要先进行测试。这里直接贴代码(来源:置顶连接)
代码可以直接用,需要改的只是test_url换成你要爬取的目标网站,因为同一个ip对不同目标网站也不一定能访问。
url是我们免费爬取ip地址的网站,这里也可以换成其他免费网站。

# 建立属于自己的开放代理IP池
import requests
import random
import time
from lxml import etree
from fake_useragent import UserAgent


class IpPool:
    def __init__(self):
        # 测试ip是否可用url
        self.test_url = 'https://guba.eastmoney.com/remenba.aspx'
        # 获取IP的 目标url
        self.url = 'https://www.89ip.cn/index_{}.html'

        self.headers = {'User-Agent': UserAgent().random}
        # 存储可用ip
        self.file = open('ip_pool.txt', 'wb')

    def get_html(self, url):
        '''获取页面'''
        html = requests.get(url=url, headers=self.headers).text

        return html

    def get_proxy(self, url):
        '''数据处理  获取ip 和端口'''
        html = self.get_html(url=url)
        # print(html)

        elemt = etree.HTML(html)

        ips_list = elemt.xpath('//table/tbody/tr/td[1]/text()')
        ports_list = elemt.xpath('//table/tbody/tr/td[2]/text()')

        for ip, port in zip(ips_list, ports_list):
            # 拼接ip与port
            proxy = ip.strip() + ":" + port.strip()
            # print(proxy)

            # 175.44.109.195:9999
            self.test_proxy(proxy)

    def test_proxy(self, proxy):
        '''测试代理IP是否可用'''
        proxies = {
            'http': 'http://{}'.format(proxy),
            'https': 'https://{}'.format(proxy),
        }
        # 参数类型
        # proxies
        # proxies = {'协议': '协议://IP:端口号'}
        # timeout 超时设置 网页响应时间3秒 超过时间会抛出异常
        try:
            resp = requests.get(url=self.test_url, proxies=proxies, headers=self.headers, timeout=3)
            # 获取 状态码为200
            if resp.status_code == 200:
                print(proxy, '\033[31m可用\033[0m')
                # 可以的IP 写入文本以便后续使用
                self.file.write(proxy)

        except Exception as e:
            pass

    def crawl(self):
        '''执行函数'''
        # 快代理每页url 的区别
        # https://www.kuaidaili.com/free/inha/1/
        # https://www.kuaidaili.com/free/inha/2/
        # .......
        # 提供的免费ip太多
        # 这里只获取前100页提供的免费代理IP测试
        for i in range(1, 101):
            # 拼接完整的url
            page_url = self.url.format(i)
            # 注意抓取控制频率
            time.sleep(random.randint(1, 4))
            self.get_proxy(url=page_url)

        # 执行完毕关闭文本
        self.file.close()


if __name__ == '__main__':
    ip = IpPool()
    ip.crawl()

随机取ip

ip_list=[]
with open('ip_pool.txt','r')as f:
    for line in f.readlines():
        proxy = {
            'http': 'http://{}'.format(line.strip()),
            'https': 'https://{}'.format(line.strip()),
        }
        ip_list.append(proxy)
ip = random.choice(ip_list)

主程序代码

headers = {'User-Agent': UserAgent().random}
ip = random.choice(ip_list)
r = requests.get(url, headers=headers,proxies=ip,timeout=3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值