Scrapy - เชลล์

คำอธิบาย

Scrapy shell สามารถใช้เพื่อคัดลอกข้อมูลด้วยรหัสที่ปราศจากข้อผิดพลาดโดยไม่ต้องใช้สไปเดอร์ จุดประสงค์หลักของ Scrapy shell คือการทดสอบโค้ดที่แยกออกมา, XPath หรือนิพจน์ CSS นอกจากนี้ยังช่วยระบุหน้าเว็บที่คุณกำลังขูดข้อมูล

การกำหนดค่าเชลล์

เชลล์สามารถกำหนดค่าได้โดยการติดตั้งคอนโซลIPython (ใช้สำหรับการประมวลผลแบบโต้ตอบ) ซึ่งเป็นเชลล์แบบโต้ตอบที่มีประสิทธิภาพที่ให้การกรอกข้อมูลอัตโนมัติเอาต์พุตสีเป็นต้น

หากคุณกำลังทำงานบนแพลตฟอร์ม Unix คุณควรติดตั้ง IPython คุณยังสามารถใช้bpythonได้หาก IPython ไม่สามารถเข้าถึงได้

คุณสามารถกำหนดค่าเชลล์โดยตั้งค่าตัวแปรสภาพแวดล้อมที่เรียกว่า SCRAPY_PYTHON_SHELL หรือโดยการกำหนดไฟล์ scrapy.cfg ดังนี้ -

[settings]
shell = bpython

เปิดตัวเชลล์

Scrapy shell สามารถเปิดใช้งานได้โดยใช้คำสั่งต่อไปนี้ -

scrapy shell <url>

URLระบุ URL สำหรับข้อมูลที่จะต้องมีการคัดลอก

การใช้เชลล์

เชลล์มีทางลัดเพิ่มเติมและวัตถุ Scrapy ตามที่อธิบายไว้ในตารางต่อไปนี้ -

ทางลัดที่มี

เชลล์มีทางลัดต่อไปนี้ในโครงการ -

ซีเนียร์ No ทางลัดและคำอธิบาย
1

shelp()

มันมีวัตถุและทางลัดที่พร้อมใช้งานพร้อมตัวเลือกความช่วยเหลือ

2

fetch(request_or_url)

รวบรวมการตอบกลับจากคำขอหรือ URL และวัตถุที่เกี่ยวข้องจะได้รับการอัปเดตอย่างถูกต้อง

3

view(response)

คุณสามารถดูการตอบสนองสำหรับคำขอที่ระบุในเบราว์เซอร์ภายในเพื่อการสังเกตและเพื่อแสดงลิงก์ภายนอกอย่างถูกต้องโดยจะผนวกแท็กฐานเข้ากับเนื้อหาการตอบกลับ

วัตถุ Scrapy ที่มีอยู่

เชลล์จัดเตรียมวัตถุ Scrapy ที่มีอยู่ดังต่อไปนี้ในโครงการ -

ซีเนียร์ No วัตถุและคำอธิบาย
1

crawler

ระบุวัตถุโปรแกรมรวบรวมข้อมูลปัจจุบัน

2

spider

หากไม่มีสไปเดอร์สำหรับ URL ปัจจุบันก็จะจัดการกับ URL หรือออบเจ็กต์แมงมุมโดยกำหนดสไปเดอร์ใหม่

3

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