网站有反爬机制就爬不了数据?那是你不会【反】反爬

2023-09-22 13:33:19

目录

前言

一、什么是代理IP

二、使用代理IP反反爬

1.获取代理IP

2.设置代理IP

3.验证代理IP

4.设置代理池

5.定时更新代理IP

三、反反爬案例

1.分析目标网站

2.爬取目标网站

四、总结


前言

爬虫技术的不断发展,使得许多网站都采取了反爬机制,以保护自己的数据和用户隐私。常见的反爬手段包括设置验证码、IP封锁、限制访问频率等等。

但是,这些反爬机制并不能完全阻止爬虫的进攻,因为只要有技术,就一定有方法来破解。本文将介绍如何使用代理IP来反反爬,以及相关的Python代码和案例。 

一、什么是代理IP

代理IP(Proxy IP)是指在访问网络时,使用的是代理服务器的IP地址,而不是自己的IP地址。代理服务器相当于一座桥梁,将我们请求的数据先代理一下,再转发到目标网站,从而达到隐藏我们真实IP地址的效果。

代理IP具有隐藏身份、突破访问限制、提高访问速度、保护个人隐私等作用。在反爬方面,使用代理IP可以很好地避免被封锁IP,从而爬取目标网站的数据。

二、使用代理IP反反爬

1.获取代理IP

获取代理IP最常见的方式是通过爬取免费代理网站或者购买收费代理服务。免费代理网站的免费IP质量参差不齐,且容易被封锁,而收费代理服务的IP质量相对较高,可靠性更高。

在获取代理IP时,需要注意以下几点:

  1. 获取的代理IP必须是可用的,否则无法正常访问目标网站;
  2. 获取的代理IP需要定时更新,避免被封锁或失效;
  3. 不要过于频繁地使用同一个代理IP,否则容易被目标网站识别出来。
2.设置代理IP

在使用代理IP时,需要将其设置到请求头中。以requests库为例,可以通过以下代码设置代理IP:

import requests

proxies = {
    'http': 'http://ip:port',
    'https': 'https://ip:port'
}

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

其中,`ip`和`port`是代理IP的地址和端口号,根据实际情况进行设置。

3.验证代理IP

在进行爬取之前,需要先验证代理IP是否可用。一般来说,验证代理IP的可用性可以通过访问http://httpbin.org/ip网站来进行验证。以requests库为例,可以通过以下代码验证代理IP是否可用:

import requests

proxies = {
    'http': 'http://ip:port',
    'https': 'https://ip:port'
}

try:
    response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
    if response.status_code == 200:
        print('代理IP可用')
    else:
        print('代理IP不可用')
except:
    print('代理IP请求失败')
4.设置代理池

单个代理IP的可用时间有限,而且代理IP的质量也参差不齐,因此需要设置一个代理池,从中随机选择一个可用的代理IP进行访问。

代理池的实现可以通过列表、队列或数据库等方式进行。以列表为例,可以通过以下代码实现代理池的设置:

proxy_pool = [
    'http://ip1:port1',
    'http://ip2:port2',
    'http://ip3:port3',
    ...
]

proxy = random.choice(proxy_pool)

proxies = {
    'http': proxy,
    'https': proxy
}

其中,`random.choice(proxy_pool)`表示从代理池中随机选择一个代理IP进行访问。

5.定时更新代理IP

为了避免代理IP被封锁或失效,需要定时更新代理IP。更新代理IP的方法有很多种,可以通过爬取免费代理网站、购买收费代理服务或者自己搭建代理服务器等方式进行。在更新代理IP时,需要注意以下几点:

  1. 更新的代理IP必须是可用的;
  2. 更新的代理IP需要添加到代理池中,并在下一次请求中随机选择使用。

三、反反爬案例

下面以爬取豆瓣电影TOP250为例,介绍如何使用代理IP来反反爬。

1.分析目标网站

豆瓣电影TOP250的网址为:https://movie.douban.com/top250。我们需要获取其中的电影名称、电影链接、电影评分等信息。

打开浏览器的开发者工具,可以发现目标网站的数据请求链接为:https://movie.douban.com/top250?start=0&filter=,其中的`start`表示起始位置,每页有25条数据,共10页数据。我们需要遍历这10页数据,获取其中的电影信息。

2.爬取目标网站

首先,需要获取代理IP,这里使用的是免费代理网站,代码如下:

import requests
from bs4 import BeautifulSoup
import random

def get_proxy():
    url = 'https://www.zdaye.com/'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    trs = soup.find_all('tr')
    proxy_list = []
    for tr in trs[1:]:
        tds = tr.find_all('td')
        ip = tds[1].text
        port = tds[2].text
        proxy = 'http://{}:{}'.format(ip, port)
        proxy_list.append(proxy)
    return proxy_list

其中,`get_proxy()`函数用于获取代理IP,返回的是代理IP列表。

接下来,需要设置代理池,代码如下:

proxy_pool = get_proxy()

随机选择一个代理IP进行访问,代码如下:

proxy = random.choice(proxy_pool)

proxies = {
    'http': proxy,
    'https': proxy
}

然后,开始爬取目标网站,代码如下:

import requests
from bs4 import BeautifulSoup
import random

def get_proxy():
    url = 'https://www.zdaye.com/'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    trs = soup.find_all('tr')
    proxy_list = []
    for tr in trs[1:]:
        tds = tr.find_all('td')
        ip = tds[1].text
        port = tds[2].text
        proxy = 'http://{}:{}'.format(ip, port)
        proxy_list.append(proxy)
    return proxy_list

def get_movie_info(url, proxies):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    response = requests.get(url, headers=headers, proxies=proxies)
    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.find_all('div', class_='info')
    movie_list = []
    for item in items:
        name = item.find('span', class_='title').text
        href = item.find('a')['href']
        rating = item.find('span', class_='rating_num').text
        movie_info = {
            'name': name,
            'href': href,

            'rating': rating
        }
        movie_list.append(movie_info)
    return movie_list

if __name__ == '__main__':
    proxy_pool = get_proxy()
    movie_list = []
    for i in range(10):
        url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)
        proxy = random.choice(proxy_pool)
        proxies = {
            'http': proxy,
            'https': proxy
        }
        movie_list += get_movie_info(url, proxies)
    print(movie_list)

在运行代码时,可能会出现代理IP不可用的情况,可以通过多次尝试或者定时更新代理IP来解决。

四、总结

本文介绍了如何使用代理IP来反反爬,并给出了相关的Python代码和案例。在实际爬取数据时,还需要注意以下几点:

  1. 避免频繁请求目标网站,尽量减少对目标网站的负担;
  2. 模拟真实请求,设置合理的User-Agent、Referer等请求头参数;
  3. 处理反爬机制,如验证码、JS渲染、动态IP等。

总之,反爬机制是爬虫开发中不可避免的挑战,需要不断学习技术、探索方法、思考策略,才能够更好地应对挑战并获取所需数据。

更多推荐

机器学习——奇异值分解(未完)

开坑,刚看完书,已经有些窒息了先把坑挖了,再慢慢填,避免自己划水跳过我爱线代,线代爱我,阿弥陀佛为什么要学奇异值分解?因为书本倒数第二章专门提到的,想必一定很重要,于是我上网查了一下奇异值分解的应用wow。。。很有用,增加了学习的动力奇异值分解的应用在机器学习中,奇异值分解,可以删除一些没什么作用的特征。具体是如何删除

JVM——6.字节码指令

这篇文章我们来学习一下字节码指令目录1.简介2.字节码与数据类型3.加载与存储指令4.运算指令5.类型转换指令6.对象创建于访问指令7.操作数栈管理指令8.控制转移指令9.方法调用与返回指令10.异常处理指令11.同步指令12.小结1.简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码)

在微信公众号怎么做电子优惠券功能

在微信公众号上,商家可以提供电子优惠券功能来吸引更多的消费者关注并参与,同时提高产品的知名度和销售额。下面是一篇关于如何在微信公众号上实现电子优惠券功能的文章,供您参考。一、了解电子优惠券的定义和优势电子优惠券是一种以电子形式发放的优惠凭证,商家通过微信公众号向消费者发放电子优惠券,消费者在购买指定商品或服务时使用,可

一遍关于vue基础语法上篇

目录一.插值1.1.文本1.2.html1.2.3.属性1.1.4.表达式演示效果:二.指令2.1.v-if/v-else-if/v-else2.2.v-show2.3.v-for2.4.v-bindv-onv-model2.5.动态参数演示效果:三.过滤器3.1.局部过滤器基本应用3.2.局部过滤器串行使用3.3.局

千呼万唤openGauss资源池化系列培训来了

应openGauss广大用户要求,社区于近期推出openGauss资源池化培训系列。关于资源池化资源池化是openGauss5.0.0推出的重点特性,是openGauss基于内存池化和共享存储实现的数据库集群。数据在集群的计算节点内存、共享存储中实现共享。应用可以任意节点接入,集群可以保证提供实时一致性的数据。集群也保

Linux设备驱动之IIC驱动

Linux设备驱动之I2C驱动I2C是一种半双工串行通信总线,使用多主从架构,总线上会挂载设备,设备通信就会涉及协议,下面一起看看I2C通信协议是怎样的,在Linux系统上软件又是如何驱动的。I2C通信协议硬件连接I2C串行总线一般有两根信号线,一根是双向数据线SDA,另一根是时钟线SCL,数据线即用来表示数据,时钟线

华为以太网接口配置命令

【微|信|公|众|号:厦门微思网络】今天给大家带来的命令列表如下:amisolateautoduplexautospeedclock(以太接口视图)combo-portdisplayerror-downrecoverydisplayinterfaceethernetbriefdisplayport-groupdispl

网络工程师的爬虫技术之路:跨界电商与游戏领域的探索

随着数字化时代的到来,跨界电商和游戏行业成为了网络工程师们充满机遇的领域。这两个领域都依赖于高度复杂的技术来实现商业目标和提供卓越的用户体验。本文将深入探讨网络工程师在跨界电商和游戏领域的技术挑战以及应对这些挑战的方法。突破技术障碍的爬虫应用跨界电商业务通常需要大量的市场数据和竞争情报,而这些信息可能分散在全球各个网站

batch norm 中 track_running_stats 的探索

ifself.track_running_stats:self.register_buffer('running_mean',torch.zeros(num_features,**factory_kwargs))self.register_buffer('running_var',torch.ones(num_feat

Linux(CentOS)安装msf

目录一、安装MSF1.1在线安装1.2离线安装二、安装Postgresql数据库一、安装MSF1.1在线安装需要挂梯子!挂完梯子需要reboot重启,多试几次就可以,国内网络我试了很久都不行。没条件没梯子的看1.2离线安装cd/optcurlhttps://raw.githubusercontent.com/rapid

【Docker】了解和使用Docker

文章底部有投票活动,赶快参与进来吧😃相信大家在开发过程中都听说过Docker一词,至于Docker在开发中扮演的角色,估计好多人都说不上来,今天就让阿Q带大家一起揭开它神秘的面纱!文章目录什么是容器?容器的优点什么是Docker?Docker思想为什么要用Docker?容器VS虚拟机Docker中的基本概念镜像(Im

热文推荐