scrapy中间件中使用selenium切换ip

scrapy抓取一些需要js加载页面时一般要么是通过接口直接获取数据,要么是js加载,但是我通过selenium也可以获取动态页面

但是有个问题,容易给反爬,因为在scrapy中间件mid中使用selenium的ip不会跟着你在中间件中切换的ip变化,还是使用本机的ip在访问网站,

这里通过 确定网页url进行过滤,什么网页使用selenium,什么使用scrapy自带的抓取,

为selenium单独设置一个获取ip的办法,当然也可以使用全局变量

from selenium import webdriver
from scrapy.http.response.html import HtmlResponse
from selenium.webdriver.chrome.options import Options
import json
import requests

class ip_mid(object):
    def __init__(self):
        self.ip = ‘‘
        self.url = ‘http://proxy.1again.cc:35050/api/v1/proxy/?type=2‘
        self.ip_num = 0

    def process_request(self,request,spider):
        # if re.findall(r‘根据需求的url过滤,简单的页面‘, request.url):
        print(‘正在使用ip‘)
        if self.ip_num ==0 or self.ip_num >=10:
            res = json.loads(requests.get(url=self.url).content.decode())
            if res:
                ip = res[‘data‘][‘proxy‘]
                print(ip,‘-‘*20)
                self.ip = ip
                print(self.ip)
                self.ip_num = 1

        if self.ip:
            request.meta[‘proxy‘] = ‘http://‘ + self.ip
            self.ip_num += 1
            print(‘ip地址>>>{} --- 使用次数{}‘.format(self.ip, self.ip_num))
        else:
            self.ip_num += 3
            print(‘使用的是本机ip......‘)

‘‘‘
两个获取ip的设置,对ip池的访问返回是个问题,
如果加上一个判定什么网页使用selenium + 获取ip,什么网页使用正常的获取ip正常的访问
比如 if re.findall(r‘根据需求的url过滤,必须使用selenium加载的js动态页面‘,request.url)
‘‘‘
class YanzhenIp_selenium_DownloaderMiddleware(object):

    def __init__(self):

        self.chrome_options = Options()
        self.chrome_options.add_argument(‘--headless‘)
        self.chrome_options.add_argument(‘--disable-gpu‘)
        # self.driver = webdriver.Chrome(chrome_options=chrome_options)
        self.chrome_options.add_experimental_option(‘excludeSwitches‘, [‘enable-automation‘])

        self.ip = ‘‘
        self.url = ‘http://proxy.1again.cc:35050/api/v1/proxy/?type=2‘
        self.ip_num = 0

    def process_request(self, request, spider):
        # if re.findall(r‘根据需求的url过滤,必须使用selenium加载的js动态页面‘, request.url):
        print(‘获取ip............‘)    # 为selenium获取ip
        if self.ip_num == 0 or self.ip_num >= 3:
            res = json.loads(requests.get(url=self.url).content.decode())
            if res:
                ip = res[‘data‘][‘proxy‘]
                self.ip = ip
                self.ip_num = 1

        print(‘调用selenium中.............‘)

        self.chrome_options.add_argument("--proxy-server=http://{}".format(self.ip))    # 加载ip
        print(‘插入ip{},并使用{}‘.format(self.ip,self.ip_num), ‘-‘ * 20)
        self.driver = webdriver.Chrome(chrome_options=self.chrome_options)

        self.driver.get(request.url)
        html = self.driver.page_source
        url = self.driver.current_url

        response =  HtmlResponse(url=url,body=html,encoding=‘utf-8‘,request=request)
        return response

    def close_spider(self,spider):
        self.driver.close()
        print(‘关闭selenium‘)

ua也可以这样搞

随手一写,有待优化





ga改进版本,有待优化

class YanzhenIp_selenium_DownloaderMiddleware(object):

    def __init__(self):

        self.chrome_options = Options()
        self.chrome_options.add_argument(‘--headless‘)
        self.chrome_options.add_argument(‘--disable-gpu‘)
        # self.driver = webdriver.Chrome(chrome_options=chrome_options)
        self.chrome_options.add_experimental_option(‘excludeSwitches‘, [‘enable-automation‘])

        self.ip = ‘‘
        self.url = ‘http://proxy.1again.cc:35050/api/v1/proxy/?type=2‘
        self.ip_num = 0

    def process_request(self, request, spider):
        # if re.findall(‘js加载页面的url‘,request.url):
        if self.ip_num == 0 or self.ip_num >= 10:
            res = json.loads(requests.get(url=self.url).content.decode())
            if res:
                ip = res[‘data‘][‘proxy‘]
                self.ip = ip
                self.ip_num = 1

        if re.findall(‘js加载页面的url‘, request.url):

            # TODO if self.ip ?? 做个判断有咩有ip 没有的时候怎么办
            print(‘调用selenium中.............‘)

            self.chrome_options.add_argument("--proxy-server=http://{}".format(self.ip))
            print(‘插入ip{},并使用{}‘.format(self.ip,self.ip_num), ‘-‘ * 20)
            self.driver = webdriver.Chrome(chrome_options=self.chrome_options)

            self.driver.get(request.url)
            html = self.driver.page_source
            url = self.driver.current_url

            response =  HtmlResponse(url=url,body=html,encoding=‘utf-8‘,request=request)
            return response

        else:       # 抓取简单的页面,scrapy可以胜任
            if self.ip:
                request.meta[‘proxy‘] = ‘http://‘ + self.ip
                self.ip_num += 1
                print(‘ip地址>>>{} --- 使用次数{}‘.format(self.ip, self.ip_num))
            else:
                self.ip_num += 3
                print(‘使用的是本机ip......‘)

    def close_spider(self,spider):
        self.driver.close()
        print(‘关闭selenium‘)

原文地址:https://www.cnblogs.com/zengxm/p/10995046.html

时间: 2024-10-05 04:12:41

scrapy中间件中使用selenium切换ip的相关文章

scrapy中的selenium

引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据.那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 1.案例分析: - 需求:爬取网易新闻的国内板块下的新闻数据 - 需求分析:当点击

在Scrapy中使用Selenium

1. selenium在scrapy中的使用流程 重写爬虫文件的构造方法,在该方法中使用selenium实例化一个浏览器对象(因为浏览器对象只需要被实例化一次) 重写爬虫文件的closed(self,spider)方法,在其内部关闭浏览器对象.该方法是在爬虫结束时被调用 重写下载中间件的process_response方法,让该方法对响应对象进行拦截,并篡改response中存储的页面数据 在配置文件中开启下载中间件 2. 代码展示 - 爬虫文件: class WangyiSpider(Redi

Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以从这里我们可以知道下载中间件是介于Scrapy的request/response处理的钩子,用于修改Scrapy request和response. 编写自己的下载器中间件 编写下载器中间件,需要定义以下一个或者多个方法的python类 为了演示这里的中间件的使用方法,这里创建一个项目作为学习,这里

Python爬虫从入门到放弃 之 Scrapy框架中Download Middleware用法

这篇文章中写了常用的下载中间件的用法和例子.Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所以从这里我们可以知道下载中间件是介于Scrapy的request/response处理的钩子,用于修改Scrapy request和response. 编写自己的下载器中间件 编写下载器中间件,需要定义以下一个或者多个方法的python类 为了演示这里的中间件的使用方法,这里创建一个项目作为学习,这里

爬虫(十七):Scrapy框架(四) 对接selenium爬取京东商品数据

1. Scrapy对接Selenium Scrapy抓取页面的方式和requests库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取JavaScript动态谊染的页面.在前面的博客中抓取JavaScript渲染的页面有两种方式.一种是分析Ajax请求,找到其对应的接口抓取,Scrapy同样可以用此种方式抓取.另一种是直接用 Selenium模拟浏览器进行抓取,我们不需要关心页面后台发生的请求,也不需要分析渲染过程,只需要关心页面最终结果即可,可见即可爬.那么,如果Scrapy可以对接S

18、python网路爬虫之Scrapy框架中的CrawlSpider详解

CrawlSpider的引入: 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效) CrawlSpider的简介: CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是"

亿牛云爬虫代理设置自主切换IP的方案

1.自主切换IP?该模式适合一些需要登陆.Cookie缓存处理等爬虫需要精确控制IP切换时机的业务. 爬虫程序可以通过设置HTTP头Proxy-Tunnel: 随机数, 当随机数相同时,访问目标网站的代理IP相同. 例如 需要登录,获取数据两个请求在一个IP下,只需对这组请求设置相同Proxy-Tunnel,例如:Proxy-Tunnel: 12345, 该组请求在代理有效期内使用相同的代理IP. 注意 同一时间不同请求组可以设置不同Proxy-Tunnel: 随机数,并发完成数据爬取. 使用相

selenium 切换iframe

# iframe -- html 内部的 html # 1. 识别:你要操作的元素,是否在 iframe 当中 F12中 查看元素绝对路径# 2. 进入iframe 中 from selenium.webdriver.common.by import Byfrom selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support imp

在linux和windows中使用selenium

一. selenium selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转.输入.点击.下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 1. 环境安装 下载安装selenium: pip install selenium 下载浏览器驱动程序: http://chromedriver.storage.googleapis.com/index.htm