爬虫-Scrapy (十) 搭建ip代理池

    每一个爬虫程序员都应该有一个ip池,就像每个战士都应该有一把风剑。

一、找到一个ip代理提供商

提供ip代理的服务商很多,基本都会先提供些不稳定的免费ip,然后引导你消费,我们本次的目标就是把免费的ip抓取下来,验证是否可用,如果可用存入数据库中,作为代理使用。
百度下ip代理,然后随便打开一个,找到免费ip列表

爬虫-Scrapy (十) 搭建ip代理池
爬虫-Scrapy (十) 搭建ip代理池

; 二、抓取ip

创建项目ipPool,创建爬虫pro,然后分析下页面源码结构,很简单,这里就省略了,直接贴代码
proxySpider.py

import scrapy
from scrapy import FormRequest
from ipPool.items import IpPoolItem

class ProxySpider(scrapy.Spider):
    name = 'proxySpider'
    allowed_domains = ['linkudp.com']
    base_url = "http://wapi.http.linkudp.com/index/index/get_free_ip"

    def start_requests(self):
        for i in range(1,6):
            yield FormRequest(url=self.base_url, formdata={'page': str(i)}, callback=self.parse)

    def parse(self, response):
        tr_list = response.xpath('//table/tr')[1:7]
        for tr in tr_list:
            ip = tr.xpath('./td[1]/span/text()').extract_first()
            port = tr.xpath('./td[2]/text()').extract_first()
            item = IpPoolItem()
            item['ip'] = ip
            item['port'] = port
            print(item)
            yield item

运行看下结果

爬虫-Scrapy (十) 搭建ip代理池
ip 和 port中包含 FREE ,\n 这样非预期的字符,需要用正则表达式处理下
    def parse(self, response):
        tr_list = response.xpath('//table/tr')[1:7]
        ip_pattern = re.compile(r'\d+\.\d+\.\d+\.\d+')
        port_pattern = re.compile(r'\d+')
        for tr in tr_list:
            ip_ori = tr.xpath('./td[1]/span/text()').extract_first()
            port_ori = tr.xpath('./td[2]/text()').extract_first()

            ip = ip_pattern.findall(str(ip_ori))[0]
            port = port_pattern.findall(str(port_ori))[0]

            item = IpPoolItem()
            item['ip'] = ip
            item['port'] = port
            print(item)
            yield item

再次运行看下效果

爬虫-Scrapy (十) 搭建ip代理池
OK,没问题了

三、过滤有效ip

免费代理不能保证有效性和稳定的,所以我们抓取完写个方法验证下,原来就是引用requests 库,用request.get方法将代理传入,超时时间设置为2秒,如果2秒内可以返回预期结果则认为ip有效,否则认为无效。
check_ip 代码

    '''
        校验ip是否有效
    '''
    def check_ip(self, ip, port):
        url = 'http://icanhazip.com/'
        proxy = {'http':'http://{}:{}'.format(ip, port)}

        try:
            r = requests.get(url, proxies=proxy, timeout=5)
            return r.text==ip
        except requests.exceptions.RequestException as e:
            return False

修改下parse , 打印下校验结果

def parse(self, response):
    tr_list = response.xpath('//table/tr')[1:7]
    ip_pattern = re.compile(r'\d+\.\d+\.\d+\.\d+')
    port_pattern = re.compile(r'\d+')
    for tr in tr_list:
        ip_ori = tr.xpath('./td[1]/span/text()').extract_first()
        port_ori = tr.xpath('./td[2]/text()').extract_first()

        ip = ip_pattern.findall(str(ip_ori))[0]
        port = port_pattern.findall(str(port_ori))[0]

        item = IpPoolItem()
        item['ip'] = ip
        item['port'] = port
        if self.check_ip(ip, port):
            print(ip + ' is valid')
        else:
            print(ip + ' is not valid')

        yield item

看下运行结果,共5页,30个ip

爬虫-Scrapy (十) 搭建ip代理池
OK,全部都是无效的。

四、入库

因为抓取的免费ip全部都是无效的,就不用写入库了,本篇结束。

Original: https://blog.csdn.net/XiaoDao147258369/article/details/113766882
Author: 荆棘谷三季稻
Title: 爬虫-Scrapy (十) 搭建ip代理池

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/789473/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c#入参使用引用类型为啥要加ref?

    摘一段来自官网的说明 :方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递。 ref 关键字让形参成为实参的别名,这必须是变量。 换而言之,对形参执行的任何…

    Python 2023年10月14日
    042
  • C# 通用 HTTP 签名组件的另类实现

    1、初衷 开发中经常需要做一些接口的签名生成和校验工作,最开始的时候都是每个接口去按照约定单独实现,久而久之就变的非常难维护,因此就琢磨怎么能够写了一个 比较通用的签名生成工具。 …

    Python 2023年10月20日
    042
  • 记一次 Sedona(GeoSpark) 空间计算优化

    项目需求需要空间计算能力,开始选型Sedona(GeoSpark)来完成, 需求需要每一条数据在满足某条件的情况下,去查找某张表进行空间匹配,找到离这个点(point)最近的一条道…

    Python 2023年10月22日
    044
  • pytest【一、启动测试和常用参数】

    1、命令行启动 pytest框架是python经典单元测试框架,运行会自动识别测试项目中的测试用例,包含测试模块module(以 test_开头)、测试类class(以 Test开…

    Python 2023年9月12日
    054
  • scrapy框架其他功能的使用

    目录: 1:piplines的使用 * 1.1:怎样使用piplines来保存爬虫返回的数据 1.2:步骤 1.3:多个管道的开启 2:items文件的讲解 * 2.1:items…

    Python 2023年10月6日
    035
  • MySQL数据库 | SQL语句详解

    DDL解释: 1.数据库的常用操作 2.表结构的常用操作 3.修改表结构 查看所有的数据库show databases; 创建表格式 use mydb3; create table…

    Python 2023年10月7日
    036
  • Python基础巩固:如何同时遍历多个序列

    导入系统包 import platform 我还给大家准备了海量资料:Python视频教程、100本Python电子书、基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题…

    Python 2023年5月23日
    061
  • 连连看有点费脑力,于是我直接用Python写了个自动过关脚本!太爽了!

    -*- coding:utf-8 -*- import cv2 import numpy as np import win32api import win32gui import …

    Python 2023年11月9日
    044
  • 小白开发程序的一天

    技术背景,前后端分离,前端 vue 后端 .Net Core 小白有一个需求,在他费尽千辛万苦之力,写了N行sql才完成的汇总数据报表中,根据表头和首列类别定位的单元格上添加点击事…

    Python 2023年10月16日
    041
  • Django的安装及配置环境变量

    Django 是使用 Python 语言开发的一款免费而且开源的 Web 应用框架。由于 Python 语言的跨平台性,所以 Django 同样支持 Windows、Linux 和…

    Python 2023年8月4日
    069
  • imx6ull uboot使用tftp加载内核zImage及设备树dtb文件

    在基于嵌入式linux开发时,经常要烧写内核代码及设备数文件,而mfgtools工具的烧写速度台慢,浪费大量时间,在观看左盟主的imx6ul视频驱动开发视频时发现他是用tftp自动…

    Python 2023年11月7日
    036
  • 【开源测试平台横向测评系列】预告篇

    一、开源测试平台评测预告 近几年来,随着互联网行业的高速发展,各类开源自动化测试框架、工具、平台如雨后春笋般涌现。在当前市面上主流的开源测试平台中,知名度较高的有:Metersph…

    Python 2023年6月12日
    054
  • Python 用Pygame写一个Flappy Bird经典小游戏

    Pygame是Python用于开发游戏的外置库,可通过pip install pygame安装~ 这篇文章,我们将用Pygame编写一个Flappy Bird小游戏,游戏效果如下:…

    Python 2023年9月17日
    038
  • React Native和Flutter语言如何选择

    为了一份代码能够运行在多个平台,从而节省开发和沟通成本,各公司都开始关注和使用跨端方案。目前,主流的跨端方案,主要分为两种:一种是,将 JavaScriptCore 引擎当作虚拟机…

    Python 2023年11月8日
    037
  • Python Django 快速入门

    1、项目的创建和运行 1、辅助文档点击进入Django官网中文手册2、默认已装好Python3、运行cmd安装Django4.0 pip install Django==4.0 安…

    Python 2023年8月5日
    055
  • Cenots7 离线安装部署PostgreSQL

    1 PostgreSQL源码包下载并复制 1.1 PostgreSQL源码包下载: 访问PostgreSQL官网 选择所需版本进行下载,本次下载安装版本为v14.5 1.2 复制源…

    Python 2023年10月17日
    037
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球