def handleTextfeldList(self, textList): logger.info("TextfeldList: text=%s", str(textList)) for text in textList: if len(text) == 0: continue logger.info("Text: text=%s", text) self.scribus.insertText(text + '\n')
def handleTextfeldList(self, stil, textList): logger.info("TextfeldList: stil=%s text=%s", stil, str(textList)) for text in textList: if len(text) == 0: continue logger.info("Text: stil=%s text=%s", stil, text) self.insertText(text+'\n', stil)
def handleAbfahrt(self, abfahrt): # abfahrt = (type, beginning, loc) typ = abfahrt[0] uhrzeit = abfahrt[1] ort = abfahrt[2] logger.info("Abfahrt: type=%s uhrzeit=%s ort=%s", typ, uhrzeit, ort) self.insertText(typ + (': '+uhrzeit if uhrzeit != "" else "")+', '+ort+'\n', 'Radtour_start')
def fetch_max_property_id_scraped(): logger.info('Checking the last property scraped...') try: max_property_id = models.NTypeUnclaimedProperty.objects.latest('property_id').property_id except ObjectDoesNotExist: logger.info('No Data Exists. Setting Default to 1') max_property_id = 1 return max_property_id
def doLogin(self): headers = self.headers headers["Content-Type"] = "application/x-www-form-urlencoded" retCode, retData = self.doPOST( "https://kyfw.12306.cn/otn/login/userLogin", parse.urlencode({"_json_att": ""}), headers=headers) # logger.debug("retCode:[{}], retData:[{}]".format(retCode, retData.decode("utf-8", errors="ignore"))) logger.info("尝试 uamtk 验证...") headers[ "Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8" ok = False while not ok: retCode, retData = self.doPOST( "https://kyfw.12306.cn/passport/web/auth/uamtk", parse.urlencode({"appid": "otn"}), headers=headers) if retCode == 200: logger.debug("retCode:[{}], retData:[{}]".format( retCode, retData.decode("utf-8"))) try: result = json.loads(retData.decode("utf-8")) if result["result_code"] == 0: logger.info("uamtk 验证通过") ok = True self.tokenParams["newapptk"] = result["newapptk"] else: return result["result_message"] except: pass logger.info("尝试 uamauthclient 验证...") ok = False while not ok: retCode, retData = self.doPOST( "https://kyfw.12306.cn/otn/uamauthclient", parse.urlencode({"tk": self.tokenParams["newapptk"]}), headers=headers) if retCode == 200: logger.debug("retCode:[{}], retData:[{}]".format( retCode, retData.decode("utf-8"))) try: result = json.loads(retData.decode("utf-8")) if result["result_code"] == 0: logger.info("uamauthclient 验证通过") ok = True logger.info("成功登录12306, 用户名[{}], 可以买票了".format( result["username"])) else: return result["result_message"] except: pass self.afterLogin()
def handleTel(self, Name): telfestnetz = Name.getElementsByTagName("TelFestnetz") telmobil = Name.getElementsByTagName("TelMobil") if len(telfestnetz)!=0: logger.info("Tel: festnetz=%s", telfestnetz[0].firstChild.data) self.insertText(' ('+telfestnetz[0].firstChild.data+')', None) if len(telmobil)!=0: logger.info("Tel: mobil=%s", telmobil[0].firstChild.data) self.insertText(' ('+telmobil[0].firstChild.data+')', None, self.textbox)
def expTitel(self, event, _): if self.linkType == "Frontend": self.url = event.getFrontendLink() elif self.linkType == "Backend": self.url = event.getBackendLink() else: self.url = None logger.info("Titel: " + event.getTitel()) return event.getTitel()
def __init__(self, eventJS, eventJSSearch, eventServer): self.eventJS = eventJS self.eventJSSearch = eventJSSearch self.eventServer = eventServer self.tourLocations = eventJS.get("tourLocations") self.itemTags = eventJS.get("itemTags") self.eventItem = eventJS.get("eventItem") self.titel = self.eventItem.get("title").strip() logger.info("eventItemId %s %s", self.titel, self.eventItem.get("eventItemId"))
def doPOST(self, url, data, headers=None): if headers is None: headers = self.headers req = request.Request(url, headers=headers) logger.debug("cookie: [{}]".format(self._cj)) logger.info("POST: [{}] ,data [{}]".format(url, data)) try: with My12306._opener.open(req, data=data.encode("utf-8")) as f: return f.status, f.read() except: return 400, iter("")
def fetch_details_all(): unprocessed_opps = Summary.query.filter_by(is_processed=False).all() for i, unprocessed_opp in enumerate(unprocessed_opps): logger.info('Fetching %s of %s: %s' % (i + 1, len(unprocessed_opps), unprocessed_opp.url)) fetch_details_single(unprocessed_opp.url, unprocessed_opp.state, unprocessed_opp.category, unprocessed_opp.category_id) unprocessed_opp.is_processed = True unprocessed_opp.date_processed = datetime.now() session.commit()
def doGET(self, url, data=None, headers=None): if data is not None: url = url + "?" + data logger.debug("cookie: [{}]".format(self._cj)) logger.info("GET: [{}]".format(url)) if headers is None: headers = self.headers req = request.Request(url, headers=headers) try: with My12306._opener.open(req) as f: return f.status, f.read() except: return 400, iter("")
def expTitel(self, event, _): if self.linkType == "Frontend": self.url = event.getFrontendLink() elif self.linkType == "Backend": self.url = event.getBackendLink() else: self.url = None titel = event.getTitel() if self.pageNr is not None: return titel # called from evalToc logger.info("Titel: %s URL: %s", titel, self.url) run = copy.copy(self.run) run.pstyle = "MD_P_REGULAR" run.cstyle = "MD_C_TOC" # put the eventId in an invisble font before the titel, for the toc run.text = "_evtid_:" + event.getEventItemId() + STX + titel + ETX return [run, titel]
def calcNummern(self): # too bad we base numbers on kategorie and radtyp,which we cannot get from the search result self.alleTouren.sort(key=lambda x: x.getDatumRaw()) # sortieren nach Datum yyyy = "" logger.info("Begin calcNummern") for tour in self.alleTouren: datum = tour.getDatumRaw() if datum[0:4] != yyyy: yyyy = datum[0:4] tnum = 100 rnum = 300 mnum = 400 mtnum = 600 radTyp = tour.getRadTyp() kategorie = tour.getKategorie() if kategorie == "Mehrtagestour": num = mtnum mtnum += 1 elif radTyp == "Rennrad": num = rnum rnum += 1 elif radTyp == "Mountainbike": num = mnum mnum += 1 else: num = tnum tnum += 1 tour.eventNummer = str(num) self.alleTermine.sort(key=lambda x: x.getDatumRaw()) # sortieren nach Datum yyyy = "" for termin in self.alleTermine: datum = termin.getDatumRaw() if datum[0:4] != yyyy: yyyy = datum[0:4] tnum = 700 num = tnum tnum += 1 termin.eventNummer = str(num) logger.info("End calcNummern")
def checkCaptcha(self): ok = False g = self.getCaptchaImg() g.send(None) while not ok: # g = self.getCaptchaImg() posInfo = self.getPosInfo() captchaForm = { "answer": posInfo, "login_site": "E", "rand": "sjrand", } logger.debug(captchaForm) retCode, retData = self.doPOST(self._captchaChk, parse.urlencode(captchaForm)) logger.info("retCode:[{}]".format(retCode)) if retCode == 200: try: result = json.loads(retData.decode("utf-8")) logger.info("retData:[{}]".format(result)) if result["result_code"] == "4": ok = True break except: pass g.send(None) g.close() logger.info("验证码校验成功, 尝试登陆")
def checkUser(self, user="******", passwd="123456"): loginForm = { "username": user, "password": passwd, "appid": "otn", } logger.info("发送登录数据: {}".format(loginForm)) ok = False while not ok: retCode, retData = self.doPOST(self._loginURL, parse.urlencode(loginForm)) if retCode == 200: logger.debug(retData.decode("utf-8")) try: result = json.loads(retData.decode("utf-8")) if result["result_code"] == 0: logger.info("用户名和密码验证通过") ok = True self.tokenParams["tk"] = result["uamtk"] else: logger.info(result["result_message"]) sys.exit(1) except json.decoder.JSONDecodeError as e: logger.debug("json parse failed: {}".format(e)) time.sleep(2) except UnicodeDecodeError as e: logger.debug("[{}]".format(e))
def handleTermin(self, termin): try: titel = termin.getTitel() logger.info("Title %s", titel) kategorie = termin.getKategorie() datum = termin.getDatum()[0] logger.info("terminTyp %s datum %s", kategorie, datum) zeiten = termin.getAbfahrten() if len(zeiten) == 0: raise ValueError("keine Anfangszeit für Termin %s", titel) logger.info("zeiten %s ", str(zeiten)) beschreibung = termin.getBeschreibung(False) logger.info("beschreibung %s", beschreibung) zusatzinfo = termin.getZusatzInfo() logger.info("zusatzinfo %s", str(zusatzinfo)) except Exception as e: logger.exception("Fehler im Termin '%s': %s", titel, e) return print("{} - {}".format( titel, kategorie)) # terminTyp z.B. Stammtisch, entbehrlich? print("{}".format(datum)) for zeit in zeiten: if zeit[1] != "": # print("${}: {} Uhr; {}".format(zeit[0], zeit[1], zeit[2])) print("{} Uhr; {}".format(zeit[1], zeit[2])) else: # print("${}: {}".format(zeit[0], zeit[2])) print("{}".format(zeit[2])) print(beschreibung) for info in zusatzinfo: if len(info) == 0: continue print(info) print()
def getEvents(self, unitKey, start, end, typ): unit = "Alles" if unitKey is None or unitKey == "" else unitKey startYear = start[0:4] with open(self.fn, "r", encoding="utf-8") as f: f = XMLFilter(f) xmlt = parse(f) n, d = parse_element(xmlt) jsRoot = elimText(d) # jsonPath = "xml2.json" # with open(jsonPath, "w") as jsonFile: # json.dump(jsRoot, jsonFile, indent=4) js = jsRoot.get("ExportEventItemList") js = js.get("EventItems") items = js.get("ExportEventItem") events = [] if len(items) == 0: return events for item in iter(items): # item["imagePreview"] = "" # save space titel = item.get("Title") if titel is None: logger.error("Kein Titel für den Event %s", str(item)) continue if item.get("IsCancelled") != "Nein": logger.info("Event %s ist gecancelt", titel) continue if typ != "Alles" and item.get("EventType") != typ: continue beginning = item.get("Beginning") if beginning is None: logger.error("Kein Beginn für den Event %s", titel) continue begDate = beginning[0:4] if begDate < start[0:4] or begDate > end[0:4]: continue ev = XmlEvent(item) if ev.isTermin(): self.alleTermine.append(ev) else: self.alleTouren.append(ev) begDate = event.convertToMEZOrMSZ(beginning)[0:10] if begDate < start or begDate > end: logger.info("event " + titel + " not in timerange") continue # add other filter conditions here logger.info("event " + titel + " OK") self.events[ev.getEventItemId()] = ev return self.events.values()
def getCaptchaImg(self): while True: captchaImgData = { "login_site": "E", "module": "login", "rand": "sjrand", random.random(): "" } retCode, retData = self.doGET(self._captchaImg, parse.urlencode(captchaImgData)) logger.info("retCode:{}".format(retCode)) if retCode == 200: png = os.path.join(self._tmp, "captcha.png") logger.info("保存图片为:{}".format(png)) with open(png, "wb") as fw: fw.write(retData) try: img = Image.open(png) except: logger.info("未获取到验证码,重新获取...") continue yield img.show()
def insertText(self, text): logger.info(text) print(text, end="")
def handleTextfeld(self, textelement): logger.info("Textfeld: text=%s", textelement) if textelement is not None: self.scribus.insertText(textelement + '\n')
def nothingFound(self): logger.info("Nichts gefunden") print("Nichts gefunden")
#!/usr/local/bin/python3 from time import strftime, localtime, sleep from pmu import recordHands import os from config import PMULogFolder, mainPlayer from myLogger import logger from multiprocessing import Process currentFolder = strftime("%Y%m%d", localtime()) logger.warning("DuduTrackerPMULiveRecorder is started ...") logger.info("CurrentFolder : " + currentFolder) def readLines(file, pos): file = open(file, "r", encoding='utf8') file.seek(pos) lines = file.readlines() pos = file.tell() file.close() sleep(1) return (lines, pos) def parseFile(PMULogFile): pos = 0 while True: result = readLines(PMULogFile, pos) lines = result[0] pos = result[1]
def handleTour(self, tour): try: titel = tour.getTitel() logger.info("Title %s", titel) tourNummer = tour.getNummer() radTyp = tour.getRadTyp() kategorie = tour.getKategorie() datum = tour.getDatum()[0] logger.info("tourNummer %s radTyp %s kategorie %s datum %s", tourNummer, radTyp, kategorie, datum) abfahrten = tour.getAbfahrten() if len(abfahrten) == 0: raise ValueError("kein Startpunkt in tour %s", titel) logger.info("abfahrten %s ", str(abfahrten)) abfahrten = "\n".join(["{}: {} Uhr; {}".format( abfahrt[0], abfahrt[1], abfahrt[2]) for abfahrt in abfahrten]) beschreibung = tour.getBeschreibung(False) logger.info("beschreibung %s", beschreibung) kurzbeschreibung = tour.getKurzbeschreibung() logger.info("kurzbeschreibung %s", kurzbeschreibung) zusatzinfo = tour.getZusatzInfo() logger.info("zusatzinfo %s", str(zusatzinfo)) zusatzinfo = "\n".join(zusatzinfo) schwierigkeit = schwierigkeitMap[tour.getSchwierigkeit()] logger.info("schwierigkeit %s", schwierigkeit) strecke = tour.getStrecke() if strecke == "0 km": logger.error("Fehler: Tour %s hat keine Tourlänge", titel) else: logger.info("strecke %s", strecke) hoehenmeter = tour.getHoehenmeter() character = tour.getCharacter() if kategorie == 'Mehrtagestour': enddatum = tour.getEndDatum()[0] logger.info("enddatum %s", enddatum) else: enddatum = "" tourLeiter = tour.getPersonen() logger.info("tourLeiter %s", str(tourLeiter)) if len(tourLeiter) == 0: logger.error("Fehler: Tour %s hat keinen Tourleiter", titel) tourLeiter = ",".join(tourLeiter) except Exception as e: logger.exception("Fehler in der Tour '%s': %s", titel, e) return row = { "Typ": "Radtour", "Titel": titel, "Nummer": tourNummer, "Radtyp": radTyp, "Tourtyp": kategorie, "Datum": datum, "Endedatum": enddatum, "Tourlänge": strecke, "Schwierigkeit": schwierigkeit, "Höhenmeter": hoehenmeter, "Charakter": character, "Abfahrten": abfahrten, "Kurzbeschreibung": kurzbeschreibung, "Beschreibung": beschreibung, "ZusatzInfo": zusatzinfo, "Tourleiter": tourLeiter} self.writer.writerow(row)
def handleTermin(self, tour): try: titel = tour.getTitel() logger.info("Title %s", titel) kategorie = tour.getKategorie() datum = tour.getDatum()[0] logger.info("kategorie %s datum %s", kategorie, datum) zeiten = tour.getAbfahrten() if len(zeiten) == 0: raise ValueError("keine Anfangszeit für Termin %s", titel) logger.info("zeiten %s ", str(zeiten)) zeiten = "\n".join(["{}: {} Uhr; {}".format( zeit[0], zeit[1], zeit[2]) for zeit in zeiten]) beschreibung = tour.getBeschreibung(False) logger.info("beschreibung %s", beschreibung) kurzbeschreibung = tour.getKurzbeschreibung() logger.info("kurzbeschreibung %s", kurzbeschreibung) zusatzinfo = tour.getZusatzInfo() zusatzinfo = "\n".join(zusatzinfo) logger.info("zusatzinfo %s", str(zusatzinfo)) except Exception as e: logger.exception("Fehler im Termin '%s': %s", titel, e) return row = { "Typ": "Termin", "Titel": titel, "Tourtyp": kategorie, "Datum": datum, "Abfahrten": zeiten, "Kurzbeschreibung": kurzbeschreibung, "Beschreibung": beschreibung, "ZusatzInfo": zusatzinfo} self.writer.writerow(row)
def main(): logger.info('Fetching Summaries...') siteEvents.fetch_summaries() logger.info('Fetching Details...') siteEvents.fetch_details_all()
def main(): if is_running(): logger.info('Still running, exit!') sys.exit(0) last_fail_id = -1 try: logger.info('Starting Scraper...') max_property_id = fetch_max_property_id_scraped() property_id = max_property_id not_found_count = 0 while True: property_id += 1 logger.info('Fetching Property %s' % property_id) try: res = scrape_single_property(property_id) except requests.ConnectionError: property_id -= 1 logger.error("Connection error, sleep 10 minutes...") time.sleep(600) continue if res == -1: logger.info("Doesnt Exist") if int(math.fabs(last_fail_id-property_id)) == 1: not_found_count += 1 else: not_found_count = 1 last_fail_id = property_id if not_found_count > 50000: logger.info("That's all folks!") break except: logger.exception(sys.exc_info()) finally: logger.info('Done!')
def __init__(self, eventItem): self.eventItem = eventItem self.tourLocations = eventItem.get("TourLocations") self.titel = self.eventItem.get("Title").strip() self.eventNummer = 0 logger.info("eventItemId %s %s", self.titel, self.getEventItemId())
def handleName(self, name): logger.info("Name: name=%s", name) self.scribus.insertText(name)
def handleTitel(self, tt): logger.info("Titel: titel=%s", tt) self.scribus.insertText(tt + '\n')
def handleTour(self, tour): try: self.scribus.insertText('\n') titel = tour.getTitel() logger.info("Title %s", titel) datum = tour.getDatum()[0] logger.info("datum %s", datum) abfahrten = tour.getAbfahrten() if len(abfahrten) == 0: raise ValueError("kein Startpunkt in tour %s", titel) logger.info("abfahrten %s ", str(abfahrten)) beschreibung = tour.getBeschreibung(False) logger.info("beschreibung %s", beschreibung) zusatzinfo = tour.getZusatzInfo() logger.info("zusatzinfo %s", str(zusatzinfo)) kategorie = tour.getKategorie() radTyp = tour.getRadTyp() logger.info("kategorie %s radTyp %s", kategorie, radTyp) if kategorie == "Feierabendtour": schwierigkeit = "F" elif radTyp == "Rennrad": schwierigkeit = "RR" elif radTyp == "Mountainbike": schwierigkeit = "MTB" else: schwierigkeit = str(tour.getSchwierigkeit()) if schwierigkeit == "0": schwierigkeit = "1" if "1" <= schwierigkeit <= "5": schwierigkeit = "*" * int(schwierigkeit) logger.info("schwierigkeit %s", schwierigkeit) strecke = tour.getStrecke() if strecke == "0 km": logger.error("Fehler: Tour %s hat keine Tourlänge", titel) else: logger.info("strecke %s", strecke) if kategorie == 'Mehrtagestour': enddatum = tour.getEndDatum()[0] logger.info("enddatum %s", enddatum) personen = tour.getPersonen() logger.info("personen %s", str(personen)) if len(personen) == 0: logger.error("Tour %s hat keinen Tourleiter", titel) except Exception as e: logger.error("Fehler in der Tour %s: %s", titel, e) return if kategorie == 'Mehrtagestour': self.handleKopfzeileMehrtage(datum, enddatum, kategorie, schwierigkeit, strecke) else: self.handleKopfzeile(datum, kategorie, schwierigkeit, strecke) self.handleTitel(titel) for abfahrt in abfahrten: self.handleAbfahrt(abfahrt) self.handleTextfeld(beschreibung) self.handleTourenleiter(personen) self.handleTextfeldList(zusatzinfo)
def handleKopfzeileMehrtage(self, anfang, ende, kat, schwierig, strecke): logger.info("Mehrtage: anfang=%s ende=%s kat=%s schwere=%s strecke=%s", anfang, ende, kat, schwierig, strecke) self.scribus.insertText(anfang + ' bis ' + ende + ':\n') self.scribus.insertText(' ' + kat + ' ' + schwierig + ' ' + strecke + '\n')
def handleKopfzeile(self, dat, kat, schwierig, strecke): logger.info("Kopfzeile: dat=%s kat=%s schwere=%s strecke=%s", dat, kat, schwierig, strecke) self.scribus.insertText(dat + ': ' + kat + ' ' + schwierig + ' ' + strecke + '\n')