>백엔드 개발 >파이썬 튜토리얼 >Scrapy의 링크 추출기 및 중복 제거 도구 분석

Scrapy의 링크 추출기 및 중복 제거 도구 분석

WBOY
WBOY원래의
2023-06-22 09:17:271695검색

Scrapy는 동시성, 배포, 비동기 및 기타 고급 기능을 지원하는 탁월한 Python 크롤러 프레임워크로, 개발자가 인터넷에서 데이터를 더 빠르고 안정적으로 크롤링하는 데 도움이 될 수 있습니다. Scrapy에서 링크 추출기와 중복 제거 도구는 크롤러가 자동화된 데이터 캡처 및 처리를 완료하는 데 도움을 주는 매우 중요한 구성 요소입니다. 이 기사에서는 Scrapy의 링크 추출기와 중복 제거 도구를 분석하고 구현 방법과 Scrapy 크롤링 프로세스에서의 적용 방법을 살펴봅니다.

1. 링크 추출기의 기능 및 구현

링크 추출기는 URL 링크를 자동으로 추출하는 Scrapy 크롤러 프레임워크의 도구입니다. 완전한 크롤러 프로세스에서는 웹 페이지에서 일부 URL 링크를 추출한 다음 이러한 링크를 기반으로 추가로 액세스하고 처리해야 하는 경우가 많습니다. 링크 추출기는 이 프로세스를 구현하는 데 사용되며 일부 규칙에 따라 웹 페이지에서 링크를 자동으로 추출하고 후속 처리를 위해 이러한 링크를 Scrapy의 요청 대기열에 저장할 수 있습니다.

Scrapy에서 링크 추출기는 정규식 또는 XPath 표현식을 통해 일치를 수행합니다. Scrapy는 정규식을 기반으로 하는 LinkExtractor와 XPath 표현식을 기반으로 하는 LxmlLinkExtractor라는 두 가지 링크 추출기를 제공합니다.

  1. 정규식 기반 LinkExtractor

정규식 기반 LinkExtractor는 웹 페이지의 URL에 대해 정규 일치를 수행하여 성공적으로 일치하는 링크를 자동으로 추출할 수 있습니다. 예를 들어 웹페이지에서 http://example.com/으로 시작하는 모든 링크를 추출하려면 다음 코드를 사용할 수 있습니다.

from scrapy.linkextractors import LinkExtractor

link_extractor = LinkExtractor(allow=r'^http://example.com/')
links = link_extractor.extract_links(response)

allow 매개변수는 http:/로 시작하는 모든 링크와 일치하도록 정규식을 지정합니다. /example .com/으로 시작하는 링크. extract_links() 메소드는 성공적으로 일치하는 모든 링크를 추출하여 Link 객체 목록에 저장할 수 있습니다.

Link 개체는 Scrapy 프레임워크에서 링크를 나타내는 데 사용되는 데이터 구조로, 링크의 URL, 제목, 앵커 텍스트, 링크 유형과 같은 정보가 포함되어 있습니다. 이러한 개체를 통해 필요한 링크와 추가 프로세스를 쉽게 얻고 Scrapy 크롤러에서 액세스할 수 있습니다.

  1. XPath 표현식 기반 LxmlLinkExtractor

XPath 표현식 기반 LxmlLinkExtractor는 웹 페이지의 HTML 태그에서 XPath 표현식을 일치시켜 성공적으로 일치하는 링크를 자동으로 추출할 수 있습니다. 예를 들어, 웹 페이지에서 클래스 속성이 "storylink"인 모든 링크를 추출하려는 경우 다음 코드를 사용할 수 있습니다.

from scrapy.linkextractors import LxmlLinkExtractor

link_extractor = LxmlLinkExtractor(restrict_xpaths='//a[@class="storylink"]')
links = link_extractor.extract_links(response)

restrict_xpaths 매개변수는 클래스 속성이 다음과 같은 모든 태그와 일치하도록 XPath 표현식을 지정합니다. "스토리링크" . LxmlLinkExtractor는 LinkExtractor와 유사하게 사용되며 추출된 링크를 Link 개체 목록에 저장할 수 있습니다. LxmlLinkExtractor는 HTML 구문 분석을 위해 lxml 라이브러리를 사용하므로 프로젝트 구성 파일에 다음 코드를 추가해야 합니다.

# settings.py
DOWNLOAD_HANDLERS = {
    's3': None,
}

위 코드는 Scrapy에서 기본 다운로더를 비활성화하고 lxml 라이브러리의 HTML 파서를 사용할 수 있습니다.

2. 중복제거 도구의 역할과 구현

웹을 크롤링할 때 링크 중복제거는 매우 중요합니다. 대부분의 경우 동일한 웹페이지에 대한 서로 다른 링크가 반복적으로 나타나기 때문입니다. 문제가 발생하고 대역폭과 시간이 낭비됩니다. 따라서 중복 방문을 피하기 위해 크롤링된 링크를 표시하고 판단하기 위해 Duplicate Filter가 Scrapy에 도입되었습니다.

중복 제거 도구의 원리는 방문한 URL 링크를 데이터 구조로 저장한 다음 새 URL 링크를 방문했는지 여부를 판단하는 것입니다. 방문한 경우 해당 URL 링크는 삭제되고, 그렇지 않으면 삭제됩니다. . 크롤러의 요청 대기열에 참여합니다. Scrapy에는 메모리 기반 세트 중복 제거, 디스크 기반 SQLite3 중복 제거, Redis 기반 중복 제거 등 다양한 중복 제거 도구가 내장되어 있습니다. 중복 제거기마다 적용 가능한 시나리오가 다릅니다. Redis 중복 제거기를 예로 들어 설명하겠습니다.

  1. Redis 기반 중복 제거 도구

Redis는 분산, 지속성, 풍부한 데이터 구조 등의 고급 기능을 지원할 수 있는 고성능 NoSQL 인메모리 데이터베이스로 Scrapy의 중복 제거 도구를 구현하는 데 매우 적합합니다. Scrapy의 Redis 중복 제거기는 방문한 URL 링크를 표시하여 반복 방문을 방지할 수 있습니다.

Scrapy는 기본적으로 메모리 기반 Set 클래스 중복 제거 장치를 사용합니다. Redis 중복 제거 장치를 사용해야 하는 경우 프로젝트 구성 파일에 다음 코드를 추가할 수 있습니다.

# settings.py
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_HOST = "localhost"
REDIS_PORT = 6379

그 중 DUPEFILTER_CLASS 매개변수는 중복 제거 도구를 지정합니다. 복제 전략을 사용하기 위해 여기서는 Redis의 설정된 데이터 구조를 기반으로 구현된 scrapy_redis.dupefilter.RFPDupeFilter를 사용합니다.

SCHEDULER 매개변수는 스케줄러가 사용하는 스케줄링 전략을 지정합니다. 여기서는 Redis의 정렬된 집합 데이터 구조를 기반으로 구현된 scrapy_redis.scheduler.Scheduler를 사용합니다.

SCHEDULER_PERSIST 매개변수는 스케줄러가 Redis에서 유지되어야 하는지 여부, 즉 이미 크롤링된 URL을 다시 크롤링하지 않도록 마지막 크롤링 상태를 저장해야 하는지 여부를 지정합니다.

REDIS_HOST 및 REDIS_PORT 매개변수는 각각 Redis 데이터베이스의 IP 주소와 포트 번호를 지정합니다. Redis 데이터베이스가 로컬이 아닌 경우 해당 IP 주소를 설정해야 합니다.

使用Redis去重器之后,需要在爬虫中添加redis_key参数,用来指定Redis中保存URL链接的key名。例如:

# spider.py
class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    custom_settings = {
        'REDIS_HOST': 'localhost',
        'REDIS_PORT': 6379,
        'DUPEFILTER_CLASS': 'scrapy_redis.dupefilter.RFPDupeFilter',
        'SCHEDULER': 'scrapy_redis.scheduler.Scheduler',
        'SCHEDULER_PERSIST': True,
        'SCHEDULER_QUEUE_CLASS': 'scrapy_redis.queue.SpiderPriorityQueue',
        'REDIS_URL': 'redis://user:pass@localhost:6379',
        'ITEM_PIPELINES': {
            'scrapy_redis.pipelines.RedisPipeline': 400,
        },
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
            'scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware': 500,
        },
        'FEED_URI': 'result.json',
        'FEED_FORMAT': 'json',
        'LOG_LEVEL': 'INFO',
        'SPIDER_MIDDLEWARES': {
            'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 300,
        }
    }

    def __init__(self, *args, **kwargs):
        domain = kwargs.pop('domain', '')
        self.allowed_domains = filter(None, domain.split(','))
        self.redis_key = '%s:start_urls' % self.name
        super(MySpider, self).__init__(*args, **kwargs)

    def parse(self, response):
        pass

以上是一个简单的爬虫示例,redis_key参数指定了在Redis中保存URL链接的键名为myspider:start_urls。在parse()方法中,需要编写自己的网页解析代码,提取出需要的信息。

三、总结

链接提取器和去重工具是Scrapy爬虫框架中非常重要的组件,它们可以大大简化我们编写爬虫的工作,并提高爬虫的效率。在使用Scrapy爬虫时,我们可以根据自己的需求选择不同的链接提取器和去重工具,从而实现更为高效和灵活的爬虫功能。

위 내용은 Scrapy의 링크 추출기 및 중복 제거 도구 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.