DI logo and Scrapy logo

Web scraping’i hızlandırırken anti-bot sistemlerini tetiklememek, işlevsel scraping araçları gerektirir. Scrapy en yaygın kullanılan araçlardan biridir. Neden dikkatinize değer olduğunu ve nasıl etkili kullanacağınızı öğrenmek için okumaya devam edin.

Scrapy nedir ve size sunduğu avantajlar nelerdir?

Scrapy açık kaynaklı bir Python web crawling çerçevesidir. Popüler olmasının nedenleri arasında şunlar bulunur:

  • Birden fazla istekle aynı anda başa çıkabilme yeteneği, bu yüzden web scraping daha az zaman alır
  • Kodu bakımda tutma gereksiniminin olmaması
  • Büyük ölçekli projeler için uygun
  • Kullanıcı aracısı rotasyonu ekleme, yeniden denemeleri işleme ve proxy’leri yönetme gibi istek ve yanıt işleme özelleştirmelerine olanak tanır.
  • JavaScript ağırlıklı web siteleriyle iyi çalışır; sunucuları aşırı yüklememek için istek gecikmesi ve otomatik hız sınırlama gibi özellikler sunar. 
  • Yerleşik bir öğe işlem hattı sunar; böylece verileri JSON, CSV ve XML gibi farklı formatlarda çıkarabilir, depolayabilir ve kaydedebilirsiniz.
  • CSS seçicileri ve XPath ifadeleriyle gelir; tam olarak gereken HTML öğelerini çıkarmanıza olanak tanır. 

Kendinizi tüm Scrapy özellikleriyle tanımak, onu ziyaret etmek Resmi belgelerBu makalede, Scrapy’i nasıl kullanacağınıza odaklanacağız. Biz ziyaret edeceğiz Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Blog Ve tüm makale başlıklarını size aracın nasıl çalıştığını göstermek için kazın. 

Web scraping engellenme riski taşıdığından, crawling araçlarını proxy’lerle birlikte kullanmak yeni bir yaklaşım değildir. Bu eğitimde Scrapy’yi nasıl kurup özelleştireceğinizi ve proxy’leri nasıl uygulayacağınızı göstereceğiz. 

Hazırlık 

Başlamadan önce, gerekli tüm programları ve araçlarınız olmasını sağlayın. Bu öğretici için ihtiyacımız var: 

  • Visual Studio Code (veya başka IDE bu Python) destekler 
  • Python ( Davamızda 3.10.0)
  • pip ( 25.0.1)

VS Code İşte burada burada ve Python’i ondan yüklemek Resmi web sitesi. Boruunuz yoksa ( otomatik olarak Python sürüm 3.4 ve daha sonra dahil edilir), Defterinizi açın ve bu kodu bir dosya numarasına saklayın.py:


import urllib.request
import os
import sys

try:
    # download get-pip.py
    url = "https://bootstrap.pypa.io/get-pip.py"
    urllib.request.urlretrieve(url, "get-pip.py")

    # install pip
    os.system(f"{sys.executable} get-pip.py")
finally:
    # remove the script
    if os.path.exists("get-pip.py"):
        os.remove("get-pip.py")

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Ardından Komut İstemi’ni açın ve dosyayı kaydettiğiniz klasöre gidin:


cd path/to/your/file

      
        
      

Örneğin, Belge klasöründe bir dosyayı kurtardık, bu yüzden komutumuz gibi görünecekti cd/Documents.

Bundan sonra, aşağıdaki komutu çalıştırın:


python get-pip.py

      
        
      

pip’in düzgün çalışıp çalışmadığını denetlemek için şu komutu kullanın:


pip --version

      
        
      

Şimdi, her şeyin hazır olduğunda, başlayalım.

Scrapy’yi kurma ve proje başlatma

Öncelikle Scrapy’yi kurmamız gerekiyor. Bunun için Komut İstemi’ni açın veya VS Code terminalini kullanın ve şu komutu çalıştırın:


pip install Scrapy

      
        
      

Not: Tüm gerekli araçları yüklediyseniz ancak VS Code terminalinde “pip terimi bir cmdlet, işlev, betik dosyası veya çalıştırılabilir program adı olarak tanınmıyor” işareti veya VS Code terminalinde diğer hataları görmeye devam ederseniz, VS Code ayarlarını ayarlamaya çalışın. Terminal&gt’a gidin;Integrated: Varsayılan Profil ( Arama çubuğuna entegre edilebilir) varsayılan profili hızlı bir şekilde değiştirin ve VS Code’u yeni ayarları etkinleştirin.

Bir projeye başlamak için, VS Code terminalinde proje klasörüne gidin. Bizim durumumuzda, klasör Project S olarak adlandırılır ve Belge klasöründe bulunur, bu yüzden biz türüz cd Belgeler / Proje S.

Sonra, bu komut türü:


scrapy startproject your_project_name

      
        
      

Değiştirmek için emin olun your project name Gerçek bir isimle. Örneğin, kullanırız dataimpulse blog.

Sonraki, proje klasörüne gidin:


cd your_project_name

      
        
      

Orada olduğunuzda, bu komutu bir örümcek oluşturmak için kullanın:


scrapy genspider your_spider_name url_domain

      
        
      

Bizim durumumuzda, komut gibi görünüyor Blog titles dataimpulse.com

Kodu düzenleme

VS Code veya Dosya Gezgini ile proje klasörünüzü açın, orada birkaç Python dosyaları göreceksiniz. Gerekli verileri kazımak için onları değiştirmemiz gerekiyor.

İlk olarak, ilk olarak, “spiders” klasörü, açık blog titles.py Ve mevcut kodunu bununla değiştirin:


import scrapy


class BlogTitlesSpider(scrapy.Spider):
    name = 'blog_titles'
    allowed_domains = ['dataimpulse.com']
    start_urls = ['https://dataimpulse.com/blog/']
    def parse(self, response):
        self.logger.info(f"Visited {response.url}")

       
        titles = response.css('h3.blog-title a::text').getall()
        for title in titles:
            yield {'title': title.strip()}

       
        next_page = response.css('a.next::attr(href)').get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

İşte, kazınmanız gereken sayfayı ve toplamak istediğiniz verileri tanımlarsınız (Yazılar, bu durumda). Ayrıca parse yöntemi değiştirirsiniz.

Sonraki, açık Ortawares.py ve aşağıdaki kodu orada yapıştırın:


# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html

from scrapy import signals

# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter


class BlogscraperSpiderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # Called for each response that goes through the spider
        # middleware and into the spider.

        # Should return None or raise an exception.
        return None

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.

        # Must return an iterable of Request, or item objects.
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.

        # Should return either None or an iterable of Request or item objects.
        pass
    
    def process_start_requests(self, start_requests, spider):
        # Called with the start requests of the spider, and works
        # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.

        # Must return only requests (not items).
        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)


class BlogscraperDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        request.meta['proxy'] = spider.settings.get('http://login:password@hostname:port')

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

81 çizgiye dikkat edin. İşte, gerçek kimliklerinizi gerçek ayrıntılarınızda yazmanız gerekir http://login:password@hostname:port format. Onları almak için, DataImpulse panelinizde gerekli plana gidin. Sağ üst köşedeki proxy formatını değiştirmeyi unutmayın. Zorluklarınız varsa, kullanımımızı kullanmaktan çekinmeyin DataImpulse hesabınızı yönetmek için kılavuz.

Son olarak, git ayarlar.pypy Ve bunun gibi göründüğünden emin olun:


# Scrapy settings for blogscraper project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = "dataimpulse_blog"

SPIDER_MODULES = ["dataimpulse_blog.spiders"]
NEWSPIDER_MODULE = "dataimpulse_blog.spiders"


# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = "blogscraper (+http://www.yourdomain.com)"

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

# Enable the downloader middlewares
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'dataimpulse_blog.middlewares.BlogscraperSpiderMiddleware': 543,  # Add your ProxyMiddleware here
}

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
#    "Accept-Language": "en",
#}

# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    "blogscraper.middlewares.BlogscraperSpiderMiddleware": 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    "blogscraper.middlewares.BlogscraperDownloaderMiddleware": 543,
#}

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    "scrapy.extensions.telnet.TelnetConsole": None,
#}

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
#ITEM_PIPELINES = {
#    "blogscraper.pipelines.BlogscraperPipeline": 300,
#}

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = "httpcache"
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = "scrapy.extensions.httpcache.FilesystemCacheStorage"

# Set settings whose default value is deprecated to a future-proof value
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"

      
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
      

Burada, önbellekleme, cookie’ler, işlem hatları, vb. gibi diğer parametreleri açıklayın.

Şimdi en önemli adıma geldik. Terminali açın ve şunu yazın: cd Projenizin kök dizininde olduğunuzdan emin olmak (dataimpulse blog Bizim durumumuzda; içeren bir klasör aramak zorundasınız Kazı.cfg Dosya – bu kök rehberi. Sonra, aşağıdaki komutu kullanın:


scrapy crawl blog_titles -o titles.json

      
        
      

Bu, örümcekünüzü çalıştıracak ve tüm sonuçları bir dosyada kurtaracak Başlıklar.jsonVS Code’de dosyayı açarak sonuçları kontrol edebilirsiniz. Sahip olduğumuz şey budur:

Artık işlemi tamamladınız! Gördüğünüz gibi, Scrapy kullanımı kolaydır. Gerekli ayrıntıları ayarlayabilir ve en iyi sonuçlar için proxy’leri kullanabilirsiniz. Elbette, proxy seçimi de önemlidir. DataImpulse size yasal olarak konut, veri merkezi ve ücretli fiyat modelinde mobil proxy sunuyor. Bütçenizi yorulmadan evrensel ihtiyaçlar için beyaz listelenmiş IP’ler var. Bizimle başlayın “Şimdi deneyin” düğme ya da bize yazın [email protected].

Share article: