Python爬虫之代理IP与访问控制

news/2024/7/19 10:48:56 标签: 网络, python, tcp/ip, 爬虫

目录

前言

一、代理IP

1.1.使用代理IP的步骤

1.2.寻找可用的代理IP

1.3.设置代理IP

1.4.验证代理IP的可用性

二、访问控制

2.1.遵守Robots协议

2.2.设置访问时间间隔

2.3.多线程爬取

总结


前言

在进行Python爬虫过程中,代理IP与访问控制是我们经常需要处理的问题。本文将介绍代理IP与访问控制相关的知识,并提供相应的代码案例。

一、代理IP

在进行爬虫时,我们通常会遇到一些反爬虫的网站。为了应对这种情况,我们可以使用代理IP。代理IP的作用是通过一个中间服务器来访问目标网站,隐藏我们真实的IP地址,从而达到反爬虫的目的。

1.1.使用代理IP的步骤

使用代理IP主要包含以下步骤:

  1. 寻找可用的代理IP
  2. 设置代理IP
  3. 进行爬取操作

接下来我们将分别介绍这些步骤。

1.2.寻找可用的代理IP

寻找代理IP可以通过以下方式:

  1. 网上搜索:通过搜索引擎可以找到很多代理IP网站,但是这些网站提供的代理IP质量参差不齐,需要我们进行筛选。
  2. 付费购买:付费购买的代理IP较为稳定,但是价格相对较高。
  3. 自建代理:可以通过购买服务器自建代理IP,这种方式相对稳定,但需要一定的技术水平。

1.3.设置代理IP

在Python中,使用代理IP可以通过urllib库中的ProxyHandler类实现。下面是设置代理IP的示例代码:

python">import urllib.request

# 设置代理IP
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8888'})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)

# 访问网站
response = urllib.request.urlopen('http://www.baidu.com')
html = response.read().decode('utf-8')
print(html)

在以上代码中,我们通过ProxyHandler类设置了代理IP,然后通过build_opener方法创建一个Opener对象,最后使用install_opener方法将该Opener对象安装为全局Opener。这样,在进行后续的网页访问时,就会自动使用代理IP了。

1.4.验证代理IP的可用性

为了提高效率,我们可以使用多个代理IP轮流使用。但是在使用之前,我们需要验证代理IP的可用性。以下是验证代理IP可用性的示例代码:

python">import urllib.request

# 设置代理IP
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8888'})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)

# 验证代理IP可用性
try:
    response = urllib.request.urlopen('http://www.baidu.com', timeout=3)
    if response.getcode() == 200:
        print('IP可用')
except Exception as e:
    print('IP不可用')

在以上代码中,我们通过urlopen方法访问了百度网站,并设置了超时时间为3秒。如果连接成功,即返回了200状态码,则说明该代理IP可用。

二、访问控制

访问控制是指在进行爬虫时,需要遵循一定的爬取规则,如遵守网站的Robots协议、设置爬虫访问时间间隔等。以下我们将分别介绍这些规则。

2.1.遵守Robots协议

Robots协议是一种网站使用的协议,它告诉爬虫哪些页面可以访问、哪些页面不可以访问,以及访问间隔等信息。Robots协议通常存在于网站的根目录下的robots.txt文件中。

以下是一个Robots协议的示例:

python">User-agent: *
Disallow: /admin
Disallow: /tmp
Crawl-delay: 10

在以上协议中,User-agent表示爬虫的名称,*表示所有爬虫都要遵守该协议。Disallow表示不允许访问的路径,如上例中的/admin和/tmp。Crawl-delay表示访问间隔,如上例中的10秒。如果爬虫访问网站时违反了Robots协议,可能会被封禁IP或者限制爬取速度。

2.2.设置访问时间间隔

为了防止爬虫过于频繁的访问网站,我们需要设置访问时间间隔。下面是一个设置时间间隔的示例代码:

python">import time
import urllib.request

url = 'http://www.baidu.com'
interval = 5  # 时间间隔为5秒

while True:
    # 访问网站
    try:
        response = urllib.request.urlopen(url, timeout=3)
        if response.getcode() == 200:
            html = response.read().decode('utf-8')
            print(html)
    except Exception as e:
        print(e)

    # 等待时间间隔
    time.sleep(interval)

在以上代码中,我们设置了5秒的时间间隔。每次访问网站后,程序会等待5秒再进行下一次访问。

2.3.多线程爬取

为了提高爬取效率,我们可以使用多线程进行爬取。以下是使用多线程爬取的示例代码:

python">import threading
import urllib.request

url = 'http://www.baidu.com'

# 定义线程类
class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        while True:
            # 访问网站
            try:
                response = urllib.request.urlopen(url, timeout=3)
                if response.getcode() == 200:
                    html = response.read().decode('utf-8')
                    print(html)
            except Exception as e:
                print(e)

# 创建线程对象并启动线程
for i in range(3):  # 启动3个线程
    t = MyThread()
    t.start()

在以上代码中,我们创建了一个线程类MyThread,该类继承自threading.Thread。在该类的run方法中,我们使用无限循环来访问网站。然后我们创建了3个线程对象,并启动了这些线程。

总结

本文介绍了Python爬虫中代理IP与访问控制的知识,并提供了相应的代码案例。在进行爬虫时,需要遵守网站的Robots协议、设置访问时间间隔等,以避免被网站封禁IP或限制爬取速度。同时,使用代理IP也是爬虫过程中常用的手段,可以帮助我们顺利的爬取目标网站。


http://www.niftyadmin.cn/n/5219807.html

相关文章

00TDI 这件红色大衣也太适合过年穿了

分享女儿的时尚穿搭—红色大衣 这款大衣非常厚实 摸起来很软糯的触感 复合了660-700g绵羊绒 厚实度堪比一件厚实的羽绒服 门禁处做了立体的爱心装饰 精致又可爱!!!

Python3 面向对象

面向对象技术简介 类(Class):用来描述具有相同属性的方法和对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数类变量:类变量在整个实例化的对象中是公用的。类变量定义在…

What are linking words?

Linking words meaning:Firstly Q:Is it a good idea to always eat healthy food? A1:Yes it is, firstly, it helps us feel better, but it can also help us live longer. A2:Yes I’d say so. To kick off, a healthy diet…

Django整合回顾

web应用 什么是web:通过web访问web应用程序,很方便,用户只需要一个浏览器即可。是典型的浏览器/服务器端架构的产物 cs架构与bs架构 应用程序有C/S B/S两种模式:b/s 本质上还是c/s mysql属于c/s架构,只是我们的服务…

一、Oceanbase基础

一、集群相关概念 集群:整个分布式数据库。Region:表示区域,是地域的逻辑概念,如1个城市,1个集群可以有多个Region,用于跨城市远 距离容灾。Zone:表示分区,是机房或机架的逻辑概念…

初学Flink 学后总结

最近开始学习Flink,一边学习一边记录,以下是基于【尚硅谷】Flink1.13实战教程总结的笔记,方便后面温习 目录 初始 Flink 一:基础概念 1.Flink是什么 2.Flink主要应用场景

面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?

1.什么是进程? 进程是操作系统中一个程序在执行过程中的一个实例,每个进程都有自己独立的地址空间,进程间不共享内存。它是程序运行的最小内存单元; 进程特点: 1> 需要占用独立的内存空间; 2>可以并…

Sass 安装

文章目录 前言SASS的系统要求安装Ruby例子后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Sass和Less 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&…