ich habe einen Scraper mitels Scrapy für ein Forum geschrieben, welcher aus dem jeweiligen Posttext auch bestimmte Begrifflichkeiten filtert und in eine SQL-Tabelle "contacts" mittels einer Pipeline von SQLAlchemy speichern soll. Hierzu habe ich zwei Fragen.
1.
Leider bekomme ich die richtige Syntax für das Filtern nicht hin, sodass doppelte Einträge nicht erfasst werden. Es werden beispielsweise E-Mail oder BTC-Adressen aus dem Text gefiltert und dem jeweiligen Author zugeordnet. Sollte der User die Adressen mehrfach posten oder beispielsweise in seiner Signatur haben, kommt diese ja öfters vor, ich möchte sie aber nur einmal speichern.
pipelines.py:
Code: Alles auswählen
def storeContacts(self, item, spider):
session = self.Session()
contactdb = ContactDB()
if not session.query(exists().where(ContactDB.user_id == item['user_id']).where(ContactDB.contact == item['contact'])).scalar():
contactdb.author = item["author"]
contactdb.user_id = item["user_id"]
contactdb.contact = item["contact"]
contactdb.medium = item["medium"]
contactdb.url = item["url"]
contactdb.post_id = item["post_id"]
try:
session.add(contactdb)
session.commit()
except:
session.rollback()
raise
finally:
session.close()
return item
2.
In dem Forum werden häufig innerhalb des Textes, des Titels als auch in manchen Usernamen Icons (Sterne, Flammen u.Ä.) verwendet, welche so nicht in der Datenbank gespeichert werden können. Gibt es eine andere Möglichkeit als im Vorgang alles mittel beispielsweise UTF-8 zu encodieren also z.B.
Code: Alles auswählen
title = response.xpath('...').extract_first()
title = str(title).encode('utf-8', 'strict')
title = str(title)
Vielen Dank für eure Unterstützung!