Skip to content

Instantly share code, notes, and snippets.

@p3t3r67x0
Last active November 12, 2018 18:45
Show Gist options
  • Save p3t3r67x0/81658b81653553f0f79902317f905675 to your computer and use it in GitHub Desktop.
Save p3t3r67x0/81658b81653553f0f79902317f905675 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys
import uuid
import requests
from lxml import html
from sqlalchemy import create_engine, Column, Integer, String, UniqueConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import sessionmaker
from fake_useragent import UserAgent
from urlparse import urljoin
from bs4 import BeautifulSoup
base = declarative_base()
class Pharmacy(base):
__tablename__ = 'pharmacy'
__table_args__ = tuple(UniqueConstraint('name', 'adr', name='uix_1'))
id = Column('id', String(20), primary_key=True)
name = Column('name', String(250))
adr = Column('adr', String(250))
zip = Column('zip', Integer)
city = Column('city', String(80))
tel = Column('tel', String(80))
def connect_database():
return create_engine('postgresql://<user>:<password>@localhost:5432/apotheken')
def replace_htmlchars(data):
return data.replace('&#192;', u'À').replace('&#193;', u'Á').replace('&#194;', u'Â').replace('&#195;', u'Ã').replace('&#196;', u'Ä').replace('&#197;', u'Å').replace('&#198;', u'Æ').replace('&#199;', u'Ç').replace('&#200;', u'È').replace('&#201;', u'É').replace('&#202;', u'Ê').replace('&#203;', u'Ë').replace('&#204;', u'Ì').replace('&#205;', u'Í').replace('&#206;', u'Î').replace('&#207;', u'Ï').replace('&#208;', u'Ð').replace('&#209;', u'Ñ').replace('&#210;', u'Ò').replace('&#211;', u'Ó').replace('&#212;', u'Ô').replace('&#213;', u'Õ').replace('&#214;', u'Ö').replace('&#215;', u'×').replace('&#216;', u'Ø').replace('&#217;', u'Ù').replace('&#218;', u'Ú').replace('&#219;', u'Û').replace('&#220;', u'Ü').replace('&#221;', u'Ý').replace('&#222;', u'Þ').replace('&#223;', u'ß').replace('&#224;', u'à').replace('&#225;', u'á').replace('&#226;', u'â').replace('&#227;', u'ã').replace('&#228;', u'ä').replace('&#229;', u'å').replace('&#230;', u'æ').replace('&#231;', u'ç').replace('&#232;', u'è').replace('&#233;', u'é').replace('&#234;', u'ê').replace('&#235;', u'ë').replace('&#236;', u'ì').replace('&#237;', u'í').replace('&#238;', u'î').replace('&#239;', u'ï').replace('&#240;', u'ð').replace('&#241;', u'ñ').replace('&#242;', u'ò').replace('&#243;', u'ó').replace('&#244;', u'ô').replace('&#245;', u'õ').replace('&#246;', u'ö').replace('&#247;', u'÷').replace('&#248;', u'ø').replace('&#249;', u'ù').replace('&#250;', u'ú').replace('&#251;', u'û').replace('&#252;', u'ü').replace('&#253;', u'ý').replace('&#254;', u'þ').replace('&#255;', u'ÿ').replace('&#180;', u'´')
def load_document(url, query, ua, db):
headers = {
'User-Agent': ua.google
}
payload = {
'q_apotheke': 'on',
'q_ort': 'on',
'q_plz': 'on',
'q_strasse': 'on',
'suchbegriffe': query,
'suchmodus': 'volltext'
}
try:
r = requests.post(url, data=payload, timeout=3, headers=headers)
if r.status_code == 200:
r.encoding = 'ISO-8859-1'
extract_address(r.content, db)
except requests.exceptions.ReadTimeout as e:
print e
def extract_address(doc, db):
soup = BeautifulSoup(doc, 'html.parser')
r = soup.find_all('div', class_='apoinfo apoinfo-hover')
for a in r:
d = html.document_fromstring(a.prettify())
tel_data = d.xpath('//div[@class="slider"]/div[2]/p/text()')
apo_data = d.xpath('//div[@class="apotheke"]/div/p/strong/text()')
adr_data = d.xpath('//div[@class="apotheke"]/div/p/text()')
apo = apo_data[0].replace('\n', '').strip()
adr = adr_data[1].split(',')[1].replace('\n', '').strip()
zip = adr_data[1].split(',')[2].replace('\n', '').strip().split(' ')[0]
city = adr_data[1].split(',')[2].replace('\n', '').strip().split(' ')[1]
tel = tel_data[0].replace('\n', '').strip().replace('Tel.: ', '')
print u'{}\n{}\n{} {}\n{}\n'.format(apo, adr, zip, city, tel, db)
insert_one(apo, adr, zip, city, tel, db)
def insert_one(apo, adr, zip, city, tel, db):
Session = sessionmaker(db)
session = Session()
id = str(uuid.uuid4()).split('-')[4]
try:
insert = Pharmacy(id=id, name=apo, adr=adr, zip=zip, city=city, tel=tel)
session.add(insert)
session.commit()
except IntegrityError as e:
print e
def main():
db = connect_database()
Session = sessionmaker(db)
session = Session()
base.metadata.create_all(db)
ua = UserAgent()
load_document('https://www.aknr.de/service/apotheken.php', sys.argv[1], ua, db)
if __name__ == '__main__':
main()
#!/usr/bin/env python
import sys
import requests
from lxml import html
from fake_useragent import UserAgent
from urlparse import urljoin
def replace_htmlchars(data):
return data.replace('&#192;', u'À').replace('&#193;', u'Á').replace('&#194;', u'Â').replace('&#195;', u'Ã').replace('&#196;', u'Ä').replace('&#197;', u'Å').replace('&#198;', u'Æ').replace('&#199;', u'Ç').replace('&#200;', u'È').replace('&#201;', u'É').replace('&#202;', u'Ê').replace('&#203;', u'Ë').replace('&#204;', u'Ì').replace('&#205;', u'Í').replace('&#206;', u'Î').replace('&#207;', u'Ï').replace('&#208;', u'Ð').replace('&#209;', u'Ñ').replace('&#210;', u'Ò').replace('&#211;', u'Ó').replace('&#212;', u'Ô').replace('&#213;', u'Õ').replace('&#214;', u'Ö').replace('&#215;', u'×').replace('&#216;', u'Ø').replace('&#217;', u'Ù').replace('&#218;', u'Ú').replace('&#219;', u'Û').replace('&#220;', u'Ü').replace('&#221;', u'Ý').replace('&#222;', u'Þ').replace('&#223;', u'ß').replace('&#224;', u'à').replace('&#225;', u'á').replace('&#226;', u'â').replace('&#227;', u'ã').replace('&#228;', u'ä').replace('&#229;', u'å').replace('&#230;', u'æ').replace('&#231;', u'ç').replace('&#232;', u'è').replace('&#233;', u'é').replace('&#234;', u'ê').replace('&#235;', u'ë').replace('&#236;', u'ì').replace('&#237;', u'í').replace('&#238;', u'î').replace('&#239;', u'ï').replace('&#240;', u'ð').replace('&#241;', u'ñ').replace('&#242;', u'ò').replace('&#243;', u'ó').replace('&#244;', u'ô').replace('&#245;', u'õ').replace('&#246;', u'ö').replace('&#247;', u'÷').replace('&#248;', u'ø').replace('&#249;', u'ù').replace('&#250;', u'ú').replace('&#251;', u'û').replace('&#252;', u'ü').replace('&#253;', u'ý').replace('&#254;', u'þ').replace('&#255;', u'ÿ').replace('&#180;', u'´')
def load_document(url, ua):
h = headers = {
'User-Agent': ua.google
}
r = requests.post(url, headers=headers)
if r.status_code == 200:
extract_address(r.content)
extract_links(url, r.content, ua)
def extract_links(url, doc, ua):
d = html.fromstring(doc)
r = d.xpath('//li[@class="category"]/a/@href')
a = []
for l in r:
a.append(l)
for i in set(a):
p = i.lstrip('-')
u = urljoin(url, p)
load_document(u, ua)
def extract_address(doc):
d = html.fromstring(doc)
r = d.xpath('//div[@class="box_adress"]')
for a in r:
apo = a.xpath('./h2/text()')[0]
adr = a.xpath('./p[@class="adress"]/text()')
tel = a.xpath('./p[@class="contact"]/text()')[0].strip().replace('Tel.:', '').replace(' ', '').replace('\n', '')
print u'{}\n{}\n{}\n{}\n'.format(apo, adr[0], adr[1], tel)
def main():
ua = UserAgent()
load_document(sys.argv[1], ua)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment