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