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


    目录

    前言

    一、什么是代理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:

    1. import requests
    2. proxies = {
    3.     'http': 'http://ip:port',
    4.     'https': 'https://ip:port'
    5. }
    6. response = requests.get(url, proxies=proxies)

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

    3.验证代理IP

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

    1. import requests
    2. proxies = {
    3.     'http': 'http://ip:port',
    4.     'https': 'https://ip:port'
    5. }
    6. try:
    7.     response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
    8.     if response.status_code == 200:
    9.         print('代理IP可用')
    10.     else:
    11.         print('代理IP不可用')
    12. except:
    13.     print('代理IP请求失败')
    4.设置代理池

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

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

    1. proxy_pool = [
    2.     'http://ip1:port1',
    3.     'http://ip2:port2',
    4.     'http://ip3:port3',
    5.     ...
    6. ]
    7. proxy = random.choice(proxy_pool)
    8. proxies = {
    9.     'http': proxy,
    10.     'https': proxy
    11. }

    其中,`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,这里使用的是免费代理网站,代码如下:

    1. import requests
    2. from bs4 import BeautifulSoup
    3. import random
    4. def get_proxy():
    5.     url = 'https://www.zdaye.com/'
    6.     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'}
    7.     response = requests.get(url, headers=headers)
    8.     soup = BeautifulSoup(response.text, 'html.parser')
    9.     trs = soup.find_all('tr')
    10.     proxy_list = []
    11.     for tr in trs[1:]:
    12.         tds = tr.find_all('td')
    13.         ip = tds[1].text
    14.         port = tds[2].text
    15.         proxy = 'http://{}:{}'.format(ip, port)
    16.         proxy_list.append(proxy)
    17.     return proxy_list

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

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

    proxy_pool = get_proxy()

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

    1. proxy = random.choice(proxy_pool)
    2. proxies = {
    3.     'http': proxy,
    4.     'https': proxy
    5. }

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

    1. import requests
    2. from bs4 import BeautifulSoup
    3. import random
    4. def get_proxy():
    5.     url = 'https://www.zdaye.com/'
    6.     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'}
    7.     response = requests.get(url, headers=headers)
    8.     soup = BeautifulSoup(response.text, 'html.parser')
    9.     trs = soup.find_all('tr')
    10.     proxy_list = []
    11.     for tr in trs[1:]:
    12.         tds = tr.find_all('td')
    13.         ip = tds[1].text
    14.         port = tds[2].text
    15.         proxy = 'http://{}:{}'.format(ip, port)
    16.         proxy_list.append(proxy)
    17.     return proxy_list
    18. def get_movie_info(url, proxies):
    19.     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'}
    20.     response = requests.get(url, headers=headers, proxies=proxies)
    21.     soup = BeautifulSoup(response.text, 'html.parser')
    22.     items = soup.find_all('div', class_='info')
    23.     movie_list = []
    24.     for item in items:
    25.         name = item.find('span', class_='title').text
    26.         href = item.find('a')['href']
    27.         rating = item.find('span', class_='rating_num').text
    28.         movie_info = {
    29.             'name': name,
    30.             'href': href,
    31.             'rating': rating
    32.         }
    33.         movie_list.append(movie_info)
    34.     return movie_list
    35. if __name__ == '__main__':
    36.     proxy_pool = get_proxy()
    37.     movie_list = []
    38.     for i in range(10):
    39.         url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)
    40.         proxy = random.choice(proxy_pool)
    41.         proxies = {
    42.             'http': proxy,
    43.             'https': proxy
    44.         }
    45.         movie_list += get_movie_info(url, proxies)
    46.     print(movie_list)

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

    四、总结

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

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

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

  • 相关阅读:
    AI 能多强「GitHub 热点速览」
    学生花卉网网页设计作品 学生鲜花网页模板 简单在线花店主页成品 鲜花网页制作 HTML学生花店商城网站作业设计
    双十一期间如何做好电商数据监测
    MySQL 查询结果与分页 2022/09/08
    Nginx访问控制与虚拟主机
    docker搭建nginx+php-fpm
    许可分析 license分析 第十七章
    【力扣刷题】无重复字符的最长子串
    使用go语言开发hive导出工具
    【回归预测-lssvm】基于粒子群算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/133167181