Python之爬虫 搭建代理ip池

2023-11-04


前言

在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip被禁,所以这个时候我们通常就可以找一些代理ip来继续爬虫测试。下面就开始来简单地介绍一下爬取免费的代理ip来搭建自己的代理ip池:
本次爬取免费ip代理的网址:http://www.ip3366.net/free/


提示:以下是本篇文章正文内容,下面案例可供参考

一、User-Agent

在发送请求的时候,通常都会做一个简单的反爬。这时可以用fake_useragent模块来设置一个请求头,用来进行伪装成浏览器,下面两种方法都可以。

from fake_useragent import UserAgent
headers = {
        # 'User-Agent': UserAgent().random #常见浏览器的请求头伪装(如:火狐,谷歌)
        'User-Agent': UserAgent().Chrome #谷歌浏览器
    }

在这里插入图片描述


二、发送请求

response = requests.get(url='http://www.ip3366.net/free/', headers=request_header())
        # text = response.text.encode('ISO-8859-1')
        # print(text.decode('gbk'))

三、解析数据

我们只需要解析出ip、port即可。

在这里插入图片描述

在这里插入图片描述
使用xpath解析(个人很喜欢用)(当然还有很多的解析方法,如:正则,css选择器,BeautifulSoup等等)。

		#使用xpath解析,提取出数据ip,端口
        html = etree.HTML(response.text)
        tr_list = html.xpath('/html/body/div[2]/div/div[2]/table/tbody/tr')
        for td in tr_list:
            ip_ = td.xpath('./td[1]/text()')[0] #ip
            port_ = td.xpath('./td[2]/text()')[0]  #端口
            proxy = ip_ + ':' + port_   #115.218.5.5:9000

四、构建ip代理池,检测ip是否可用

	#构建代理ip
	proxy = ip + ':' + port
	proxies = {
        "http": "http://" + proxy,
        "https": "http://" + proxy,
        # "http": proxy,
        # "https": proxy,
    }
    try:
        response = requests.get(url='https://www.baidu.com/',headers=request_header(),proxies=proxies,timeout=1) #设置timeout,使响应等待1s
        response.close()
        if response.status_code == 200:
            print(proxy, '\033[31m可用\033[0m')
        else:
            print(proxy, '不可用')
    except:
        print(proxy,'请求异常')

五、完整代码

import requests                         #导入模块
from lxml import etree
from fake_useragent import UserAgent
#简单的反爬,设置一个请求头来伪装成浏览器
def request_header():
    headers = {
        # 'User-Agent': UserAgent().random #常见浏览器的请求头伪装(如:火狐,谷歌)
        'User-Agent': UserAgent().Chrome #谷歌浏览器
    }
    return headers

'''
创建两个列表用来存放代理ip
'''
all_ip_list = []  #用于存放从网站上抓取到的ip
usable_ip_list = [] #用于存放通过检测ip后是否可以使用

#发送请求,获得响应
def send_request():
    #爬取7页,可自行修改
    for i in range(1,8): 
        print(f'正在抓取第{i}页……')
        response = requests.get(url=f'http://www.ip3366.net/free/?page={i}', headers=request_header())
        text = response.text.encode('ISO-8859-1')
        # print(text.decode('gbk'))
        #使用xpath解析,提取出数据ip,端口
        html = etree.HTML(text)
        tr_list = html.xpath('/html/body/div[2]/div/div[2]/table/tbody/tr')
        for td in tr_list:
            ip_ = td.xpath('./td[1]/text()')[0] #ip
            port_ = td.xpath('./td[2]/text()')[0]  #端口
            proxy = ip_ + ':' + port_   #115.218.5.5:9000
            all_ip_list.append(proxy)
            test_ip(proxy)      #开始检测获取到的ip是否可以使用
    print('抓取完成!')
    print(f'抓取到的ip个数为:{len(all_ip_list)}')
    print(f'可以使用的ip个数为:{len(usable_ip_list)}')
    print('分别有:\n', usable_ip_list)
#检测ip是否可以使用
def test_ip(proxy):
    #构建代理ip
    proxies = {
        "http": "http://" + proxy,
        "https": "http://" + proxy,
        # "http": proxy,
        # "https": proxy,
    }
    try:
        response = requests.get(url='https://www.baidu.com/',headers=request_header(),proxies=proxies,timeout=1) #设置timeout,使响应等待1s
        response.close()
        if response.status_code == 200:
            usable_ip_list.append(proxy)
            print(proxy, '\033[31m可用\033[0m')
        else:
            print(proxy, '不可用')
    except:
        print(proxy,'请求异常')

if __name__ == '__main__':
    send_request()

总结

以上就是要讲的内容,很简单,但希望可以帮助到大家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之爬虫 搭建代理ip池 的相关文章

  • ODFPy 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要操作ODF文件格式 开放文档格式 开放办公室的内部格式 我需要用Python来完成 ODFPy
  • 如何在 PyCharm 中“查看”/突出显示制表符和空格以检查缩进?

    这可能听起来很愚蠢 但我还是个新手 有没有明确的方法可以发现 PyCharm 中的制表符或空格位于错误的位置 或者甚至以可视方式显示所有制表符和空格 我只是花了很长时间在函数的 Def 行寻找 无效语法 错误的问题 我原以为这可能仍然是一些
  • ptb_word_lm中batch_size的含义(tensorflow的LSTM模型)

    我是张量流的新手 我现在对它的含义有点困惑batch size 众所周知 其含义是batch size是每批次的样本数 但是根据中的代码ptb word lm 似乎不是 读者 py data len tf size raw data the
  • 如何在Python中获得更精确的十进制值[重复]

    这个问题在这里已经有答案了 from math import sqrt a 1e 8 b 10 c 1e 8 x1 b sqrt b 2 4 a c 2 a x2 b sqrt b 2 4 a c 2 a print x1 format x
  • pandas:使用运算符链接过滤 DataFrame 的行

    大多数业务在pandas可以通过操作符链接来完成 groupby aggregate apply等 但我发现过滤行的唯一方法是通过普通的括号索引 df filtered df df column value 这没有吸引力 因为它需要我分配d
  • 如何让MagicMock返回多个值

    我想模拟一个图书馆 matplotlib对于它的价值 并且遇到一个问题 当调用模拟并期望返回元组时 它会失败 有一个更好的方法吗 Python 3 7 2 default Jan 13 2019 12 50 15 Clang 10 0 0
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • 如何使用 Tkinter 创建等宽网格列?

    如何强制 Tkinter 应用程序窗口中的列宽度相等 tkdocs网站声明如下 每列的宽度 或每行的高度 取决于列或行中包含的小部件的宽度或高度 这意味着当绘制用户界面并将其划分为行和列时 您无需担心每列或行的宽度相等 或高度 大概 TkD
  • Python:选择多个已安装模块版本之一

    在我的系统上 我多次安装了多个模块 举个例子 numpy 1 6 1安装在标准路径中 usr lib python2 7 dist packages 我有一个更新版本numpy 1 8 0安装于 local python lib pytho
  • 中断QThread睡眠

    我想知道如何暂停 QThread 然后在收到信号时恢复 我已阅读并知道我可以做这样的事情 def run self self ready False while not self ready self sleep 1 QtCore Slot
  • 您能否从函数、args 和 kwargs 确定变量将如何分配?

    我有一些样板逻辑 我想包装几个具有相同可选关键字的函数 现在看起来像下面的代码 但是 这仅处理 opt key 作为关键字传递的情况 而不是按位置传递 解决这个问题的一种方法是了解如何解决参数分配 是否有一些元函数接受函数 args 和 k
  • 仅打印字符串中的元音

    我是Python新手 我正在尝试打印字符串中的所有元音 因此 如果有人输入 嘿 一切都好吗 所有元音都需要打印 但我不知道怎么做 所以这不是计算元音 而是打印元音 现在我已经得到了这个 sentence input Enter your s
  • 将 Python 3 的“范围”“向后移植”到 Python 2 是一个坏主意吗?

    我的一门课程要求用 Python 完成作业 作为练习 我一直使用如下脚本确保我的程序可以在 Python 2 和 Python 3 中运行 bin bash Run some PyUnit tests python2 test py pyt
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l
  • Anaconda (Python) - Windows 10 上的 Cmder 集成

    我在 Windows 10 64 位上通过 Anaconda 让 Cmder 使用 Python 时遇到了一些麻烦 我让 Anaconda 工作得很好 测试过用 matplotlib 绘制一些东西 它与 Anaconda Prompt 一起
  • Django 1.6:如何在视图中访问静态文件

    我已经尝试过解决方案here https stackoverflow com questions 11721818 django get the static files url in view这对我不起作用 我正在为 Python 创建一
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • FileAllowed 不显示错误消息

    我正在使用 WTForms 我正在对文件上传应用验证 并将其限制为仅 jpg png 和 pdf 格式 但是 如果我输入不正确 则不会出现错误消息 我按照这个教程https flask wtf readthedocs io en stabl
  • 是否有比 .apply() 更慢或更受控制的替代方案?

    所以这似乎是一个奇怪的问题 但我有一只熊猫DataFrame其中包含地址 我想对其进行地理编码 以便获得纬度和经度 我有可以使用的代码 apply 感谢这个非常有帮助的线程 使用 geopy pandas 的新列坐标 https stack
  • 使用 PyCharm 分析 Django

    即使在开发环境中 我的应用程序也相当慢 所以我想找出是什么导致它变慢 以便我可以尝试修复它 我了解调试工具栏 根据它的报告 数据库查询和下载的源都不是问题 所以它一定是业务逻辑 但是 我无法使用 Django 服务器运行 PyCharm 分

随机推荐

  • python中with...as的用法

    文章内容主要部分来至 http www 360doc com content 16 0905 16 25664332 588595085 shtml with as 就是个python控制流语句 像 if while一样 with as语句
  • SQLi LABS Less-29

    第29关使用GET请求提交参数 在url中构造payload即可 源码中并没有做什么过滤 直接测试注入点即可 在url中输入 1 and true a 源码中的SQL会拼接成下面这样 注释后面的内容不起作用 所以真正执行的SQL是这样的 a
  • Idea 14 最详细创建最简单web项目,并且发布在tomcat

    1 New Project 2 选择Empty Project 然后Next 3 填写Project名称 然后 finish 4 出现如下页面
  • 算法小题4→正整数分解质因数

    题目 将一个正整数分解质因数 例如 输入90 打印出90 2 3 3 5 程序分析 对n进行分解质因数 应先找到一个最小的质数k 然后按下述步骤完成 1 如果这个质数恰等于n 则说明分解质因数的过程已经结束 打印出即可 2 如果n lt g
  • Redis使用总结(三、缓存击穿问题)

    什么是缓存击穿 在谈论缓存击穿之前 我们先来回忆下从缓存中加载数据的逻辑 如下图所示 因此 如果黑客每次故意查询一个在缓存内必然不存在的数据 导致每次请求都要去存储层去查询 这样缓存就失去了意义 如果在大流量下数据库可能挂掉 这就是缓存击穿
  • MATLAB求解函数极值及函数图像

    MATLAB具有求解函数极值以及函数图像的功能 简单举一个例子 求解上述函数极值与图像 1 驻点求解 syms x gt gt y 3 x 2 4 x 4 x 2 x 1 gt gt dy diff y gt gt xz solve dy
  • 防火墙旁挂,策略路由引流

    1 案例拓扑图 2 核心设备AR2的主要配置 2 1AR2 acl number 2000 rule 5 permit source 192 168 1 0 0 0 0 255 匹配需要过滤的路由 traffic classifier li
  • Verilog中阻塞赋值与非阻塞赋值的区别

    最近有初学者会问阻塞 和非阻塞 lt 到底是有什么区别 可能确实有很多的文档对这两种语法的定义展开性讲的已经很天花乱坠 但是对于刚刚学习Verilog语法的小伙伴来说 确实有些绕 这边向大家总结一下个人对这两种赋值的一些简单想法 1 在组合
  • 【翻译】RFP有什么问题?

    科技行业充斥着首字母缩略词和缩写 有时会引发强烈的反应 RfP这些字母总是让我在黯然神伤和极度沮丧之间摇摆不定 为什么呢 因为征求建议书的过程突出了我们采购和交付软件和基础设施的方式是如何被打破的 从表面上看 传统的提案申请程序是非常合理的
  • 【js】Array.prototype.concat和Array.flat、Array.flatMap的关联使用

    Array prototype concat 用于合并两个或多个数组 返回一个新数组 不改变原数组 const arr1 1 2 3 const arr2 4 5 6 const arr3 7 8 9 const result arr1 c
  • 800个有趣句子帮你记忆7000个单词

    800个有趣句子帮你记忆7000个单词 1 With my ownears I clearly heard the heart beat of the nuclear bomb 我亲耳清楚地听到原子弹的心脏的跳动 2 Next year t
  • JS循环及调试

    break 终止某个循环 使程序跳到循环块外的下一条语句 在循环中位于break后的语句将不再执行 for var i 1 i lt 5 i let num parseInt prompt 输入第 i 人的成绩 if num lt 0 do
  • 基于SpringBoot+Vue框架前后端分离的在线购物平台的设计与实现

    系统合集跳转 一 系统环境 运行环境 最好是java jdk 1 8 我们在这个平台上运行的 其他版本理论上也可以 IDE环境 Eclipse Myeclipse IDEA或者Spring Tool Suite都可以 tomcat环境 To
  • 量化投资学习-34:缺口是制造恐慌和疯狂情绪的手段!

    缺口是制造恐慌和疯狂情绪的手段 发生在不同的阶段 目的是不一样的 底部向下 加速赶底 一般发生了连续下跌的末端 在最后制造疯狂下跌的恐慌 这是筑底的标志 底部向上 借助缺口 实现快速拉升 快速脱离底部成本区 大阳 底部跳空缺口是中级行情开始
  • ts项目打包报错 error TS6504: xxxxxx is a JavaScript file. Did you mean to enable the ‘allowJs‘ option?

    项目vue3 ts 打包时一个组件如下错误 解决 加上lang
  • 毕业设计-基于机器学习的网络舆情情感倾向分析

    目录 前言 课题背景和意义 实现技术思路 一 论坛文本采集方法研究 二 文本情感分析理论 三 论坛文本预处理 四 文本表示及特征抽取 五 情感倾向分类器 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业
  • Java中异常问题(异常抛出后是否继续执行的问题)

    public static void test throws Exception throw new Exception 参数越界 System out println 异常后 编译错误 无法访问的语句 代码2 异常被捕获 日志打印了异常
  • Python Pandas修改列类型

    使用astype如下 df column df column astype type type即int float等类型 示例 import pandas as pd data pd DataFrame 1 2 2 2 data colum
  • vue3 setup 组合式api props父子组件传值详解

    vue3组合式api中 父组件通过在子组件上通过v bind传递给子组件数据 子组件通过defineprops函数在子组件中定义父组件中传入子组件的数据就可以接收这些数据 然后可在template中直接使用 但是想要在setup中使用父组件
  • Python之爬虫 搭建代理ip池

    文章目录 前言 一 User Agent 二 发送请求 三 解析数据 四 构建ip代理池 检测ip是否可用 五 完整代码 总结 前言 在使用爬虫的时候 很多网站都有一定的反爬措施 甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip