Tôi đang thu thập 6 tên miền được phép khác nhau và muốn giới hạn độ sâu của 1 tên miền. Làm thế nào tôi sẽ đi về hạn chế chiều sâu của 1 tên miền đó trong phế liệu? Hoặc bạn có thể thu thập dữ liệu chỉ 1 chiều sâu của một tên miền ngoại vi?Giới hạn chiều sâu được đặt cho mỗi tên miền được phép là
5
A
Trả lời
8
Phế liệu không cung cấp bất kỳ thứ gì như thế này. Bạn có thể set the DEPTH_LIMIT
per-spider, nhưng không phải trên mỗi miền.
Chúng ta có thể làm gì? Read the code, uống cà phê và giải quyết nó (thứ tự quan trọng).
Ý tưởng là tắt tính năng tích hợp sẵn DepthMiddleware
và provide our custom one của Scrapy.
Trước tiên, hãy xác định cài đặt:
DOMAIN_DEPTHS
sẽ là một cuốn từ điển với giới hạn chiều sâu cho mỗi tên miềnDEPTH_LIMIT
thiết lập chúng tôi sẽ để lại như một mặc định một trong trường hợp một miền không được cấu hình
Cài đặt mẫu:
DOMAIN_DEPTHS = {'amazon.com': 1, 'homedepot.com': 4}
DEPTH_LIMIT = 3
Được rồi, bây giờ middleware tùy chỉnh (dựa trên DepthMiddleware
):
from scrapy import log
from scrapy.http import Request
import tldextract
class DomainDepthMiddleware(object):
def __init__(self, domain_depths, default_depth):
self.domain_depths = domain_depths
self.default_depth = default_depth
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
domain_depths = settings.getdict('DOMAIN_DEPTHS', default={})
default_depth = settings.getint('DEPTH_LIMIT', 1)
return cls(domain_depths, default_depth)
def process_spider_output(self, response, result, spider):
def _filter(request):
if isinstance(request, Request):
# get max depth per domain
domain = tldextract.extract(request.url).registered_domain
maxdepth = self.domain_depths.get(domain, self.default_depth)
depth = response.meta.get('depth', 0) + 1
request.meta['depth'] = depth
if maxdepth and depth > maxdepth:
log.msg(format="Ignoring link (depth > %(maxdepth)d): %(requrl)s ",
level=log.DEBUG, spider=spider,
maxdepth=maxdepth, requrl=request.url)
return False
return True
return (r for r in result or() if _filter(r))
Lưu ý rằng nó đòi hỏi tldextract
module để được cài đặt (được sử dụng để trích xuất một tên miền từ url):
>>> import tldextract
>>> url = 'http://stackoverflow.com/questions/27805952/scrapy-set-depth-limit-per-allowed-domains'
>>> tldextract.extract(url).registered_domain
'stackoverflow.com'
Bây giờ chúng ta cần để tắt phần mềm trung gian mặc định và sử dụng phần mềm trung gian mặc định và sử dụng phần mềm trung gian mà chúng tôi đã triển khai:
SPIDER_MIDDLEWARES = {
'myproject.middlewares.DomainDepthMiddleware': 900,
'scrapy.contrib.spidermiddleware.depth.DepthMiddleware': None
}
Các vấn đề liên quan
- 1. Giới hạn chiều sâu cây biểu thức
- 2. cho phép tất cả các tên miền
- 3. Có phải tên miền gốc CNAME đến tên miền khác được DNS RFC cho phép không?
- 4. Tiêu đề bao gồm Giới hạn chiều sâu
- 5. C# trong chiều sâu: Sự cố được đặt?
- 6. Tên lớp S3: Được phép là gì?
- 7. AWS Policy Bucket để hạn chế truy cập công cộng để xô nhưng cho phép tên miền giới thiệu
- 8. chỉ đặt giới hạn dưới của giới hạn cho ggplot
- 9. JAVA: Vấn đề về chuỗi tên miền được đặt tên
- 10. jQuery - Cách xóa giới hạn miền chéo
- 11. Django: Giới hạn UpdateView cho mỗi người dùng
- 12. Giới hạn chiều rộng bảng
- 13. Giới hạn Meteor.js được tích hợp sẵn trong Google xác thực cho miền
- 14. đặt cookie tên miền phụ có thể truy cập được vào tên miền phụ phụ?
- 15. Cài đặt máy chủ được phép cho Django trên EC2
- 16. Dừng cookie được đặt từ tên miền (còn gọi là "miền không nấu nướng") để tăng hiệu suất trang web
- 17. Thu thập dữ liệu nhiều trang web bằng Python Scrapy với độ sâu giới hạn trên mỗi trang web
- 18. Các ký tự được phép trong tên miền phụ là gì?
- 19. giới hạn tối đa cho mỗi phụ trợ trong haproxy
- 20. UIWebView - Giới hạn chiều rộng nội dung
- 21. python GTK3 giới hạn chiều rộng nhãn
- 22. đặt giới hạn đệ quy python cho hàm
- 23. Cách đặt cookie cho tên miền khác
- 24. Cách giới hạn chiều rộng văn bản
- 25. Giới hạn số tham số cho mỗi phương thức?
- 26. Giới hạn bộ nhớ tối đa cho mỗi ứng dụng cho Android 2.2 là bao nhiêu?
- 27. Tôi cho phép yêu cầu AJAX qua tên miền phụ đã được cho phép, nhưng lỗi Chrome này dường như cho biết khác là
- 28. Tên miền phụ có được coi là tên miền chéo không?
- 29. Số tham số tối đa được phép cho mỗi loại nhà cung cấp cơ sở dữ liệu là bao nhiêu?
- 30. Đập số SSN và thông tin tên miền có giới hạn khác
Làm thế nào để tldextract khác với gói python phổ biến hơn 'tld'? –
@FredericBazin Tôi không chắc chắn lắm, chưa so sánh chúng. Tôi nghĩ ở đây nó không quan trọng lắm. Bạn có thể sử dụng bất kỳ một trong số chúng, hoặc thậm chí giải quyết nó với 'urlparse()' có một hàm 'extract_domain()' tùy chỉnh. Cảm ơn. – alecxe
Cảm ơn bạn đã giải thích tuyệt vời! Nên 'response.meta ['depth'] = 0' ở trên' depth = response.meta ['depth'] + 1' Khác, 'response.meta ['depth']' rỗng và sẽ đưa ra một keyerror –