This repository has been archived by the owner on Nov 3, 2022. It is now read-only.
forked from marians/scrape-a-ris
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
152 lines (132 loc) · 6.44 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# encoding: utf-8
"""
Copyright (c) 2012 Marian Steinbach
Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und
der zugehörigen Dokumentationen (die "Software") erhält, die Erlaubnis
erteilt, sie uneingeschränkt zu benutzen, inklusive und ohne Ausnahme, dem
Recht, sie zu verwenden, kopieren, ändern, fusionieren, verlegen
verbreiten, unterlizenzieren und/oder zu verkaufen, und Personen, die diese
Software erhalten, diese Rechte zu geben, unter den folgenden Bedingungen:
Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen
Kopien oder Teilkopien der Software beizulegen.
Die Software wird ohne jede ausdrückliche oder implizierte Garantie
bereitgestellt, einschließlich der Garantie zur Benutzung für den
vorgesehenen oder einen bestimmten Zweck sowie jeglicher Rechtsverletzung,
jedoch nicht darauf beschränkt. In keinem Fall sind die Autoren oder
Copyrightinhaber für jeglichen Schaden oder sonstige Ansprüche haftbar zu
machen, ob infolge der Erfüllung eines Vertrages, eines Delikts oder anders
im Zusammenhang mit der Software oder sonstiger Verwendung der Software
entstanden.
"""
import argparse
from risscraper.scraper import Scraper
import datetime
import sys
import importlib
import logging
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Scrape Dein Ratsinformationssystem')
parser.add_argument('--config', '-c', dest='configname', default='config',
help=("Name of the configuration module to use (e.g. 'config_koeln' for file 'config_koeln.py'). " +
"Default: 'config'"))
parser.add_argument('--verbose', '-v', action='count', default=0, dest="verbose")
parser.add_argument('--queue', '-q', dest="workfromqueue", action="store_true",
default=False, help=('Set this flag to activate "greedy" scraping. This means that ' +
'links from sessions to submissions are followed. This is implied ' +
'if --start is given, otherwise it is off by default.'))
parser.add_argument('--start', dest="start_month",
default=False, help=('Find sessions and related content starting in this month. ' +
'Format: "YYYY-MM". When this is used, the -q parameter is implied.'))
parser.add_argument('--end', dest="end_month",
default=False, help=('Find sessions and related content up to this month. ' +
'Requires --start parameter to be set, too. Format: "YYYY-MM"'))
parser.add_argument('--sessionid', dest="session_id",
default=False, help='Scrape a specific session, identified by its numeric ID')
parser.add_argument('--sessionurl', dest="session_url",
default=False, help='Scrape a specific session, identified by its detail page URL')
parser.add_argument('--submissionid', dest="submission_id",
default=False, help='Scrape a specific submission, identified by its numeric ID')
parser.add_argument('--submissionurl', dest="submission_url",
default=False, help='Scrape a specific submission, identified by its detail page URL')
parser.add_argument('--erase', dest="erase_db", action="store_true",
default=False, help='Erase all database content before start. Caution!')
parser.add_argument('--status', dest="status", action="store_true",
default=False, help='Print out queue status')
options = parser.parse_args()
if options.configname:
#config = __import__(options.configname, fromlist=[''])
try:
config = importlib.import_module(options.configname)
except ImportError, e:
if "No module named" in str(e):
sys.stderr.write("ERROR: Configuration module not found. Make sure you have your config file\n")
sys.stderr.write(" named '%s.py' in the main folder.\n" % options.configname)
sys.exit(1)
# set up logging
logfile = 'scrapearis.log'
if config.LOG_FILE is not None:
logfile = config.LOG_FILE
levels = {
'DEBUG': logging.DEBUG,
'INFO': logging.INFO,
'WARNING': logging.WARNING,
'ERROR': logging.ERROR,
'CRITICAL': logging.CRITICAL
}
loglevel = 'INFO'
if config.LOG_LEVEL is not None:
loglevel = config.LOG_LEVEL
logging.basicConfig(
filename=logfile,
level=levels[loglevel],
format='%(asctime)s %(name)s %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
logging.info('Starting scraper with configuration from "%s" and loglevel "%s"',
options.configname, loglevel)
db = None
if config.DB_TYPE == 'mongodb':
import db.mongodb
db = db.mongodb.MongoDatabase(config, options)
db.setup()
#elif config.DB_TYPE == 'mysqldb':
# import db.mysqldb
# db = db.mysqldb.MysqlDatabase(config)
# db.setup()
if options.status:
db.queue_status()
if options.erase_db:
print "Erasing database"
db.erase()
scraper = Scraper(config, db, options)
scraper.guess_system()
if options.session_id:
scraper.get_session(session_id=int(options.session_id))
if options.session_url:
scraper.get_session(session_url=options.session_url)
if options.submission_id:
scraper.get_submission(submission_id=int(options.submission_id))
if options.submission_url:
scraper.get_submission(submission_url=options.submission_url)
if options.start_month:
options.workfromqueue = True
try:
options.start_month = datetime.datetime.strptime(options.start_month, '%Y-%m')
except ValueError:
sys.stderr.write("Bad format or invalid month for --start parameter. Use 'YYYY-MM'.\n")
sys.exit()
if options.end_month:
try:
options.end_month = datetime.datetime.strptime(options.end_month, '%Y-%m')
except ValueError:
sys.stderr.write("Bad format or invalid month for --end parameter. Use 'YYYY-MM'.\n")
sys.exit()
if options.end_month < options.start_month:
sys.stderr.write("Error with --start and --end parameter: end month should be after start month.\n")
sys.exit()
else:
options.end_month = options.start_month
scraper.find_sessions(start_date=options.start_month, end_date=options.end_month)
if options.workfromqueue:
scraper.work_from_queue()
logging.info('Scraper finished.')