Scrapy IP代理池

  如果爬虫爬取速度过快,很容易被反爬虫给禁掉IP,公司的网络,大部分的网络是一种动态分配的,对待这种情况 变化方案和设置IP代理,除了这点也要考虑网站门户的访问压力。

主要有效方案:
  1、设置IP代理池。

  2、adsl定时拨号()。
设置爬虫的 ip代理:

middlewares.py

from fake_useragent import UserAgent
class ArticlespiderMiddleware(object):
    def __init__(self,crawler):
        super(ArticlespiderMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get('RANDOM_UA_TPYE','random')

    @classmethod
    def from_crawler(cls,crawler):
        '''在初始化是调用'''
        return cls(crawler)

    def process_requests(self,request,spider):

        def get_ua():
            return getattr(self.ua,self.ua_type)

        request.headers.setdefault('User-Agent',get_ua())
        request.meta["proxy"] = "http://ip:Port"

上边只是简单的在中间件中设置了一个IP代理,但是我们需要的不是一个,所以,可以通过免费的IP代理来设置创建我们的Ip代理池:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'Fade Zhao'

import requests
from scrapy.selector import Selector
from fake_useragent import UserAgent
import MySQLdb



class GetHost(object):
    def __init__(self):
        self.conn = MySQLdb.connect(host='localhost', user='root', password='zhaoyinghan', db='fiction', charset='utf8')
        self.cursor = self.conn.cursor()
        self.headers = {}
    def insert_IP(self):
        for i in range(1, 11):
            url = 'http://www.xicidaili.com/nn/{0}'.format(i)
            agent = UserAgent().random
            self.headers = {
                'User-Agent': agent
            }
            session = requests.session()
            response = session.get(url=url, headers=self.headers)
            selector = Selector(text=response.text)

            all_trs = selector.css('#ip_list tr')
            ip_list = []
            for tr in all_trs[1:]:
                speed_str = tr.css(".bar::attr(title)").extract()[0]
                speed = 1
                if speed_str:
                    speed = float(speed_str.split('')[0])
                    if speed > 0.3:
                        continue
                td_text = tr.css("td::text").extract()
                ip = td_text[0]
                port = td_text[1]
                proxy_type = td_text[5]
                ip_list.append((ip, port, proxy_type, speed))
            print(ip_list)
            sql_str = '''INSERT INTO proxy_ip(ip,port,proxy_type,speed) 
                         VALUES(%s,%s,%s,%s) 
                         on duplicate 
                         key update port=values(port)'''
            try:
                self.cursor.executemany(sql_str, ip_list)
                self.conn.commit()
                print(i, '插完了')
            except Exception as e:
                print('插入错误', e)
                self.conn.rollback()
    def judge_ip(self,ip,port):
        '''判断ip是否可用'''
        http_url = 'https://www.baidu.com'
        proxy_url = 'http://{0}:{1}'.format(ip,port)
        try:
            proxy_dict = {
                "http":proxy_url
            }
            response = requests.get(http_url,proxies=proxy_dict,headers=self.headers)
        except Exception as e:
            print('invalid ip and port =',e)
            self.delete_ip(ip)
            return False
        else:
            code= response.status_code
            if code >= 200 and code < 300:
                print('成功代理')
                return True
            else:
                return False

    def delete_ip(self,ip):
        '''删除废弃host'''
        sql_str ='''delete from proxy_ip WHERE ip="{0}"'''.format(ip)
        self.cursor.execute(sql_str)
        self.conn.commit()

    def get_IP(self):
        sql_str = '''select ip,port from proxy_ip ORDER BY RAND() limit 1'''

        self.cursor.execute(sql_str)
        host = self.cursor.fetchone()
        ip = host[0]
        port = host[1]
        print(host)
        judge = self.judge_ip(ip,port)
        if judge:
            return "http://{0}:{0}".format(ip,port)
        else:
            self.get_IP()

middlewares.py

from ArticleSpider.utls.crawl_xiciIP import GetHost
class RandomProxyMiddleware(object):
    '''随机获取代理'''
    def process_requests(self,request,spider):
        host = GetHost()
        request.meta['proxy'] = host.get_IP()

以上就是IP代理池的设置和添加,但是我要说的是,GitHub上也已经有人给出了更多功能的IP代理吃的插件,正所谓是前任摘树,后人纳凉啊~

https://github.com/aivarsk/scrapy-proxies

 

转载于:https://www.cnblogs.com/LetMe/articles/7933612.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy是一个强大的Python爬虫框架,可以用于抓取和提取网页数据。如果你想在Scrapy中使用代理IP,可以按照以下步骤进行: 1. 首先,你需要准备一个代理IP。这可以是一个存储代理IP的数据库或者一个包含代理IP列表的文件。 2. 在Scrapy的项目中,你可以创建一个中间件来处理代理IP。中间件可以在请求发送之前或之后修改请求。你可以创建一个自定义的中间件类,在其中实现代理IP的设置。 例如,你可以创建一个名为ProxyMiddleware的中间件类,并在其中实现process_request方法,从代理IP中随机选择一个代理IP,并将其设置为请求的代理。 ```python class ProxyMiddleware(object): def process_request(self, request, spider): # 从代理IP中随机选择一个代理IP proxy = get_proxy_ip() request.meta['proxy'] = proxy ``` 3. 将中间件添加到Scrapy的配置中。在项目的settings.py文件中,找到DOWNLOADER_MIDDLEWARES配置项,并将你的中间件类添加到其中。 ```python DOWNLOADER_MIDDLEWARES = { 'your_project_name.middlewares.ProxyMiddleware': 543, # 其他中间件... } ``` 4. 现在,当Scrapy发送请求时,中间件会在请求前设置代理IP。这样,你就可以使用代理IP来爬取网页数据了。 请注意,使用代理IP需要注意合法性和稳定性。你需要确保代理IP有效,并及时更新代理IP,以免影响爬虫的正常运行。另外,使用代理IP时也需要遵守网站的相关规定,避免对目标网站造成不必要的干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值