• 【爬虫笔记】Python爬虫简单运用爬取代理IP


    一、前言

    近些年来,网络上的爬虫越来越多,很多网站都针对爬虫进行了限制,封禁了一些不规则的请求。为了实现正常的网络爬虫任务,爬虫常用代理IP来隐藏自己的真实IP,避免被服务器封禁。本文将介绍如何使用Python爬虫来获取代理IP,以及如何在爬虫中使用代理IP。

    二、获取代理IP

    获取代理IP有两种方式:免费代理IP网站和收费代理IP服务。免费代理IP网站通常提供一些免费的代理IP,但是这些代理IP质量很不稳定,很容易被封禁或失效;收费代理IP服务则提供稳定、可靠的代理IP,但需要付费购买。由于本文主要介绍如何使用Python爬虫,因此我们将使用免费代理IP网站进行代理IP的获取。

    具体来说,我们可以使用爬虫抓取一些免费代理IP网站上的代理IP列表。这里以站大爷免费代理IP为例,具体步骤如下:

    1. 打开站大爷代理网站(https://www.zdaye.com/),选择代理IP类型和位置,点击搜索按钮。
    2. 打开开发者工具(F12),进入网络选项卡,点击清空按钮,再点击“获取更多内容”按钮,观察是否有新的请求被发送。
    3. 发现一个名为“nn”的请求,请求的URL为https://www.zdaye.com/nn/1,其中“nn”表示高匿代理IP,而数字“1”表示页码。我们可以通过修改页码来获取不同页的代理IP。
    4. 在请求头中添加“User-Agent”字段,模拟浏览器请求,避免被服务器拒绝。
    5. 抓取响应中的HTML代码,使用正则表达式或BeautifulSoup库从中提取代理IP及其端口号。

    下面是具体的Python代码实现:

    1. import requests
    2. from bs4 import BeautifulSoup
    3. import re
    4. # 抓取代理IP列表
    5. def fetch_proxy_ips():
    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.36'}
    7.     url_template = 'http://www.zdaye.com/nn/{}'
    8.     proxy_ips = []
    9.     for page in range(1, 11):
    10.         url = url_template.format(page)
    11.         resp = requests.get(url, headers=headers)
    12.         soup = BeautifulSoup(resp.text, 'html.parser')
    13.         trs = soup.find_all('tr')
    14.         for tr in trs[1:]:
    15.             tds = tr.find_all('td')
    16.             proxy_ip = tds[1].text + ':' + tds[2].text
    17.             proxy_ips.append(proxy_ip)
    18.     return proxy_ips
    19. # 测试代理IP是否可用
    20. def test_proxy_ip(proxy_ip):
    21.     url = 'http://httpbin.org/ip'
    22.     proxies = {
    23.         'http': 'http://' + proxy_ip,
    24.         'https': 'https://' + proxy_ip
    25.     }
    26.     try:
    27.         resp = requests.get(url, proxies=proxies, timeout=5)
    28.         resp.raise_for_status()
    29.         return True
    30.     except:
    31.         return False
    32. # 获取可用的代理IP
    33. def get_valid_proxy_ips():
    34.     proxy_ips = fetch_proxy_ips()
    35.     valid_proxy_ips = []
    36.     for proxy_ip in proxy_ips:
    37.         if test_proxy_ip(proxy_ip):
    38.             valid_proxy_ips.append(proxy_ip)
    39.     return valid_proxy_ips
    40. print(get_valid_proxy_ips())

    在上面的代码中,我们首先使用fetch_proxy_ips()函数抓取西刺代理网站上的前10页高匿代理IP列表,然后使用test_proxy_ip()函数测试每个代理IP是否可用(测试URL为http://httpbin.org/ip),最后使用get_valid_proxy_ips()函数返回可用的代理IP列表。

    三、使用代理IP

    使用代理IP可以在requests库中指定proxies参数。proxies参数是一个字典类型,其中键名是协议(http或https),键值是代理IP及其端口号。例如,如果我们要使用代理IP地址为“1.2.3.4”,端口号为“5678”的代理服务器,则proxies参数应该为:

    1. proxies = {
    2.     'http': 'http://1.2.3.4:5678',
    3.     'https': 'https://1.2.3.4:5678'
    4. }

    下面是一个简单的爬虫示例,使用代理IP爬取JD商品搜索页面:

    1. import requests
    2. # 使用代理IP爬取京东商品搜索页面
    3. def crawl_jd_goods(query, proxy_ip):
    4.     url_template = 'https://search.jd.com/Search?keyword={}&enc=utf-8&page={}'
    5.     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.36'}
    6.     proxies = {
    7.         'http': 'http://' + proxy_ip,
    8.         'https': 'https://' + proxy_ip
    9.     }
    10.     for page in range(1, 6):
    11.         url = url_template.format(query, page)
    12.         resp = requests.get(url, headers=headers, proxies=proxies)
    13.         print(resp.status_code)
    14.         print(resp.text)
    15. # 获取可用的代理IP
    16. proxy_ips = get_valid_proxy_ips()
    17. # 使用第一个可用的代理IP爬取京东商品搜索页面
    18. query = 'Python编程'
    19. proxy_ip = proxy_ips[0]
    20. crawl_jd_goods(query, proxy_ip)

    在上面的代码中,我们首先获取可用的代理IP列表,然后使用第一个可用的代理IP爬取京东商品搜索页面(搜索关键字为“Python编程”)。

    四、总结

    需要注意的是,代理IP并不是万能的,在一些反爬虫机制非常强大的网站上,即使使用代理IP也很容易被封禁。此外,一些代理IP质量较差,访问速度较慢,甚至会返回错误响应。因此,在实际使用中需要根据具体情况选择可用的代理IP。

  • 相关阅读:
    分布式下使用雪花算法生成全局ID及解决时钟回拨问题
    如何使用drawio画流程图以及导入导出
    Mysql零基础入门到实战——数据库基础+MySQL常见命令
    聊聊并发编程的12种业务场景
    Excel拆分单元格怎么操作?学会这4招,工作效率倍涨!
    Springboot整合shiro
    19. 机器学习——朴素贝叶斯
    Linux 【gdb】
    Java调用HTTPS接口,绕过SSL认证
    WiFi protocol 详解
  • 原文地址:https://blog.csdn.net/wq10_12/article/details/132735717