Mercurial > cpython-lru_cache-weakref
annotate Lib/robotparser.py @ 8831:00a6bb65ff29 legacy-trunk
Getting rid of this ancient stuff.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Wed, 05 Aug 1998 21:10:09 +0000 |
| parents | efbb7e57e6f8 |
| children | c43b38079228 |
| rev | line source |
|---|---|
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 """ |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 Robots.txt file parser class. Accepts a list of lines or robots.txt URL as |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 input, builds a set of rules from that list, then answers questions about |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 fetchability of other URLs. |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
6 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 """ |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 class RobotFileParser: |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 def __init__(self): |
| 7887 | 12 self.rules = {} |
| 13 self.debug = 0 | |
| 14 self.url = '' | |
| 15 self.last_checked = 0 | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
16 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 def mtime(self): |
| 7887 | 18 return self.last_checked |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 def modified(self): |
| 7887 | 21 import time |
| 22 self.last_checked = time.time() | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 def set_url(self, url): |
| 7887 | 25 self.url = url |
| 26 ## import urlmisc | |
| 27 ## self.url = urlmisc.canonical_url(url) | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 def read(self): |
| 7887 | 30 import urllib |
| 31 self.parse(urllib.urlopen(self.url).readlines()) | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
33 def parse(self, lines): |
| 7887 | 34 import regsub, string, regex |
| 35 active = [] | |
| 36 for line in lines: | |
| 37 if self.debug: print '>', line, | |
| 38 # blank line terminates current record | |
| 39 if not line[:-1]: | |
| 40 active = [] | |
| 41 continue | |
| 42 # remove optional comment and strip line | |
| 43 line = string.strip(line[:string.find(line, '#')]) | |
| 44 if not line: | |
| 45 continue | |
| 46 line = regsub.split(line, ' *: *') | |
| 47 if len(line) == 2: | |
| 48 line[0] = string.lower(line[0]) | |
| 49 if line[0] == 'user-agent': | |
| 50 # this record applies to this user agent | |
| 51 if self.debug: print '>> user-agent:', line[1] | |
| 52 active.append(line[1]) | |
| 53 if not self.rules.has_key(line[1]): | |
| 54 self.rules[line[1]] = [] | |
| 55 elif line[0] == 'disallow': | |
| 56 if line[1]: | |
| 57 if self.debug: print '>> disallow:', line[1] | |
| 58 for agent in active: | |
| 59 self.rules[agent].append(regex.compile(line[1])) | |
| 60 else: | |
| 61 pass | |
| 62 for agent in active: | |
| 63 if self.debug: print '>> allow', agent | |
| 64 self.rules[agent] = [] | |
| 65 else: | |
| 66 if self.debug: print '>> unknown:', line | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
67 |
| 7887 | 68 self.modified() |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
69 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
70 # returns true if agent is allowed to fetch url |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
71 def can_fetch(self, agent, url): |
| 7887 | 72 import urlparse |
| 73 ag = agent | |
| 74 if not self.rules.has_key(ag): ag = '*' | |
| 75 if not self.rules.has_key(ag): | |
| 76 if self.debug: print '>> allowing', url, 'fetch by', agent | |
| 77 return 1 | |
| 78 path = urlparse.urlparse(url)[2] | |
| 79 for rule in self.rules[ag]: | |
| 80 if rule.match(path) != -1: | |
| 81 if self.debug: print '>> disallowing', url, 'fetch by', agent | |
| 82 return 0 | |
| 83 if self.debug: print '>> allowing', url, 'fetch by', agent | |
| 84 return 1 | |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
86 def test(): |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
87 rp = RobotFileParser() |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 rp.debug = 1 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 rp.set_url('http://www.automatrix.com/robots.txt') |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
90 rp.read() |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 print rp.rules |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 print rp.can_fetch('*', 'http://www.calendar.com/concerts/') |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
93 print rp.can_fetch('Musi-Cal-Robot', |
| 7887 | 94 'http://dolphin:80/cgi-bin/music-search?performer=Rolling+Stones') |
|
5063
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 print rp.can_fetch('Lycos', 'http://www/~skip/volkswagen/') |
|
f0731fa4447f
Skip Montanaro's robots.txt parser.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 print rp.can_fetch('Lycos', 'http://www/~skip/volkswagen/vanagon-list-001') |
