Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

[Python] BeautifulSoup

Pagina: 1
Acties:

Vraag


  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
Hi,

Ik heb een script geschreven die bepaalde secties van een website in de gaten houdt en bij een wijziging een melding maakt.

Ik loop echter vast in het stukje x-path.
Hieronder het gedeelte waar ik vast loop:

code:
1
2
3
4
5
# Set the target URL and request the site and look for the ID tag
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
#event_string = str(soup.find('div', id='content'))
event_string = str(soup.find_all("div",{"class": "mp-Nav-breadcrumb-item"}, id='content'))


En hierbij de volledige code:

code:
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
import http.client, urllib
import smtplib
import bs4
import requests
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

titel = "Marktplaats - iPhone"
url = "https://www.marktplaats.nl/q/iphone/#postcode:XXXX|searchInTitleAndDescription:true"

try:
        conn = http.client.HTTPSConnection("api.pushover.net:443")
        conn.request("POST", "/1/messages.json",
                urllib.parse.urlencode({ "token":
                        "jkww2erh", "user":
                        "x8d1vsixo",
                        "sound": "cosmic",
                        "title": titel + " - Change Detection Gestart.", "message": "Initieel bericht, monitoring gestart.",
                }), { "Content-type": "application/x-www-form-urlencoded" })
        conn.getresponse()



except Exception as e:
        print (titel + " - Initiele Pushover kon niet worden verzonden, zijn de instellingen wel goed?")
        print(e)
        exit()


# Set the target URL and request the site and look for the ID tag
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
#event_string = str(soup.find('div', id='content'))
event_string = str(soup.find_all("div",{"class": "mp-Nav-breadcrumb-item"}, id='content'))



# Start a loop where we check the site again
while True:
        time.sleep(30)
        source = requests.get(url).text
        soup = bs4.BeautifulSoup(source,'html.parser')
        event_string_new = str(soup.find_all("div",{"class": "mp-Nav-breadcrumb-item"}, id='content'))

        # If the html of the form has changed trigger the Pushover!
        if event_string!=event_string_new:
                try:
                # SEND THE PUSHOVER!!!!
                        conn = http.client.HTTPSConnection("api.pushover.net:443")
                        conn.request("POST", "/1/messages.json",
                                urllib.parse.urlencode({ "token":
                                        "kww2erh", "user":
                                        "d1vsixo",
                                        "sound": "cosmic",
                                        "title": titel + " - Change Detected", "message": "De website lijkt gewijzigd, notificatie actief.",
                                }), { "Content-type": "application/x-www-form-urlencoded" })
                        conn.getresponse()
                        event_string = event_string_new
                except:
                        print (titel + " - Something went wrong sending the Pushover when a changed was discovered...")


Ik ben blind gestaard inmiddels. BTW Feel free to use it voor jezelf.
Overigens gebruik ik nu Marktplaats voor demo doeleinden.

Alle reacties


  • Ed Vertijsment
  • Registratie: juli 2014
  • Laatst online: 12:47
En wat werkt er niet of waar loop je tegenaan?

  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
Ed Vertijsment schreef op zondag 21 februari 2021 @ 17:08:
En wat werkt er niet of waar loop je tegenaan?
De bedoeling is dat hij naar die div met dat ID kijkt en dat vergelijkt met de vorige waarde. Echter, ik vrees dat hij de content niet goed uitleest (aantal gevonden items).

  • jammo
  • Registratie: november 2020
  • Laatst online: 18-06 10:17
Maar wat gebeurd er dan precies? Het is mij niet helemaal duidelijk?
Komt er in de variabele event_string niet te staan wat je verwacht?

Wij weten natuurlijk niet wat de bedoeling van jou script is en waar je tegenaan loopt.
(foutmeldingen? Ergens output die volgens jou niet klopt?)
zonder dat we zelf dit script gaat draaien weten we dus nog steeds niks, maar ook al zou iemand dit script wel zelf draaien dan is het zonder dat we weten wat de bedoeling is nog niet duidelijk wat het probleem is.

Je geeft nu dus aan (met een paar regels code) dit is waar ik vast loop, maar je geeft bij dat stuk niet aan wat je verwacht dat er gebeurd en wat er daadwerkelijk gebeurd.

  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
jammo schreef op maandag 22 februari 2021 @ 13:15:
Maar wat gebeurd er dan precies? Het is mij niet helemaal duidelijk?
Komt er in de variabele event_string niet te staan wat je verwacht?

Wij weten natuurlijk niet wat de bedoeling van jou script is en waar je tegenaan loopt.
(foutmeldingen? Ergens output die volgens jou niet klopt?)
zonder dat we zelf dit script gaat draaien weten we dus nog steeds niks, maar ook al zou iemand dit script wel zelf draaien dan is het zonder dat we weten wat de bedoeling is nog niet duidelijk wat het probleem is.

Je geeft nu dus aan (met een paar regels code) dit is waar ik vast loop, maar je geeft bij dat stuk niet aan wat je verwacht dat er gebeurd en wat er daadwerkelijk gebeurd.
Ja, het overbrengen van wat er zich in mijn hoofd afspeelt is soms lastig.
Als ik dit script run, dan haalt hij geen inhoud op. Hij result met waarde: None en soms met [].
Ik krijg het echter niet voor elkaar om de inhoud uit te lezen. Is het nu duidelijk(er) ? :)

  • jammo
  • Registratie: november 2020
  • Laatst online: 18-06 10:17
Klopt het filter dat je meegeeft bij find_all?
En zit hetgeen dat je zoekt ook in de pagina waarin je het zoekt?

  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
Ik ga het proberen iets makkelijker uit te leggen:


code:
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
import http.client, urllib
import smtplib
import bs4
import requests
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

titel = "Alle Storingen - KPN"
url = "https://allestoringen.nl/storing/kpn/"

try:
        conn = http.client.HTTPSConnection("api.pushover.net:443")
        conn.request("POST", "/1/messages.json",
                urllib.parse.urlencode({ "token":
                        "kww2erh", "user":
                        "x8d1vsixo",
                        "sound": "cosmic",
                        "title": titel + " - Change Detection Gestart.", "message": "Initieel bericht, monitoring gestart.",
                }), { "Content-type": "application/x-www-form-urlencoded" })
        conn.getresponse()



except Exception as e:
        print (titel + " - Initiele Pushover kon niet worden verzonden, zijn de instellingen wel goed?")
        print(e)
        exit()


# Set the target URL and request the site and look for the ID tag
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
event_string = str(soup.find(text='Er is geen storing bij KPN'))

print (event_string)



# Start a loop where we check the site again
while True:
        time.sleep(300)
        source = requests.get(url).text
        soup = bs4.BeautifulSoup(source,'html.parser')
        #event_string_new = str(soup.find_all("div",{"class": "mp-Nav-breadcrumb-item"}, id='content'))
        event_string_new = str(soup.find(text='Er is geen storing bij KPN'))

        # If the html of the form has changed trigger the Pushover!
        if event_string!=event_string_new:
                try:
                # SEND THE PUSHOVER!!!!
                        conn = http.client.HTTPSConnection("api.pushover.net:443")
                        conn.request("POST", "/1/messages.json",
                                urllib.parse.urlencode({ "token":
                                        "kww2erh", "user":
                                        "bx8d1vsixo",
                                        "sound": "cosmic",
                                        "title": titel + " - Change Detected", "message": "De website lijkt gewijzigd, notificatie actief.",
                                }), { "Content-type": "application/x-www-form-urlencoded" })
                        conn.getresponse()
                        event_string = event_string_new
                except:
                        print (titel + " - Something went wrong sending the Pushover when a changed was discovered...")


Dit script checkt op https://allestoringen.nl/storing/kpn/ en kijkt naar de tekst: "Er is geen storing bij KPN".
Echter;

code:
1
2
3
4
5
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
event_string = str(soup.find(text='Er is geen storing bij KPN'))

print (event_string)


Resulteert in: None, ik heb al meerdere opties uitgetest maar ik krijg de inhoud niet gevonden.

  • RayNbow
  • Registratie: maart 2003
  • Laatst online: 15:22

RayNbow

Kirika <3

leconnaisseur schreef op maandag 22 februari 2021 @ 13:43:

Dit script checkt op https://allestoringen.nl/storing/kpn/ en kijkt naar de tekst: "Er is geen storing bij KPN".
Echter;

code:
1
2
3
4
5
source = requests.get(url).text
soup = bs4.BeautifulSoup(source,'html.parser')
event_string = str(soup.find(text='Er is geen storing bij KPN'))

print (event_string)


Resulteert in: None, ik heb al meerdere opties uitgetest maar ik krijg de inhoud niet gevonden.
Doe eens voor de gein:
Python:
1
print(soup.text)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
RayNbow schreef op maandag 22 februari 2021 @ 13:49:
[...]

Doe eens voor de gein:
Python:
1
print(soup.text)
:+

En nu? Da's mooi ruk eigenlijk (lees: maakt het een stuk gecompliceerder). Kan ik hier omheen werken?

Thanks in ieder geval!

  • jammo
  • Registratie: november 2020
  • Laatst online: 18-06 10:17
Je maakt het natuurlijk niet makkelijker als je halverwege je topic het ineens over een andere pagina gaat hebben..

Wat betreft het probleem waar je mee bent begonnen, blijft mijn vraag dus nog staan:
Klopt het filter dat je meegeeft bij find_all?
En zit hetgeen dat je zoekt ook in de pagina waarin je het zoekt?

Je script werkt nu precies zoals je wil:
In het marktplaats geval zoek je naar een div, met id content en de class mp-Nav-breadcrumb-item, die bestaat niet en dus krijg je geen resultaat.
In je voorbeeld met alle storingen kom je eerst op een check pagina uit en dus wordt de content die je zoekt niet gevonden (die bestaat daar niet) en dus krijg je geen resultaat.


Voor je oorspronkelijke probleem -> bekijk de pagina eens goed en zorg ervoor dat je filter klopt (vandaar dat ik de vraag stelde klopt die)
Voor je tweede probleem, of je er omheen kunt werken ligt voornamelijk aan jouw kennis en hoeveel tijd je erin wilt steken.

  • RayNbow
  • Registratie: maart 2003
  • Laatst online: 15:22

RayNbow

Kirika <3

leconnaisseur schreef op maandag 22 februari 2021 @ 13:52:
[...]


:+

En nu? Da's mooi ruk eigenlijk (lees: maakt het een stuk gecompliceerder). Kan ik hier omheen werken?

Thanks in ieder geval!
De belangrijkste les is in ieder geval om tussentijdse resultaten ook te inspecteren tijdens het debuggen.

Het er omheen werken verschilt enorm per site en is niet iets waar ik je mee kan helpen. Het minimale wat je kunt doen is je voor te doen als een andere browser:

Python:
1
2
USER_AGENT = 'Mozilla/5.0 [...vul hier de user agent string in van je favoriete browser...]'
source = requests.get(url, headers={'User-agent': USER_AGENT}).text

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • leconnaisseur
  • Registratie: februari 2019
  • Laatst online: 19-06 22:25
RayNbow schreef op maandag 22 februari 2021 @ 14:16:
[...]

De belangrijkste les is in ieder geval om tussentijdse resultaten ook te inspecteren tijdens het debuggen.

Het er omheen werken verschilt enorm per site en is niet iets waar ik je mee kan helpen. Het minimale wat je kunt doen is je voor te doen als een andere browser:

Python:
1
2
USER_AGENT = 'Mozilla/5.0 [...vul hier de user agent string in van je favoriete browser...]'
source = requests.get(url, headers={'User-agent': USER_AGENT}).text
Superbedankt voor het meedenken, ik ga ermee aan de slag!
Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True