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) 거미를 만드는 클래스 메서드입니다. 매개 변수는-
|
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...