스크래피-쉘

기술

Scrapy 셸을 사용하면 스파이더를 사용하지 않고 오류없는 코드로 데이터를 스크랩 할 수 있습니다. Scrapy 셸의 주요 목적은 추출 된 코드, XPath 또는 CSS 표현식을 테스트하는 것입니다. 또한 데이터를 스크랩 할 웹 페이지를 지정하는 데 도움이됩니다.

셸 구성

쉘은 자동 완성, 색상 화 된 출력 등을 제공하는 강력한 대화 형 쉘인 IPython (대화 형 컴퓨팅에 사용됨) 콘솔 을 설치하여 구성 할 수 있습니다 .

Unix 플랫폼에서 작업하는 경우 IPython을 설치하는 것이 좋습니다. IPython에 액세스 할 수없는 경우 bpython 을 사용할 수도 있습니다 .

SCRAPY_PYTHON_SHELL이라는 환경 변수를 설정하거나 다음과 같이 scrapy.cfg 파일을 정의하여 쉘을 구성 할 수 있습니다.

[settings]
shell = bpython

셸 시작

Scrapy 셸은 다음 명령을 사용하여 시작할 수 있습니다.

scrapy shell <url>

URL의 URL이있는 데이터가 필요로 지정 긁어한다.

셸 사용

셸은 다음 표에 설명 된대로 몇 가지 추가 단축키와 Scrapy 객체를 제공합니다.

사용 가능한 단축키

Shell은 프로젝트에서 다음과 같은 사용 가능한 바로 가기를 제공합니다.

Sr. 아니요 바로 가기 및 설명
1

shelp()

도움말 옵션과 함께 사용 가능한 개체 및 바로 가기를 제공합니다.

2

fetch(request_or_url)

요청 또는 URL에서 응답을 수집하고 관련 개체가 올바르게 업데이트됩니다.

view(response)

관찰을 위해 로컬 브라우저에서 주어진 요청에 대한 응답을보고 외부 링크를 올바르게 표시 할 수 있으며 응답 본문에 기본 태그를 추가합니다.

사용 가능한 스크래피 개체

Shell은 프로젝트에서 다음과 같은 사용 가능한 Scrapy 개체를 제공합니다.

Sr. 아니요 개체 및 설명
1

crawler

현재 크롤러 개체를 지정합니다.

2

spider

현재 URL에 대한 스파이더가 없으면 새 스파이더를 정의하여 URL 또는 스파이더 개체를 처리합니다.

request

마지막으로 수집 된 페이지에 대한 요청 개체를 지정합니다.

4

response

마지막으로 수집 된 페이지에 대한 응답 개체를 지정합니다.

5

settings

현재 Scrapy 설정을 제공합니다.

쉘 세션의 예

scrapy.org 사이트를 스크랩 한 다음 설명 된대로 reddit.com에서 데이터 스크랩을 시작하겠습니다.

계속 진행하기 전에 먼저 다음 명령과 같이 셸을 시작합니다.

scrapy shell 'http://scrapy.org' --nolog

Scrapy는 위의 URL을 사용하는 동안 사용 가능한 개체를 표시합니다-

[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
[s]   item       {}
[s]   request    <GET http://scrapy.org >
[s]   response   <200 http://scrapy.org >
[s]   settings   <scrapy.settings.Settings object at 0x2bfd650>
[s]   spider     <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s]   shelp()           Provides available objects and shortcuts with help option
[s]   fetch(req_or_url) Collects the response from the request or URL and associated 
objects will get update
[s]   view(response)    View the response for the given request

다음으로 다음과 같이 객체 작업을 시작합니다.

>> response.xpath('//title/text()').extract_first() 
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'  
>> fetch("http://reddit.com") 
[s] Available Scrapy objects: 
[s]   crawler     
[s]   item       {} 
[s]   request     
[s]   response   <200 https://www.reddit.com/> 
[s]   settings    
[s]   spider      
[s] Useful shortcuts: 
[s]   shelp()           Shell help (print this help) 
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects 
[s]   view(response)    View response in a browser  
>> response.xpath('//title/text()').extract() 
[u'reddit: the front page of the internet']  
>> request = request.replace(method="POST")  
>> fetch(request) 
[s] Available Scrapy objects: 
[s]   crawler     
...

스파이더에서 셸을 호출하여 응답 검사

해당 응답을받을 것으로 예상되는 경우에만 스파이더에서 처리 된 응답을 검사 할 수 있습니다.

예를 들어-

import scrapy 

class SpiderDemo(scrapy.Spider): 
   name = "spiderdemo" 
   start_urls = [ 
      "http://mysite.com", 
      "http://mysite1.org", 
      "http://mysite2.net", 
   ]  
   
   def parse(self, response): 
      # You can inspect one specific response 
      if ".net" in response.url: 
         from scrapy.shell import inspect_response 
         inspect_response(response, self)

위의 코드에서 볼 수 있듯이 스파이더에서 쉘을 호출하여 다음 함수를 사용하여 응답을 검사 할 수 있습니다.

scrapy.shell.inspect_response

이제 거미를 실행하면 다음 화면이 나타납니다.

2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
[s] Available Scrapy objects: 
[s]   crawler     
...  
>> response.url 
'http://mysite2.org'

다음 코드를 사용하여 추출 된 코드가 작동하는지 확인할 수 있습니다.

>> response.xpath('//div[@class = "val"]')

출력을 다음과 같이 표시합니다.

[]

위의 행은 빈 출력 만 표시했습니다. 이제 다음과 같이 응답을 검사하기 위해 쉘을 호출 할 수 있습니다.

>> view(response)

응답을 다음과 같이 표시합니다.

True