Python_01_IP代理池_实现代理池的爬虫模块的及具体爬虫

    目标:通过继承通用爬虫,实现多个具体爬虫,分别从各个免费代理ip网站上抓取代理ip

    步骤

      1.实现西刺代理,ip3366代理和快代理还有proxylistplus代理

        定义一个类,继承通用爬虫类

        提供urls,group_xpath和detail_xpath

      2.实现66ip爬虫

        定义一个类,继承通用爬虫类

        提供urls,group_xpath和detail_xpath

        由于ip66网页进行js+cookie反爬,需要重写父类的get_page_from_url()方法

  代码:

import time
import random
import requests
import re
import js2py

from core.proxy_spider.base_spider import BaseSpider
from utils.http import get_request_headers

"""
1. 实现西刺代理爬虫: http://www.xicidaili.com/nn/1
    定义一个类,继承通用爬虫类(BasicSpider)
    提供urls, group_xpath 和 detail_xpath
"""

class XiciSpider(BaseSpider):
    # 准备URL列表
    urls = [‘https://www.xicidaili.com/nn/{}‘.format(i) for i in range(1, 11)]
    # 分组的XPATH, 用于获取包含代理IP信息的标签列表
    group_xpath = ‘//*[@id="ip_list"]/tr[position()>1]‘
    # 组内的XPATH, 用于提取 ip, port, area
    detail_xpath = {
        ‘ip‘:‘./td[2]/text()‘,
        ‘port‘:‘./td[3]/text()‘,
        ‘area‘:‘./td[4]/a/text()‘
    }

"""
2. 实现ip3366代理爬虫: http://www.ip3366.net/free/?stype=1&page=1
    定义一个类,继承通用爬虫类(BasicSpider)
    提供urls, group_xpath 和 detail_xpath
"""
class Ip3366Spider(BaseSpider):
    # 准备URL列表
    urls = [‘http://www.ip3366.net/free/?stype={}&page={}‘.format(i, j) for i in range(1, 4, 2) for j in range(1, 8)]
    # # 分组的XPATH, 用于获取包含代理IP信息的标签列表
    group_xpath = ‘//*[@id="list"]/table/tbody/tr‘
    # 组内的XPATH, 用于提取 ip, port, area
    detail_xpath = {
        ‘ip‘:‘./td[1]/text()‘,
        ‘port‘:‘./td[2]/text()‘,
        ‘area‘:‘./td[5]/text()‘
    }

"""
3. 实现快代理爬虫: https://www.kuaidaili.com/free/inha/1/
    定义一个类,继承通用爬虫类(BasicSpider)
    提供urls, group_xpath 和 detail_xpath
"""
class KaiSpider(BaseSpider):
    # 准备URL列表
    urls = [‘https://www.kuaidaili.com/free/inha/{}/‘.format(i) for i in range(1, 6)]
    # # 分组的XPATH, 用于获取包含代理IP信息的标签列表
    group_xpath = ‘//*[@id="list"]/table/tbody/tr‘
    # 组内的XPATH, 用于提取 ip, port, area
    detail_xpath = {
        ‘ip‘:‘./td[1]/text()‘,
        ‘port‘:‘./td[2]/text()‘,
        ‘area‘:‘./td[5]/text()‘
    }

    # 当我们两个页面访问时间间隔太短了, 就报错了; 这是一种反爬手段.
    def get_page_from_url(self, url):
        # 随机等待1,3s
        time.sleep(random.uniform(1, 3))
        # 调用父类的方法, 发送请求, 获取响应数据
        return super().get_page_from_url(url)

"""
4. 实现proxylistplus代理爬虫: https://list.proxylistplus.com/Fresh-HTTP-Proxy-List-1
    定义一个类,继承通用爬虫类(BasicSpider)
    提供urls, group_xpath 和 detail_xpath
"""

class ProxylistplusSpider(BaseSpider):
    # 准备URL列表
    urls = [‘https://list.proxylistplus.com/Fresh-HTTP-Proxy-List-{}‘.format(i) for i in range(1, 7)]
    # # 分组的XPATH, 用于获取包含代理IP信息的标签列表
    group_xpath = ‘//*[@id="page"]/table[2]/tr[position()>2]‘
    # 组内的XPATH, 用于提取 ip, port, area
    detail_xpath = {
        ‘ip‘:‘./td[2]/text()‘,
        ‘port‘:‘./td[3]/text()‘,
        ‘area‘:‘./td[5]/text()‘
    }

"""
5. 实现66ip爬虫: http://www.66ip.cn/1.html
    定义一个类,继承通用爬虫类(BasicSpider)
    提供urls, group_xpath 和 detail_xpath
    由于66ip网页进行js + cookie反爬, 需要重写父类的get_page_from_url方法
"""

class Ip66Spider(BaseSpider):
    # 准备URL列表
    urls = [‘http://www.66ip.cn/{}.html‘.format(i) for i in range(1, 11)]
    # # 分组的XPATH, 用于获取包含代理IP信息的标签列表
    group_xpath = ‘//*[@id="main"]/div/div[1]/table/tr[position()>1]‘
    # 组内的XPATH, 用于提取 ip, port, area
    detail_xpath = {
        ‘ip‘:‘./td[1]/text()‘,
        ‘port‘:‘./td[2]/text()‘,
        ‘area‘:‘./td[3]/text()‘
    }

    # 重写方法, 解决反爬问题
    # 核心:通过加密的js,生成需要的cookie信息
    ‘‘‘
    1.从响应页面中提取执行生成的真正js语句和生成真正的js函数
    2.网页中通过eval执行真的的js加载页面,我们需要把eval语句替换为return把真正的js返回
    3.使用js2py获取执行的js环境,使用js环境加载这个函数
    4.使用这个而执行环境,执行调用,生成真正的js,赋值给一个变量
    5.从真正的js中,图区我们需要的cookie信息
    ‘‘‘
    def get_page_from_url(self, url):
        headers = get_request_headers()
        response = requests.get(url, headers=headers)
        if response.status_code == 521:
            # 生成cookie信息, 再携带cookie发送请求
            # 生成 `_ydclearance` cookie信息
            # 1. 确定 _ydclearance 是从哪里来的;
            # 观察发现: 这个cookie信息不使用通过服务器响应设置过来的; 那么他就是通过js生成.
            # 2. 第一次发送请求的页面中, 有一个生成这个cookie的js; 执行这段js, 生成我们需要的cookie
            # 这段js是经过加密处理后的js, 真正js在 "po" 中.
            # 提取 `jp(107)` 调用函数的方法, 以及函数
            result = re.findall(‘window.onload=setTimeout\("(.+?)", 200\);\s*(.+?)\s*</script> ‘, response.content.decode(‘GBK‘))
            # print(result)
            # 我希望执行js时候, 返回真正要执行的js
            # 把 `eval("qo=eval;qo(po);")` 替换为 return po
            func_str = result[0][1]
            func_str = func_str.replace(‘eval("qo=eval;qo(po);")‘, ‘return po‘)
            # print(func_str)
            # 获取执行js的环境
            context = js2py.EvalJs()
            # 加载(执行) func_str
            context.execute(func_str)
            # 执行这个方法, 生成我们需要的js
            # code = gv(50)
            context.execute(‘code = {};‘.format(result[0][0]))
            # 打印最终生成的代码
            # print(context.code)
            cookie_str = re.findall("document.cookie=‘(.+?); ", context.code)[0]
            # print(cookie_str)
            headers[‘Cookie‘] = cookie_str
            response = requests.get(url, headers=headers)
            return response.content.decode(‘GBK‘)
        else:
            return response.content.decode(‘GBK‘)

if __name__ == ‘__main__‘:
    # spider = XiciSpider()
    # spider = Ip3366Spider()
    # spider = KaiSpider()
    # spider = ProxylistplusSpider()

    spider = Ip66Spider()
    for proxy in spider.get_proxies():
        print(proxy)

5

原文地址:https://www.cnblogs.com/tkg1314/p/12617037.html

时间: 2024-08-30 13:28:11

Python_01_IP代理池_实现代理池的爬虫模块的及具体爬虫的相关文章

代理模式_静态代理

一.代理模式_静态代理 来到北京.首先第一件事就是租房子.然而北京租房子80%的都要通过中介,中介获得房屋出租的权限,出租房屋给房客.我们以这个很现实很亲近我们生活的例子来认识代理模式中的静态代理. 二.代理模式中的角色划分 2.1抽象角色:把真实角色和代理角色所共有的行为抽成一个接口或者抽象类. 2.2真实角色:被代理角色所代理的角色. 2.3代理角色:代理真实角色做某些工作. 三.静态代理示例 3.1抽象角色(把真实角色房东和代理角色中介所共有的行为出租房屋抽象成一个接口) package

Python_01_IP代理池_实现代理池的检测模块

目的:检测代理ip的可用性,保证代理池中代理ip基本可用 思路: 1.在proxy_test.py中,创建ProxyTester类 2.提供一个run方法,用于处理检测代理ip的核心逻辑 1)从数据库中获取所有代理ip 2)遍历代理ip列表 3)检查代理ip可用性 如果不可用,代理分数-1,如果代理分数=0则删除该代理,否则更新代理ip 如果可用,恢复代理ip的分数,更新到数据库中 3.为了提高检查的速度,使用异步来执行检测任务 1)把要检测的代理ip放到队列中 2)把检查一个代理可用性的代码抽

Python_01_IP代理池_实现代理池的爬虫模块的执行方法

目标:根据配置问价内心戏,加载爬虫,抓取代理ip,进行校验,如果可用写入到数据库中 思路: 1.在run_spider.py中,创建RunSpider类 2.提供一个运行爬虫的run方法,作为运行爬虫的入口,实现核心的处理逻辑 根据配置文件信息,获取爬虫对象列表 遍历爬虫对象列表,获取爬虫对象,遍历爬虫对象的get_proxies方法,获取代理ip 检测代理ip 如果可用则写入数据库 处理异常,防止一个爬虫内部出错,影响其他爬虫的使用 3.使用异步来执行每一个爬虫任务,以提高抓取代理ip的效率

Python_01_IP代理池_实现代理池的校验模块

目标:检验代理ip速度,匿名程度以及支持的协议类型 步骤: 1.检查代理ip速度和匿名程度: a.代理IP速度就是从发送请求到获取相应的时间间隔 b.匿名程度检查 对http://httpbin.org/get或https://httpbin.org/get发送请求如果相应的origin中有'.'分割的两个ip就是透明代理ip,如果相应的headers包含proxy-connection说明是匿名代理ip,否则就是高匿代理ip c.检查代理ip的协议类型 如果http://httpbin.org

设计模式_代理模式_动态代理

转自:https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html 动态代理是指在运行时动态生成代理类.即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader.与静态处理类相比,动态类有诸多好处.首先,不需要为真实主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也很麻烦.如果接口有变动,则真实主题和代理类都要修改,不利于系统维护:其次,使用一些动态代理的生成

总结代理模式 并根据数据库连接池原理来模拟实现自己的数据库连接池工具类

代理模式 需求:对系统中已有的某个类的功能,进行扩展(增强) 要求:在不修改源码的情况下,对已有的功能进行增强 静态代理 抽象接口:保证包含增强功能的对象和原有功能的对象,对外提供相同的方法 目标对象:封装了原有功能 代理对象:封装了增强功能和原有功能(通过持有一个目标对象的引用实现) 问题:代码不够灵活,产生大量冗余工作 动态代理 动态代理的实现API: Proxy : 帮助程员产生代理对象,提供产生代理类和代理对象的静态方法 InvocationHandler : 句柄接口,拦截到,所有代理

Spring之AOP原理_动态代理

面向方面编程(Aspect Oriented Programming,简称AOP)是一种声明式编程(Declarative Programming).声明式编程是和命令式编程(Imperative Programming)相对的概念.我们平时使用的编程语言,比如C++.Java.Ruby.Python等,都属命令式编程.命令式编程的意思是,程序员需要一步步写清楚程序需要如何做什么(How to do What).声明式编程的意思是,程序员不需要一步步告诉程序如何做,只需要告诉程序在哪些地方做什么

Apache2.4+Tomcat集群_反向代理配置

Apache2.4+Tomcat集群_反向代理配置 测试环境:Apache反代做为前端反向代理,后端任意,此处我用做windwos,其实linux与windwos配置原理都一样,只是根据公司需求来做. 需求:        要求基于ssl访问, 301域名跳转, session sticky方式来接收请求, 有故障隔离的作用,以至于在其中一台上线时可以把用户请求转发到另一台. 1.资源下载: Apache(windows安装包)下载路径 http://www.apachelounge.com/d

.net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包

原文:.net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包 前言:  通过Fiddler抓取浏览器请求数据,相信大家已经都会用了,我们知道Fiddler是通过在本机计算器添加一个默认的代理服务器来实现的抓包数据的,端口号为:8888. 其实当我们打开Fiddler的设置也可以看到: 然后查看本地计算器的网络代理设置: 基于上面的原理,Fiddler就实现了经过本机计算器请求的数据抓包了... 那么,我们通过C#代码,在.net Core中使用HttpClient