2009-11-28 37 views
10

Vui lòng xem this spider example trong tài liệu Scrapy. Giải thích là:Scrapy SgmlLinkExtractor bị bỏ qua là bỏ qua các liên kết được phép

Con nhện này sẽ bắt đầu thu thập thông tin trang chủ example.com, thu thập liên kết danh mục và liên kết mục, phân tích cú pháp sau bằng phương pháp parse_item. Đối với mỗi mục phản hồi, một số dữ liệu sẽ được trích xuất từ ​​HTML bằng cách sử dụng XPath, và một Item sẽ được lấp đầy với nó.

Tôi đã sao chép chính xác cùng một con nhện và thay thế "example.com" bằng url ban đầu khác.

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from stb.items import StbItem 

class StbSpider(CrawlSpider): 
    domain_name = "stb" 
    start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm'] 

    rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm',)), callback='parse', follow=True),) 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 

     item = StbItem() 
     item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.') 
     return item 

SPIDER = StbSpider() 

Nhưng nhện của tôi "STB" không thu thập các liên kết từ "/ bios /" vì nó là nghĩa vụ phải làm. Nó chạy url ban đầu, cạo các item['JD'] và ghi nó vào một tập tin và sau đó thoát.

Tại sao SgmlLinkExtractor bị bỏ qua? Các Rule được đọc bởi vì nó bắt lỗi cú pháp bên trong dòng Rule.

Đây có phải là lỗi không? có gì sai trong mã của tôi không? Không có lỗi ngoại trừ một loạt lỗi không được xử lý mà tôi thấy với mọi lần chạy.

Thật tuyệt khi biết tôi đang làm gì sai ở đây. Cảm ơn mọi manh mối. Tôi có hiểu lầm những gì SgmlLinkExtractor là nghĩa vụ phải làm gì?

+0

Khi tôi thấy "Không có lỗi ngoại trừ một loạt lỗi không được xử lý mà tôi thấy với mọi lần chạy", tôi phải gãi đầu. –

+0

Xin lỗi, tôi thấy Cảnh báo Ngừng sử dụng. Các lỗi mà tôi đã nhìn thấy là do có telnet và vỏ mở cùng một lúc như đã đề cập bởi Pablo Hoffman ở đây http://stackoverflow.com/questions/1767553/twisted-errors-in-scrapy-spider và khi tôi đóng vỏ, tôi không thấy chúng nữa. Bất kỳ manh mối nào tại sao các liên kết được phép không được cạo? – Zeynel

Trả lời

11

Chức năng parse thực sự được triển khai và sử dụng trong lớp CrawlSpider và bạn vô tình ghi đè nó. Nếu bạn thay đổi tên thành tên khác, như parse_item thì Quy tắc sẽ hoạt động.

+0

Cảm ơn. Tôi đã viết một con nhện trăn rất đơn giản và nó có tác dụng với tôi. – Zeynel

+0

Thật thú vị, tôi có cùng một vấn đề. Tuy nhiên, khi tôi thay đổi nó thành một cái gì đó khác, hãy nhận "Lỗi không được triển khai" để "phân tích cú pháp". – bdd

+0

Bạn có kế thừa từ CrawlSpider không? Nếu không, thì bạn cần một phương thức có tên là "phân tích cú pháp". – Jacob

Các vấn đề liên quan