Python Skript lässt sich nicht per Doppelklick starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sawyaz
User
Beiträge: 3
Registriert: Montag 17. Juni 2019, 19:03

Hi,

mein Ziel ist es ein Programm zu erstellen welches automatisch die Preise von bestimmten Pc teilen online ausliest und diese in eine Datei schreibt.
Das Auslesen und in Datei schreiben funktioniert soweit, aber nur wenn ich das ganze per Spyder starte.
Wenn ich das Skript der Dopelklick starte oder eine Verknpüfung in den Autostart lege öffnet sich nur kurz die CMD aber es werden keine Preise in die Preisliste geschrieben bzw sie wird nicht erstellt.
Ich arbeite mit Windows 10 und Python 3.7.

Code: Alles auswählen

import requests
import re
from datetime import datetime
import numpy as np

a = np.array(['https://www.mindfactory.de/product_info.php/AMD-Ryzen-5-2600X-6x-3-60GHz-So-AM4-BOX_1233731.html', 'https://www.mindfactory.de/product_info.php/EKL-Alpenfoehn-Brocken-3-Tower-Kuehler_1188580.html', 'https://www.mindfactory.de/product_info.php/ASRock-Fatal1ty-X470-Gaming-K4-AMD-X470-So-AM4-Dual-Channel-DDR4-ATX-Re_1238528.html', 'https://www.mindfactory.de/product_info.php/16GB-G-Skill-RipJaws-V-schwarz-DDR4-3200-DIMM-CL16-Dual-Kit_1013799.html', 'https://www.mindfactory.de/product_info.php/8GB-ZOTAC-GeForce-RTX-2070-GAMING-AMP-Extreme-Core-Aktiv-PCIe-3-0-x16--_1281215.html', 'https://www.mindfactory.de/product_info.php/Arctic-F12-PWM-120x120x25mm-600-1350-U-min-35-dB-A--schwarz-weiss_945124.html'])
pricelist=np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5])

for i in range(0,6):
    r = requests.get(a[i])
    if r.status_code==200:
        quellcode = r.text
        try:
            priceline = re.findall('itemprop="price" content="\d+\.\d+', quellcode)[0]
        except:
            priceline = re.findall('itemprop="price" content="\d+', quellcode)[0]

    
    pricelist[i]=priceline.split('"')[-1]

sum=np.sum(pricelist)
date = str(datetime.now().date())

with open('C:\\Users\\flori\\OneDrive\\Desktop\\prices.csv', 'a') as f:
    f.write(f'{date},{sum},{pricelist[0]},{pricelist[1]}, {pricelist[2]}, {pricelist[3]}, {pricelist[4]}, {pricelist[5]}\n')

Danke schonmal im Voraus
Flo
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Numpy verkompliziert alles nur, für Deine Aufgabe. Eine normale Liste reicht da vollkommen. Die sollte aber einen besseren Namen als `a` haben, z.B. `product_urls`.
Der Inhalt von pricelist wird gar nicht verwendet, sondern mit anderen Werten später überschrieben. Soetwas macht man in Python nicht. Man hängt einfach Werte an eine leere Liste an.
Eine for-Schleife über einen Index ist ein Antipattern, weil man statt dessen auch direkt über die Elemente der Liste iterieren kann. Insbesondere, weil Du hier fix 6 als Anzahl der Elemente eingetragen hast.
`r` ist ein schlechter Name für eine Variable, so wie all die anderen einbuchstabigen. Variablen sollten aussagekräftig sein.
Wenn status_code nicht 200 ist, dann werden falsche Werte in pricelist geschrieben, oder es gibt einen NameError, wobei ersteres viel schlimmer ist.
Insgesamt parst man HTML nicht mit regulären Ausdrücken, sondern nimmt einen HTML-Parser.

Ohne das HTML-Parsing, weil ich die Seitenstruktur nicht kenne:

Code: Alles auswählen

import requests
import re
from datetime import datetime

product_urls = [
    'https://www.mindfactory.de/product_info.php/AMD-Ryzen-5-2600X-6x-3-60GHz-So-AM4-BOX_1233731.html',
    'https://www.mindfactory.de/product_info.php/EKL-Alpenfoehn-Brocken-3-Tower-Kuehler_1188580.html',
    'https://www.mindfactory.de/product_info.php/ASRock-Fatal1ty-X470-Gaming-K4-AMD-X470-So-AM4-Dual-Channel-DDR4-ATX-Re_1238528.html',
    'https://www.mindfactory.de/product_info.php/16GB-G-Skill-RipJaws-V-schwarz-DDR4-3200-DIMM-CL16-Dual-Kit_1013799.html',
    'https://www.mindfactory.de/product_info.php/8GB-ZOTAC-GeForce-RTX-2070-GAMING-AMP-Extreme-Core-Aktiv-PCIe-3-0-x16--_1281215.html',
    'https://www.mindfactory.de/product_info.php/Arctic-F12-PWM-120x120x25mm-600-1350-U-min-35-dB-A--schwarz-weiss_945124.html'
]
prices = []
for url in product_urls:
    response = requests.get(url)
    if response.status_code==200:
        quellcode = response.text
        price_match = re.search('itemprop="price" content="(\d*\.?\d+)', quellcode)
        prices.append(price_match.group(1))

total_price = sum(prices)
Zum Problem: starte einmal das Programm von der Eingabeaufforderung aus (cmd.exe), um eine eventuelle Fehlermeldung auch zu sehen.
sawyaz
User
Beiträge: 3
Registriert: Montag 17. Juni 2019, 19:03

Ich weiß das mein Code nicht der schönst ist, meine Kenntnisse kommen eben nur aus gelegentlichen Auswerten von Physikpraktika oä und ich dachte ich versuch mal was neues ^^
Hab den code jetzt mal geändert zu

Code: Alles auswählen

import requests
import re
from datetime import datetime

product_urls = [
    'https://www.mindfactory.de/product_info.php/AMD-Ryzen-5-2600X-6x-3-60GHz-So-AM4-BOX_1233731.html',
    'https://www.mindfactory.de/product_info.php/EKL-Alpenfoehn-Brocken-3-Tower-Kuehler_1188580.html',
    'https://www.mindfactory.de/product_info.php/ASRock-Fatal1ty-X470-Gaming-K4-AMD-X470-So-AM4-Dual-Channel-DDR4-ATX-Re_1238528.html',
    'https://www.mindfactory.de/product_info.php/16GB-G-Skill-RipJaws-V-schwarz-DDR4-3200-DIMM-CL16-Dual-Kit_1013799.html',
    'https://www.mindfactory.de/product_info.php/8GB-ZOTAC-GeForce-RTX-2070-GAMING-AMP-Extreme-Core-Aktiv-PCIe-3-0-x16--_1281215.html',
    'https://www.mindfactory.de/product_info.php/Arctic-F12-PWM-120x120x25mm-600-1350-U-min-35-dB-A--schwarz-weiss_945124.html'
]
prices = []
for url in product_urls:
    response = requests.get(url)
    if response.status_code==200:
        quellcode = response.text
        price_match = re.search('itemprop="price" content="(\d*\.?\d+)', quellcode)
        prices.append(price_match.group(1))

#total_price = sum(prices)
        
date = str(datetime.now().date())
prices=list(map(float, prices))
pricesum = sum(prices)

with open('C:\\Users\\flori\\OneDrive\\Desktop\\prices.csv', 'a') as f:
    f.write(f'{date},{pricesum},{prices[0]},{prices[1]}, {prices[2]}, {prices[3]}, {prices[4]}, {prices[5]}\n')
Als Fehlermeldung in der Eingabeaufforderung erhalte ich
C:\Users\flori\OneDrive\Desktop>Preischeck2.py
Traceback (most recent call last):
File "C:\Users\flori\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 588, in urlopen
conn = self._get_conn(timeout=pool_timeout)
File "C:\Users\flori\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 248, in _get_conn
return conn or self._new_conn()
File "C:\Users\flori\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 816, in _new_conn
raise SSLError("Can't connect to HTTPS URL because the SSL "
urllib3.exceptions.SSLError: Can't connect to HTTPS URL because the SSL module is not available.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\adapters.py", line 449, in send
timeout=timeout
File "C:\Users\flori\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 638, in urlopen
_stacktrace=sys.exc_info()[2])
File "C:\Users\flori\Anaconda3\lib\site-packages\urllib3\util\retry.py", line 398, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.mindfactory.de', port=443): Max retries exceeded with url: /product_info.php/AMD-Ryzen-5-2600X-6x-3-60GHz-So-AM4-BOX_1233731.html (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\flori\OneDrive\Desktop\preischeck2.py", line 15, in <module>
response = requests.get(url)
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\api.py", line 75, in get
return request('get', url, params=params, **kwargs)
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\api.py", line 60, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\sessions.py", line 533, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "C:\Users\flori\Anaconda3\lib\site-packages\requests\adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.mindfactory.de', port=443): Max retries exceeded with url: /product_info.php/AMD-Ryzen-5-2600X-6x-3-60GHz-So-AM4-BOX_1233731.html (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Fehler ist ja eindeutig, obwohl etwas komisch, bei Anaconda sollte eigentlich ein funktionierendes SSL dabei sein; wenn Du ihn unter Deiner Spyder-Umgebung nicht bekommst, dann hast Du da ein anders Python installiert.
sawyaz
User
Beiträge: 3
Registriert: Montag 17. Juni 2019, 19:03

Habe mal mit Anaconda unter Environtemts alles installiert was mit SSL zutun hat, bekomme aber immernoch die selbe Fehlermeldung
Antworten