Permalänk
Medlem

Bevaka blocket

Hej!

Har googlat till vansinne men hittar ingen lösning på min fråga.

Jag skulle vilja bevaka vissa grejer som kommer upp på blocket och bli notifierad om detta, endast för privat bruk.

Jag sitter på en linux burk där jag pushar ut en hel del grejer via prowl till min iphone via kommandot "| i.sh" .

Så, vad jag skulle vilja göra är att via t.ex. python parsa url:en http://www.blocket.se/stockholm?q=gant&cg=4080&w=1&st=s&cs=2&...

Kolla om det har kommit en ny annons sen förra kollen, om ja - pusha ut Namn, pris & länk till min iphone via "| i.sh" .

Någon som har något kreativt förslag på hur detta kan lösas?

Visa signatur

.

Permalänk

Förlåt om jag missar något men blockets egen iphneapp har ju en helt okej egen bevakningsfunktion. Själv kan jag väldigt lite linux så ska inte ens försöka hjälpa till där

Lycka till!

Visa signatur

[Moderkort: ASUS P8Z68 v-PRO] - [CPU: Intel i5 2500K @ 4.6 GHz] - [Kylning: Corsair H100 @ 58*C 6h Prime95] [Minnen: Corsair XMS3 CL9 2x4 @ 1333mhz] - [GPU: ASUS 560ti DCU II TOP 1GB @ 990mhz] [SSD: OCZ Agility 3 120GB] - [Chassi: Corsair Obsidian 650d] - [Övrigt: Dell U2311H - Steelseries Siberia v2 - Steelseries 6gV2 - Logitech MX510]

Permalänk
Medlem

Tog en snabb titt på blocket efter om dom hade RSS-stöd men ikke... de hade underlättat en hel del och parsa data... Hur som, så finns det ett biblotek tilll Python som heter beautifulsoap lr något sådant, vilket underlättar att plocka ut specifik data ur exmp webbsidor och dylikt. Inget jag orkar sätta mig och koda åt dig bara sådär, men du kan hojta till om du behöver nå hjälp med det!

Permalänk

Tänkte pilla ihop något kul med YQL, men det tyckte blocket tydligen inte att man skulle göra.
"Redirected to a robots.txt"

Permalänk
Medlem

bladezkin: Japp, men bevakningen kräver att man måste in i appen hela tiden. Jag vill ha infon pushad till mig

mel0dy: Dom är jävliga

sweacker: Hittade detta, men får det inte att lira. Några ideer?

import sgmllib import BeautifulSoup import os import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email import Encoders import urllib, sgmllib import datetime import time gmail_user = "blabla" gmail_pwd = "password" def mail(to, subject, text): msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = gmail_user msg['Subject'] = subject msg.attach(MIMEText(text)) mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user, gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) mailServer.close() class MyParser(sgmllib.SGMLParser): def parse(self, s): self.feed(s) self.close() def __init__(self, verbose=0): sgmllib.SGMLParser.__init__(self, verbose) self.hyperlinks = [] self.inside_a_element = 0 def start_a(self, attributes): for name, value in attributes: if name == "href": if(value[:31] == "http://www.blocket.se/goteborg/"): if(value.find('?') == -1 ): self.hyperlinks.append(value) self.inside_a_element = 1 def end_a(self): self.inside_a_element = 0 def get_hyperlinks(self): return self.hyperlinks if __name__ == '__main__': while True : f = urllib.urlopen("http://www.blocket.se/goteborg/lagenheter?ca=15&cg=3020&l=0&w...") s = f.read() soup = BeautifulSoup.BeautifulSoup(s) aa = soup.find("div", attrs={"class" : "grid"}) myparser = MyParser() myparser.parse(s) new_list = list(set(myparser.get_hyperlinks())) existing_list =[] first_run = False; try: f = open('urls.txt','r') existing_list = f.readlines() f.close() except IOError: first_run = True for i,object in enumerate(existing_list): existing_list[i] = existing_list[i].split('\n')[0] for new_elem in new_list: exists = False for ex_elem in existing_list: if (cmp(ex_elem, new_elem) == 0): exists = True break if(exists == False): print new_elem f = open('urls.txt','a') f.write(new_elem+'\n') f.close() if (first_run == False): mail(gmail_user, "New Ad in Blocket!", new_elem) print "Attempted to get new values at :" + datetime.datetime.now().isoformat(' ') time.sleep(10)

Visa signatur

.

Permalänk
Medlem

du kan dock spara annonser om du gör ett konto hos blocket genom att trycka spara annons längst ner av den annonsen du vill spara. Finns även en viss sökfunktion du kan bevaka nya annonser med, och få sms av blocket när någon ny annons kommit upp. (Om jag förstått det rätt)

Permalänk
Medlem

Här har du lite kod som borde göra ungefär det du vill att den ska göra.
BeautifulSoup är helt kass nuförtiden sedan de bytte parser, så jag använde mig av lxml istället.
Har ingen aning om vad det där prowl vill ha för form av input, men det är bara att ändra sista raden i det här scriptet så att det passar.

#!/usr/bin/env python # -*- coding: utf-8 -*- import sqlite3 import urllib2 import lxml.html URL_TO_MONITOR = "http://www.blocket.se/stockholm?q=gant&cg=4080&w=1&st=s&cs=2&..." PATH_TO_DATABASE = "database.sqlite" # Download html response_string = urllib2.urlopen(URL_TO_MONITOR).read() # Turn html into something useful doc = lxml.html.document_fromstring(response_string) # Open connection to database conn = sqlite3.connect(PATH_TO_DATABASE) conn.row_factory = sqlite3.Row cc = conn.cursor() # Create the items table if it doesn't exist yet cc.execute("CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY)") conn.commit() # Parse the html adding any not already added item to the 'items' list items = [] raw_items = doc.find_class("item_row") for r in raw_items: item_id = r.attrib["id"][5:] cc.execute("SELECT id FROM items WHERE id=(?)", [item_id]) stored_item = cc.fetchone() if not stored_item: cc.execute("INSERT INTO items(id) VALUES (?)", [item_id]) conn.commit() desc = r.find_class("desc")[0] name = r.find_class("item_link")[0].text_content().encode("utf-8") link = r.find_class("item_link")[0].get("href") price = r.find_class("list_price")[0].text_content() items.append([name, price, link]) # Close the database connection conn.close() # Print the result for item in items: print("{},{},{}".format(item[0], item[1], item[2]))

Permalänk

Haha jag läste "bevara blocket". Som om de skulle lägga ned och vi skulle signa en petition

xD var bara tvungen att tillägga

Permalänk
Glömsk

Få ut alla länkar på sidan kan du göra exempelvis med

curl -s "http://www.blocket.se/stockholm?q=gant&cg=4080&w=1&st=s&cs=2&..." | # Ladda ner dokumentet iconv -f iso-8859-1 -t utf-8 | # Konvertera det till UTF-8 grep item_link | # Plocka ut alla länkar sed -e 's/.*href="//' -e 's/">.*//' # Radera HTML:en

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Skrivet av hhnrk:

Här har du lite kod som borde göra ungefär det du vill att den ska göra.
BeautifulSoup är helt kass nuförtiden sedan de bytte parser, så jag använde mig av lxml istället.
Har ingen aning om vad det där prowl vill ha för form av input, men det är bara att ändra sista raden i det här scriptet så att det passar.

#!/usr/bin/env python # -*- coding: utf-8 -*- import sqlite3 import urllib2 import lxml.html URL_TO_MONITOR = "http://www.blocket.se/stockholm?q=gant&cg=4080&w=1&st=s&cs=2&..." PATH_TO_DATABASE = "database.sqlite" # Download html response_string = urllib2.urlopen(URL_TO_MONITOR).read() # Turn html into something useful doc = lxml.html.document_fromstring(response_string) # Open connection to database conn = sqlite3.connect(PATH_TO_DATABASE) conn.row_factory = sqlite3.Row cc = conn.cursor() # Create the items table if it doesn't exist yet cc.execute("CREATE TABLE IF NOT EXISTS items(id INTEGER PRIMARY KEY)") conn.commit() # Parse the html adding any not already added item to the 'items' list items = [] raw_items = doc.find_class("item_row") for r in raw_items: item_id = r.attrib["id"][5:] cc.execute("SELECT id FROM items WHERE id=(?)", [item_id]) stored_item = cc.fetchone() if not stored_item: cc.execute("INSERT INTO items(id) VALUES (?)", [item_id]) conn.commit() desc = r.find_class("desc")[0] name = r.find_class("item_link")[0].text_content().encode("utf-8") link = r.find_class("item_link")[0].get("href") price = r.find_class("list_price")[0].text_content() items.append([name, price, link]) # Close the database connection conn.close() # Print the result for item in items: print("{},{},{}".format(item[0], item[1], item[2]))

Hej!

Tack, men jag får ingen output från denna? Alla komponenter är installerade i python.
Min tanke är att köra

$ python script.py | i.sh

där outputen tas upp i "i.sh" som $message och skickas då via Prowl.

Alternativt ett annat script som ser ut som här nedan

curl https://prowlapp.com/publicapi/add -F apikey=myAPIKey -F application=test -F event=test2 -F description=test3

Där application=name
event=price
description=link

Någon som kan hjälpa mig modifiera detta?

Stort tack för all hjälp hittills!

Visa signatur

.

Permalänk
Medlem

Det löste sig. Tack för hjälpen!

Visa signatur

.