Scrapy-거미

기술

Spider는 웹 사이트를 통해 링크를 따라 가고 페이지에서 정보를 추출하는 방법을 정의하는 클래스입니다.

Scrapy의 기본 스파이더는 다음과 같습니다.

스크래피. 거미

다른 모든 거미가 물려 받아야하는 거미입니다. 그것은 다음과 같은 클래스가 있습니다-

class scrapy.spiders.Spider

다음 표는 scrapy.Spider 클래스의 필드를 보여줍니다-

Sr. 아니요 필드 및 설명
1

name

거미의 이름입니다.

2

allowed_domains

스파이더가 크롤링하는 도메인 목록입니다.

start_urls

이는 스파이더가 크롤링을 시작하는 나중에 크롤링의 루트가 될 URL 목록입니다.

4

custom_settings

이러한 설정은 스파이더를 실행할 때 프로젝트 전체 구성에서 재정의됩니다.

5

crawler

스파이더 인스턴스가 바인딩 된 크롤러 개체에 연결하는 속성입니다.

6

settings

스파이더를 실행하기위한 설정입니다.

7

logger

로그 메시지를 보내는 데 사용되는 Python 로거입니다.

8

from_crawler(crawler,*args,**kwargs)

거미를 만드는 클래스 메서드입니다. 매개 변수는-

  • crawler − 스파이더 인스턴스가 바인딩 될 크롤러.

  • args(list)− 이러한 인수는 _init_ () 메서드에 전달됩니다 .

  • kwargs(dict)− 이러한 키워드 인수는 _init_ () 메서드에 전달됩니다 .

9

start_requests()

특정 URL이 지정되지 않고 스파이더가 스크랩을 위해 열리면 Scrapy는 start_requests () 메서드를 호출합니다 .

10

make_requests_from_url(url)

URL을 요청으로 변환하는 데 사용되는 방법입니다.

11

parse(response)

이 메서드는 응답을 처리하고 더 많은 URL을 따라 스크랩 된 데이터를 반환합니다.

12

log(message[,level,component])

스파이더 로거를 통해 로그 메시지를 보내는 방법입니다.

13

closed(reason)

이 메서드는 스파이더가 닫힐 때 호출됩니다.

스파이더 인수

스파이더 인수는 시작 URL을 지정하는 데 사용되며 다음과 함께 crawl 명령을 사용하여 전달됩니다. -a 다음과 같이 표시된 옵션-

scrapy crawl first_scrapy -a group = accessories

다음 코드는 스파이더가 인수를받는 방법을 보여줍니다.

import scrapy 

class FirstSpider(scrapy.Spider): 
   name = "first" 
   
   def __init__(self, group = None, *args, **kwargs): 
      super(FirstSpider, self).__init__(*args, **kwargs) 
      self.start_urls = ["http://www.example.com/group/%s" % group]

일반 거미

일반 스파이더를 사용하여 스파이더의 하위 클래스를 만들 수 있습니다. 그들의 목표는 모든 페이지에서 데이터를 추출하기 위해 특정 규칙에 따라 웹 사이트의 모든 링크를 따르는 것입니다.

다음 스파이더에 사용 된 예제를 위해 다음 필드가있는 프로젝트가 있다고 가정 해 보겠습니다.

import scrapy 
from scrapy.item import Item, Field 
  
class First_scrapyItem(scrapy.Item): 
   product_title = Field() 
   product_link = Field() 
   product_description = Field()

CrawlSpider

CrawlSpider는 링크를 따르고 둘 이상의 페이지를 스크랩하기위한 일련의 규칙을 정의합니다. 그것은 다음과 같은 클래스가 있습니다-

class scrapy.spiders.CrawlSpider

다음은 CrawlSpider 클래스의 속성입니다-

규칙

크롤러가 링크를 따르는 방법을 정의하는 규칙 객체 목록입니다.

다음 표는 CrawlSpider 클래스의 규칙을 보여줍니다-

Sr. 아니요 규칙 및 설명
1

LinkExtractor

스파이더가 링크를 따라 가고 데이터를 추출하는 방법을 지정합니다.

2

callback

각 페이지가 스크랩 된 후 호출됩니다.

follow

링크를 계속 따라 갈지 여부를 지정합니다.

parse_start_url (응답)

초기 응답 구문 분석을 허용하여 항목 또는 요청 객체를 반환합니다.

Note − 구문 분석 기능은 CrawlSpider에서 논리를 구현하는 데 사용되므로 규칙을 작성하는 동안 구문 분석 이외의 구문 분석 기능의 이름을 변경해야합니다.

스파이더가 demoexample.com의 홈페이지를 크롤링하고 parse_items 메소드를 사용하여 모든 페이지, 링크 및 구문 분석을 수집하는 다음 예를 살펴 보겠습니다.

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DemoSpider(CrawlSpider):
   name = "demo"
   allowed_domains = ["www.demoexample.com"]
   start_urls = ["http://www.demoexample.com"]
      
   rules = ( 
      Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
         callback = "parse_item", follow = True),
   )
   
   def parse_item(self, response):
      item = DemoItem()
      item["product_title"] = response.xpath("a/text()").extract()
      item["product_link"] = response.xpath("a/@href").extract()
      item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
      return items

XMLFeedSpider

XML 피드에서 스크래핑하고 노드를 반복하는 스파이더의 기본 클래스입니다. 그것은 다음과 같은 클래스가 있습니다-

class scrapy.spiders.XMLFeedSpider

다음 표는 반복기와 태그 이름을 설정하는 데 사용되는 클래스 속성을 보여줍니다.

Sr. 아니요 속성 및 설명
1

iterator

사용할 반복자를 정의합니다. iternodes, html 또는 xml 수 있습니다 . 기본값은 iternodes 입니다.

2

itertag

반복 할 노드 이름이있는 문자열입니다.

namespaces

register_namespace () 메서드를 사용하여 네임 스페이스를 자동으로 등록하는 (prefix, uri) 튜플 목록으로 정의됩니다 .

4

adapt_response(response)

스파이더가 파싱을 시작하기 전에 응답을 수신하고 스파이더 미들웨어에서 도착하자마자 응답 본문을 수정합니다.

5

parse_node(response,selector)

제공된 태그 이름과 일치하는 각 노드에 대해 호출 될 때 응답 및 선택기를 수신합니다.

Note −이 방법을 무시하지 않으면 스파이더가 작동하지 않습니다.

6

process_results(response,results)

스파이더가 반환 한 결과 및 응답 목록을 반환합니다.

CSVFeedSpider

각 행을 반복하고 응답으로 CSV 파일을 수신하며 parse_row () 메소드를 호출합니다 . 그것은 다음과 같은 클래스가 있습니다-

class scrapy.spiders.CSVFeedSpider

다음 표는 CSV 파일에 대해 설정할 수있는 옵션을 보여줍니다.

Sr. 아니요 옵션 및 설명
1

delimiter

각 필드에 대해 쉼표 ( ',') 구분 기호를 포함하는 문자열입니다.

2

quotechar

각 필드에 대해 따옴표 ( ' "')를 포함하는 문자열입니다.

headers

필드를 추출 할 수있는 명령문 목록입니다.

4

parse_row(response,row)

헤더에 대한 키와 함께 응답과 각 행을 수신합니다.

CSVFeedSpider 예제

from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem  

class DemoSpider(CSVFeedSpider): 
   name = "demo" 
   allowed_domains = ["www.demoexample.com"] 
   start_urls = ["http://www.demoexample.com/feed.csv"] 
   delimiter = ";" 
   quotechar = "'" 
   headers = ["product_title", "product_link", "product_description"]  
   
   def parse_row(self, response, row): 
      self.logger.info("This is row: %r", row)  
      item = DemoItem() 
      item["product_title"] = row["product_title"] 
      item["product_link"] = row["product_link"] 
      item["product_description"] = row["product_description"] 
      return item

SitemapSpider

Sitemaps 의 도움으로 SitemapSpider 는 robots.txt에서 URL을 찾아 웹 사이트를 크롤링합니다. 그것은 다음과 같은 클래스가 있습니다-

class scrapy.spiders.SitemapSpider

다음 표는 SitemapSpider의 필드를 보여줍니다-

Sr. 아니요 필드 및 설명
1

sitemap_urls

사이트 맵을 가리키는 크롤링 할 URL 목록입니다.

2

sitemap_rules

튜플 (정규식, 콜백)의 목록입니다. 여기서 regex는 정규식이고 콜백은 정규식과 일치하는 URL을 처리하는 데 사용됩니다.

sitemap_follow

따라야 할 사이트 맵의 정규식 목록입니다.

4

sitemap_alternate_links

단일 URL에 대해 따라야 할 대체 링크를 지정합니다.

SitemapSpider 예

다음 SitemapSpider는 모든 URL을 처리합니다-

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"]  
   
   def parse(self, response): 
      # You can scrap items here

다음 SitemapSpider는 콜백으로 일부 URL을 처리합니다-

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"] 
   
   rules = [ 
      ("/item/", "parse_item"), 
      ("/group/", "parse_group"), 
   ]  
   
   def parse_item(self, response): 
      # you can scrap item here  
   
   def parse_group(self, response): 
      # you can scrap group here

다음 코드는 URL이 다음과 같은 robots.txt의 사이트 맵을 보여줍니다. /sitemap_company

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ] 
   sitemap_follow = ["/sitemap_company"]  
   
   def parse_company(self, response): 
      # you can scrap company here

다음 명령에 표시된대로 SitemapSpider를 다른 URL과 결합 할 수도 있습니다.

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ]  
   
   other_urls = ["http://www.demoexample.com/contact-us"] 
   def start_requests(self): 
      requests = list(super(DemoSpider, self).start_requests()) 
      requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] 
      return requests 

   def parse_company(self, response): 
      # you can scrap company here... 

   def parse_other(self, response): 
      # you can scrap other here...