詳解基于Scrapy的IP代理池搭建-創(chuàng)新互聯(lián)

一、為什么要搭建爬蟲代理池

創(chuàng)新互聯(lián)公司是一家集成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站頁(yè)面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站制作公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁(yè)面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠(chéng)信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場(chǎng)環(huán)境中,互促共生。

在眾多的網(wǎng)站防爬措施中,有一種是根據(jù)ip的訪問頻率進(jìn)行限制,即在某一時(shí)間段內(nèi),當(dāng)某個(gè)ip的訪問次數(shù)達(dá)到一定的閥值時(shí),該ip就會(huì)被拉黑、在一段時(shí)間內(nèi)禁止訪問。

應(yīng)對(duì)的方法有兩種:

1. 降低爬蟲的爬取頻率,避免IP被限制訪問,缺點(diǎn)顯而易見:會(huì)大大降低爬取的效率。

2. 搭建一個(gè)IP代理池,使用不同的IP輪流進(jìn)行爬取。

二、搭建思路

1、從代理網(wǎng)站(如:西刺代理、快代理、云代理、無憂代理)爬取代理IP;

2、驗(yàn)證代理IP的可用性(使用代理IP去請(qǐng)求指定URL,根據(jù)響應(yīng)驗(yàn)證代理IP是否生效);

3、將可用的代理IP保存到數(shù)據(jù)庫(kù);

在《Python爬蟲代理池搭建》一文中我們已經(jīng)使用Python的 requests 模塊簡(jiǎn)單實(shí)現(xiàn)了一個(gè)IP代理池搭建,但是爬取速度較慢。由于西刺代理、快代理和云代理等網(wǎng)站需要爬取的IP代理列表頁(yè)多達(dá)上千頁(yè),使用此種方法來爬取其實(shí)并不適合。

本文將以快代理網(wǎng)站的IP代理爬取為例,示例如何使用 Scrapy-Redis 來爬取代理IP。

三、搭建代理池

scrapy 項(xiàng)目的目錄結(jié)構(gòu)如下:

詳解基于Scrapy的IP代理池搭建

items.py

# -*- coding: utf-8 -*-
import re
import scrapy
from proxy_pool.settings import PROXY_URL_FORMATTER

schema_pattern = re.compile(r'http|https$', re.I)
ip_pattern = re.compile(r'^([0-9]{1,3}.){3}[0-9]{1,3}$', re.I)
port_pattern = re.compile(r'^[0-9]{2,5}$', re.I)


class ProxyPoolItem(scrapy.Item):
  # define the fields for your item here like:
  # name = scrapy.Field()
  '''
    {
      "schema": "http", # 代理的類型
      "ip": "127.0.0.1", # 代理的IP地址
      "port": "8050", # 代理的端口號(hào)
      "original":"西刺代理",
      "used_total": 11, # 代理的使用次數(shù)
      "success_times": 5, # 代理請(qǐng)求成功的次數(shù)
      "continuous_failed": 3, # 使用代理發(fā)送請(qǐng)求,連續(xù)失敗的次數(shù)
      "created_time": "2018-05-02" # 代理的爬取時(shí)間
    }
  '''
  schema = scrapy.Field()
  ip = scrapy.Field()
  port = scrapy.Field()
  original = scrapy.Field()
  used_total = scrapy.Field()
  success_times = scrapy.Field()
  continuous_failed = scrapy.Field()
  created_time = scrapy.Field()

  # 檢查IP代理的格式是否正確
  def _check_format(self):
    if self['schema'] is not None and self['ip'] is not None and self['port'] is not None:
      if schema_pattern.match(self['schema']) and ip_pattern.match(self['ip']) and port_pattern.match(
          self['port']):
        return True
    return False

  # 獲取IP代理的url
  def _get_url(self):
    return PROXY_URL_FORMATTER % {'schema': self['schema'], 'ip': self['ip'], 'port': self['port']}

分享文章:詳解基于Scrapy的IP代理池搭建-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article42/dpoeec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、企業(yè)建站、外貿(mào)建站云服務(wù)器、定制開發(fā)標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司