In [118]:
import sys, requests, os, re, datetime
from bs4 import BeautifulSoup

# This is where the files are hosted
url= "http://www.leboncoin.fr/informatique/offres/ile_de_france/?ps=4&pe=8&q=thinkpad&th=1"

#inner_urls = []
#this'll be an array of dicionaries

Designed for computers, but could be used for anything I suppose with the right link Inside the link parameters:

  • th = photographs (0 = none)
  • ps = low price
  • pe = highest price
  • q = keywords (can take and/or operators, and more)

In [6]:
def scrape_listings(url):
    computers = []#set()# define array of listings
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    ordinateurs = soup.find_all("div", {"class":"lbc"}) # These are the unsifted listings
    x = 0 # Counter, Why not?
    for ordinateur in ordinateurs:
        url = ordinateur.find_parent('a')['href']
        #images need to be something like, if in class=image div, find img element 
        image_url = "" #ordinateur.find("img")['src'].text
        date = ordinateur.find("div", {'class':'date'}).text.replace('\n'," ").strip()
        details = ordinateur.find('div', {'class':'detail'})
        title = str(details.find('h2', {'class':'title'}).string).replace('\n', '').strip()
        category = str(details.find('div', {'class':'category'}).string).replace('\n', '').strip()
        placement = str(details.find('div', {'class':'placement'}).string).replace('\n', '').strip().replace('                                                                                            /                                                                                                                            	                                        '," ")
        price =  str(details.find('div', {'class':'price'}).string).replace('\n', '').strip()
        ## Images are a bit more complicated:
        try:
            image_div = ordinateur.find('div', {'class':'image'})
            image_nb = image_div.find('div', {'class':'image-and-nb'})
            image_url = image_nb.find('img')['src']
        except:
            image_url = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/No_image_available.svg/200px-No_image_available.svg.png" # No-image image        
        # The ordinateur has english attributes
        # et le computer avais les francais
        computer = {'url':url, 'titre': title, 'prix': price,'location': placement, 'image': image_url, 'date':date, 'category': category }
        #computer_set = {tuple(sorted(computer.items()))}
        # computer is a dictionary, so far lacking the actual url
        computers.append(computer)
        #x += 1
        #computers = computers  | computer_set
        #print(x)
    return computers

def get_recent(computers): # get the computers listed TODAY
    recent_computers = []
    for computer in computers:
        today = str(datetime.datetime.now().day) + '-' + str(datetime.datetime.now().month)
        c = re.compile('Aujourd\'hui')
        if c.match(computer['date']):
            computer['date'] = computer['date'].replace('Aujourd\'hui', today)
            computer = tuple(sorted(computer))            
            recent_computers.append(computer)
    return recent_computers

In [66]:
computers = scrape_listings(url)
len(computers)


Out[66]:
35

In [16]:
computer = computers[0]
computer.items()
print(sorted(computer.items()))
comp_set_0= tuple(sorted(computer.items()))

computer = computers[1]
computer.items()
print(sorted(computer.items()))
comp_set_1= tuple(sorted(computer.items()))

computer = computers[2]
computer.items()
print(sorted(computer.items()))
comp_set_2= tuple(sorted(computer.items()))

computer = computers[3]
computer.items()
print(sorted(computer.items()))
comp_set_3= tuple(sorted(computer.items()))

computer = computers[4]
computer.items()
print(sorted(computer.items()))
comp_set_3= tuple(sorted(computer.items()))


[('category', ''), ('date', "Aujourd'hui 19:33"), ('image', 'http://img0.leboncoin.fr/thumbs/b3b/b3b63e4c023f786309556297a964d14e92084094.jpg'), ('location', 'Rueil-Malmaison Hauts-de-Seine'), ('prix', '90\xa0€'), ('titre', 'PC portable LENOVO ThinkPad X61s'), ('url', 'http://www.leboncoin.fr/informatique/858391726.htm?ca=12_s')]

In [68]:
l_tuples = []
for x in computers:
    tup = tuple(sorted(x.items()))
    l_tuples.append(tup)

In [70]:
l_tuples[0]


Out[70]:
(('category', ''),
 ('date', "Aujourd'hui 20:06"),
 ('image',
  'http://img2.leboncoin.fr/thumbs/ae6/ae6c31c905ca993f806ad3c94f22489742e9898e.jpg'),
 ('location', 'Rueil-Malmaison Hauts-de-Seine'),
 ('prix', '100\xa0€'),
 ('titre', 'Pc portable ibm thinkpad t23'),
 ('url', 'http://www.leboncoin.fr/informatique/833961088.htm?ca=12_s'))

In [104]:


In [112]:
a_set = set()
b_set = set()

b_set.add(l_tuples[2]) # b is the total 
b_set.add(l_tuples[3])
b_set.add(l_tuples[4])
b_set.add(l_tuples[5])
b_set.add(l_tuples[6])
b_set.add(l_tuples[7])
a_set.add(l_tuples[0]) # latest entries
a_set.add(l_tuples[1])
a_set.add(l_tuples[2])
a_set.add(l_tuples[3])

c_set = a_set - b_set # take the items unique to a
# c is what we want to print
# must add it to the total set
b_set = a_set
print(len(list(c_set)))
print(len(list(b_set)))
#final_set = a_set - b_set

#print("\n")
#print(a_set)
#print("\n")
#print(b_set)
#print(c_set)


2
4

In [107]:



Out[107]:
({(('category', ''),
   ('date', "Aujourd'hui 10:04"),
   ('image',
    'http://img3.leboncoin.fr/thumbs/67e/67e1980ec1f599531738f74fd699360dd5899577.jpg'),
   ('location', 'Paris 14ème'),
   ('prix', '165\xa0€'),
   ('titre', 'Station d Accueil ThinkPad Pro Dock - Europe'),
   ('url', 'http://www.leboncoin.fr/informatique/858107873.htm?ca=12_s')),
  (('category', ''),
   ('date', "Aujourd'hui 14:37"),
   ('image',
    'http://img6.leboncoin.fr/thumbs/db2/db2c73bd6e690f8a544a2e196dcc75df171d931d.jpg'),
   ('location', 'Champs-sur-Marne Seine-et-Marne'),
   ('prix', '130\xa0€'),
   ('titre', 'Lenovo T400 2.4 Ghz / 2Gb RAM / 160 Go / Webcam'),
   ('url', 'http://www.leboncoin.fr/informatique/858234268.htm?ca=12_s')),
  (('category', '(pro)'),
   ('date', "Aujourd'hui 11:33"),
   ('image',
    'http://img7.leboncoin.fr/thumbs/b88/b887d733707479767ff838aeba11fb552838ec92.jpg'),
   ('location', "Sannois Val-d'Oise"),
   ('prix', '89\xa0€'),
   ('titre', 'Destockage PC portable DELL HP LENOVO ACER dès 89€'),
   ('url', 'http://www.leboncoin.fr/informatique/844651728.htm?ca=12_s')),
  (('category', '(pro)'),
   ('date', "Aujourd'hui 11:47"),
   ('image',
    'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/No_image_available.svg/200px-No_image_available.svg.png'),
   ('location', 'Montreuil Seine-Saint-Denis'),
   ('prix', '100\xa0€'),
   ('titre', 'Destockage Materiel Informatique occasion'),
   ('url', 'http://www.leboncoin.fr/informatique/855438789.htm?ca=12_s')),
  (('category', '(pro)'),
   ('date', "Aujourd'hui 14:35"),
   ('image',
    'http://img7.leboncoin.fr/thumbs/15d/15d3d289c93d8036cd37418433352e871d8c6093.jpg'),
   ('location', 'Clichy Hauts-de-Seine'),
   ('prix', '169\xa0€'),
   ('titre', 'Ordinateur portable pc DELL E6420 I5 /DVDRW/WIN7'),
   ('url', 'http://www.leboncoin.fr/informatique/817271293.htm?ca=12_s')),
  (('category', '(pro)'),
   ('date', "Aujourd'hui 16:40"),
   ('image',
    'http://img4.leboncoin.fr/thumbs/47a/47acb766f4c314bf22cd2f6aa59a6903ade639f4.jpg'),
   ('location', 'Clichy Hauts-de-Seine'),
   ('prix', '95\xa0€'),
   ('titre', 'Ordinateur portable FUJI mobile U9200 C2D/CAM/DVD'),
   ('url', 'http://www.leboncoin.fr/informatique/837929604.htm?ca=12_s'))},
 {(('category', ''),
   ('date', "Aujourd'hui 19:33"),
   ('image',
    'http://img0.leboncoin.fr/thumbs/b3b/b3b63e4c023f786309556297a964d14e92084094.jpg'),
   ('location', 'Rueil-Malmaison Hauts-de-Seine'),
   ('prix', '90\xa0€'),
   ('titre', 'PC portable LENOVO ThinkPad X61s'),
   ('url', 'http://www.leboncoin.fr/informatique/858391726.htm?ca=12_s')),
  (('category', ''),
   ('date', "Aujourd'hui 20:06"),
   ('image',
    'http://img2.leboncoin.fr/thumbs/ae6/ae6c31c905ca993f806ad3c94f22489742e9898e.jpg'),
   ('location', 'Rueil-Malmaison Hauts-de-Seine'),
   ('prix', '100\xa0€'),
   ('titre', 'Pc portable ibm thinkpad t23'),
   ('url', 'http://www.leboncoin.fr/informatique/833961088.htm?ca=12_s'))})

In [121]:
zero = list(c_set)[0]
one = list(c_set)[1]
len(c_set)
type(l_s)
#dict(l_s)
l_s


Out[121]:
[{'category': '',
  'date': "Aujourd'hui 19:33",
  'image': 'http://img0.leboncoin.fr/thumbs/b3b/b3b63e4c023f786309556297a964d14e92084094.jpg',
  'location': 'Rueil-Malmaison Hauts-de-Seine',
  'prix': '90\xa0€',
  'titre': 'PC portable LENOVO ThinkPad X61s',
  'url': 'http://www.leboncoin.fr/informatique/858391726.htm?ca=12_s'},
 {'category': '',
  'date': "Aujourd'hui 20:06",
  'image': 'http://img2.leboncoin.fr/thumbs/ae6/ae6c31c905ca993f806ad3c94f22489742e9898e.jpg',
  'location': 'Rueil-Malmaison Hauts-de-Seine',
  'prix': '100\xa0€',
  'titre': 'Pc portable ibm thinkpad t23',
  'url': 'http://www.leboncoin.fr/informatique/833961088.htm?ca=12_s'}]

In [110]:
dict(zero)


Out[110]:
{'category': '',
 'date': "Aujourd'hui 19:33",
 'image': 'http://img0.leboncoin.fr/thumbs/b3b/b3b63e4c023f786309556297a964d14e92084094.jpg',
 'location': 'Rueil-Malmaison Hauts-de-Seine',
 'prix': '90\xa0€',
 'titre': 'PC portable LENOVO ThinkPad X61s',
 'url': 'http://www.leboncoin.fr/informatique/858391726.htm?ca=12_s'}

In [40]:
a_set


Out[40]:
{(('category', ''),
  ('date', "Aujourd'hui 19:33"),
  ('image',
   'http://img0.leboncoin.fr/thumbs/b3b/b3b63e4c023f786309556297a964d14e92084094.jpg'),
  ('location', 'Rueil-Malmaison Hauts-de-Seine'),
  ('prix', '90\xa0€'),
  ('titre', 'PC portable LENOVO ThinkPad X61s'),
  ('url', 'http://www.leboncoin.fr/informatique/858391726.htm?ca=12_s')),
 (('category', ''),
  ('date', "Aujourd'hui 20:06"),
  ('image',
   'http://img2.leboncoin.fr/thumbs/ae6/ae6c31c905ca993f806ad3c94f22489742e9898e.jpg'),
  ('location', 'Rueil-Malmaison Hauts-de-Seine'),
  ('prix', '100\xa0€'),
  ('titre', 'Pc portable ibm thinkpad t23'),
  ('url', 'http://www.leboncoin.fr/informatique/833961088.htm?ca=12_s'))}

In [42]:
a_set[1]


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-42-99823fbb35ce> in <module>()
----> 1 a_set[1]

TypeError: 'set' object does not support indexing

In [37]:
type(a_set)


Out[37]:
set

In [27]:
for item in computers:
    if item in new_array:
        print(item)


{'prix': '95\xa0€', 'url': 'http://www.leboncoin.fr/informatique/837929604.htm?ca=12_s', 'image': 'http://img4.leboncoin.fr/thumbs/47a/47acb766f4c314bf22cd2f6aa59a6903ade639f4.jpg', 'category': '(pro)', 'date': '19-9 16:41', 'titre': 'Ordinateur portable FUJI mobile U9200 C2D/CAM/DVD', 'location': 'Clichy Hauts-de-Seine'}
{'prix': '169\xa0€', 'url': 'http://www.leboncoin.fr/informatique/817271293.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/15d/15d3d289c93d8036cd37418433352e871d8c6093.jpg', 'category': '(pro)', 'date': '19-9 14:38', 'titre': 'Ordinateur portable pc DELL E6420 I5 /DVDRW/WIN7', 'location': 'Clichy Hauts-de-Seine'}
{'prix': '140\xa0€', 'url': 'http://www.leboncoin.fr/informatique/856805605.htm?ca=12_s', 'image': 'http://img4.leboncoin.fr/thumbs/d4e/d4e72e222383b0802edae2c3968b718331d3e090.jpg', 'category': '', 'date': '19-9 13:39', 'titre': 'Lenovo x201', 'location': 'Essonne'}
{'prix': '89\xa0€', 'url': 'http://www.leboncoin.fr/informatique/844651728.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/b88/b887d733707479767ff838aeba11fb552838ec92.jpg', 'category': '(pro)', 'date': '19-9 11:47', 'titre': 'Destockage PC portable DELL HP LENOVO ACER dès 89€', 'location': "Sannois Val-d'Oise"}
{'prix': '80\xa0€', 'url': 'http://www.leboncoin.fr/informatique/856711650.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/0f9/0f962a5cbb565cdba64af622aa7fea45a99e4230.jpg', 'category': '', 'date': '19-9 10:17', 'titre': 'Lenovo tinkpad x200', 'location': "Ermont Val-d'Oise"}

In [29]:
for item in computers:
    if item in computers:
        print(item)


{'prix': '125\xa0€', 'url': 'http://www.leboncoin.fr/informatique/856927313.htm?ca=12_s', 'image': 'http://img3.leboncoin.fr/thumbs/370/37072403aaccf5311acd59cb938d94dc1c1e2e4a.jpg', 'category': '', 'date': '19-9 17:28', 'titre': 'Lenovo X201 Corei5 Webcam 4Go 160Go Batok', 'location': 'Paris 17ème'}
{'prix': '95\xa0€', 'url': 'http://www.leboncoin.fr/informatique/837929604.htm?ca=12_s', 'image': 'http://img4.leboncoin.fr/thumbs/47a/47acb766f4c314bf22cd2f6aa59a6903ade639f4.jpg', 'category': '(pro)', 'date': '19-9 16:41', 'titre': 'Ordinateur portable FUJI mobile U9200 C2D/CAM/DVD', 'location': 'Clichy Hauts-de-Seine'}
{'prix': '169\xa0€', 'url': 'http://www.leboncoin.fr/informatique/817271293.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/15d/15d3d289c93d8036cd37418433352e871d8c6093.jpg', 'category': '(pro)', 'date': '19-9 14:38', 'titre': 'Ordinateur portable pc DELL E6420 I5 /DVDRW/WIN7', 'location': 'Clichy Hauts-de-Seine'}
{'prix': '140\xa0€', 'url': 'http://www.leboncoin.fr/informatique/856805605.htm?ca=12_s', 'image': 'http://img4.leboncoin.fr/thumbs/d4e/d4e72e222383b0802edae2c3968b718331d3e090.jpg', 'category': '', 'date': '19-9 13:39', 'titre': 'Lenovo x201', 'location': 'Essonne'}
{'prix': '89\xa0€', 'url': 'http://www.leboncoin.fr/informatique/844651728.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/b88/b887d733707479767ff838aeba11fb552838ec92.jpg', 'category': '(pro)', 'date': '19-9 11:47', 'titre': 'Destockage PC portable DELL HP LENOVO ACER dès 89€', 'location': "Sannois Val-d'Oise"}
{'prix': '80\xa0€', 'url': 'http://www.leboncoin.fr/informatique/856711650.htm?ca=12_s', 'image': 'http://img7.leboncoin.fr/thumbs/0f9/0f962a5cbb565cdba64af622aa7fea45a99e4230.jpg', 'category': '', 'date': '19-9 10:17', 'titre': 'Lenovo tinkpad x200', 'location': "Ermont Val-d'Oise"}

In [30]:
for item in computers:
    if item in new_array:
        new_array.remove(item)

In [31]:
new_array


Out[31]:
[{'category': '',
  'date': '19-9 17:27',
  'image': 'http://img0.leboncoin.fr/thumbs/6e2/6e21aab7422aa842a04c9946b1391b27aa3965ee.jpg',
  'location': "Pontoise Val-d'Oise",
  'prix': '150\xa0€',
  'titre': 'Ibm lenovo t500 etat neuf',
  'url': 'http://www.leboncoin.fr/informatique/856926338.htm?ca=12_s'},
 {'category': '',
  'date': '19-9 16:37',
  'image': 'http://img0.leboncoin.fr/thumbs/7cb/7cbad8e23badc2788f0282ccdc786a60959a0f75.jpg',
  'location': 'Coubert Seine-et-Marne',
  'prix': '160\xa0€',
  'titre': 'Lenovo X201 I5 Vpro',
  'url': 'http://www.leboncoin.fr/informatique/856900406.htm?ca=12_s'},
 {'category': '',
  'date': '19-9 13:44',
  'image': 'http://img6.leboncoin.fr/thumbs/9cf/9cfbb2f29cc3daa7706dbc0a5c236c89a765363e.jpg',
  'location': 'Nogent-sur-Marne Val-de-Marne',
  'prix': '129\xa0€',
  'titre': 'Ordinateur -portable    -Lenovo-thinkpad-T61',
  'url': 'http://www.leboncoin.fr/informatique/856808334.htm?ca=12_s'},
 {'category': '(pro)',
  'date': '19-9 11:57',
  'image': 'https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/No_image_available.svg/200px-No_image_available.svg.png',
  'location': 'Montreuil Seine-Saint-Denis',
  'prix': '100\xa0€',
  'titre': 'Destockage Materiel Informatique occasion',
  'url': 'http://www.leboncoin.fr/informatique/855438789.htm?ca=12_s'},
 {'category': '',
  'date': '19-9 10:24',
  'image': 'http://img7.leboncoin.fr/thumbs/d51/d5120b4266c5a4cafa435607f0345a0340712c3d.jpg',
  'location': 'Paris 5ème',
  'prix': '150\xa0€',
  'titre': 'Lenovo T500 15,4" 4 Go 160 Go Très rapide',
  'url': 'http://www.leboncoin.fr/informatique/856715215.htm?ca=12_s'}]

In [ ]: