파충류Python 네트워크 파충류의 Scrapy 프레임워크(CrawlSpider)

19338 단어

파충류Python 네트워크 파충류의 Scrapy 프레임워크(CrawlSpider)


끌어들이다
질문: 파충류 프로그램을 통해'괴백'전역 데이터 뉴스 데이터를 얻으려면 몇 가지 실현 방법이 있습니까?
방법1: Scrapy 프레임워크에서 Spider의 반복 기어오르기를 기반으로 수행(Request 모듈 변환 parse 방법).
방법2: CrawlSpider의 자동 기어오르기를 바탕으로 실현(더욱 간결하고 효율적).
오늘의 개요
  • CrawlSpider 소개
  • CrawlSpider 사용
  • CrawlSpider 파충류 파일 기반 생성
  • 링크 추출기
  • 규칙 해석기

  • 오늘 상세한 상황
    하나.소개
    Crawl Spider는 사실 Spider의 하위 클래스로 Spider의 특성과 기능을 계승하는 것 외에 자신만의 더욱 강력한 특성과 기능을 파생시킨다.그 중에서 가장 현저한 기능은 바로 "LinkExtractors 링크 추출기"입니다. Spider는 모든 파충류의 기본 클래스입니다. 그 설계 원칙은 start_url 목록에서 웹 페이지를 추출하기 위한 것입니다. 추출된 웹 페이지에서 추출한 URL을 계속 추출하는 작업은 Crawl Spider를 사용하는 것이 더 적합합니다.
    2.활용단어참조
    1. scrapy 프로젝트 만들기: scrapy startproject projectName
    2. 파충류 파일 만들기:scrapy genspider -t crawl spiderName www.xx.com
    - 이 명령은 이전의 명령에 비해 "-tcrawl"이 많습니다. 생성된 파충류 파일은 CrawlSpider 클래스를 기반으로 하고 더 이상 Spider 클래스가 아니라는 것을 의미합니다.
    3. 생성된 파충류 파일 관찰
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    
    class ChoutidemoSpider(CrawlSpider):
        name = 'choutiDemo'
        #allowed_domains = ['www.chouti.com']
        start_urls = ['http://www.chouti.com/']
    
        rules = (
            Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            i = {}
            #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
            #i['name'] = response.xpath('//div[@id="name"]').extract()
            #i['description'] = response.xpath('//div[@id="description"]').extract()
            return i
    

    - 2, 3행: CrawlSpider 관련 모듈 가져오기
    - 7행: 이 파충류 프로그램이 CrawlSpider 클래스에 기반하고 있음을 나타냅니다.
    - 12, 13, 14 행: 링크 규칙 추출
    - 16행: 분석 방법
    CrawlSpider 클래스와 Spider 클래스의 가장 큰 차이점은 CrawlSpider에 rules 속성이 하나 더 생겼다는 것입니다. 그 역할은'추출 동작'을 정의하는 것입니다. rules에는 하나 이상의 Rule 대상이 포함될 수 있으며, Rule 대상에는 LinkExtractor 대상이 포함됩니다.
    3.1 LinkExtractor: 말 그대로 링크 추출기입니다.
    LinkExtractor(
    allow=r'Items/', # 괄호에 있는'정칙 표현식'값을 충족시키면 추출되고, 비어 있으면 모두 일치합니다.
    deny=xxx,#정규 표현식을 만족시키면 추출되지 않습니다.
    restrict_xpaths = xxx, # xpath 표현식 충족 값이 추출됩니다.
    restrict_css=xxx, # css 표현식을 만족시키는 값은 추출됩니다
    deny_domains = xxx, # 추출되지 않은 링크의domains.
        )
    

    - 역할: response에서 규칙에 맞는 링크를 추출합니다.
    3.2 Rule: 규칙 해석기.링크 추출기에서 추출한 링크에 따라 지정한 규칙에 따라 분석기 링크 웹 페이지의 내용을 추출합니다.
    Rule(LinkExtractor(allow=r’Items/’), callback=‘parse_item’, follow=True)
    - 매개변수 설명:
    매개 변수 1: 링크 추출기 지정
    매개 변수 2: 규칙 해석기 해석 데이터의 규칙을 지정합니다 (리셋 함수)
    매개 변수 3: 링크 추출기를 링크 추출기에서 추출한 링크 페이지에 계속 사용할지 여부.callback이 None이면 매개 변수 3의 기본값은true입니다.
    3.3 rules=(): 서로 다른 규칙 해석기를 지정합니다.Rule 객체는 추출 규칙을 나타냅니다.
    3.4 CrawlSpider 전체 기어오르기 프로세스:
    a) 파충류 파일은 우선 시작 URL에 따라 이 URL의 웹 페이지 내용을 가져옵니다.
    b) 링크 추출기는 지정한 추출 규칙에 따라 단계 a의 웹 내용에 있는 링크를 추출합니다
    c) 규칙 해석기는 지정한 해석 규칙에 따라 링크 추출기에서 추출한 링크의 웹 내용을 지정한 규칙에 따라 해석한다
    d) 분석 데이터를 item에 봉인하여 파이프에 제출하여 영구화 저장
    4. 단순 코드 실전 응용
    4.1 괴사 백과 괴도 판의 모든 페이지 데이터
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    
    class CrawldemoSpider(CrawlSpider):
        name = 'qiubai'
        #allowed_domains = ['www.qiushibaike.com']
        start_urls = ['https://www.qiushibaike.com/pic/']
    
        # : url url
        link = LinkExtractor(allow=r'/pic/page/\d+\?') #s= 
        link1 = LinkExtractor(allow=r'/pic/$')# 
        #rules ( )
        rules = (
            # : ( ) 
            Rule(link, callback='parse_item', follow=True),
            Rule(link1, callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            print(response)
            
    

    4.2 파충류 파일:
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from qiubaiBycrawl.items import QiubaibycrawlItem
    import re
    class QiubaitestSpider(CrawlSpider):
        name = 'qiubaiTest'
        # url
        start_urls = ['http://www.qiushibaike.com/']
    
        # , 
        page_link = LinkExtractor(allow=r'/8hr/page/\d+/')
        
        rules = (
            # , callback 
            Rule(page_link, callback='parse_item', follow=True),
        )
    
        # 
        def parse_item(self, response):
            div_list = response.xpath('//div[@id="content-left"]/div')
            
            for div in div_list:
                # item
                item = QiubaibycrawlItem()
                # xpath 
                item['author'] = div.xpath('./div/a[2]/h2/text()').extract_first().strip('
    '
    ) # xpath item['content'] = div.xpath('.//div[@class="content"]/span/text()').extract_first().strip('
    '
    ) yield item # item

    4.2 item 파일:
    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class QiubaibycrawlItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        author = scrapy.Field() # 
        content = scrapy.Field() # 
    

    4.3 파이핑 파일:
    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    class QiubaibycrawlPipeline(object):
        
        def __init__(self):
            self.fp = None
            
        def open_spider(self,spider):
            print(' ')
            self.fp = open('./data.txt','w')
            
        def process_item(self, item, spider):
            # item 
            self.fp.write(item['author']+':'+item['content']+'
    '
    ) return item def close_spider(self,spider): print(' ') self.fp.close() ocess_item(self, item, spider): # item self.fp.write(item['author']+':'+item['content']+'
    '
    ) return item def close_spider(self,spider): print(' ') self.fp.close()

    좋은 웹페이지 즐겨찾기