Code en vrac

Data scraping: les Unes de sites d'info en direct

Avec Python et la bibliothèque Beautiful Soup, gratter le web est devenu un jeu d'enfant! 

Ce script se connecte à plusieurs sites d'information et récupère le titre qui fait la Une et l'affiche sur le terminal d'où est lancé le programme.


# -*- coding: utf8 -*-
import time
import urllib2
from bs4 import BeautifulSoup
import re

class CrawlerTitreUne:
	def __init__(self, media, url, delimiters):
		self.media = media
		self.url = url
		self.delimiters = delimiters
		#self.last =  last
	def content(self):
		try:
			req = urllib2.Request(self.url)
			response = urllib2.urlopen(req)
			if self.media in('figaro'): return response.read()
			else: return BeautifulSoup(response.read())
		except:
			print(":::  ", self.url)
			pass
	def __repr__(self, titre):
		print(time.strftime("%c"), self.media , '\n'+titre)
		print('\n\n')
	def titre(self):
		if self.content():
			if self.media in ('liberation'):
				titre_courant = self.content().find(self.delimiters[0])
				return [titre_courant.find('a').get('href'), titre_courant.find('a').text.strip().replace('\n', '')]
			elif self.media in ('post'):
				results = self.content().findAll('h1')[1]
				titre = results.findAll('a')
				tampon = ''
				for t in titre:
					if t.text: tampon += t.text.replace('\n', '').replace('\t', '').replace('\r', '')
				return [results.find('a').get('href'), tampon]

			elif self.media in ('figaro'):
				html = self.content()
				i = html.find(';<h2 class="fig-profil-headline";>;<a title=')
				lien = ''
				while 'href="' not in lien:
					lien += html[i]
					i+=1
				lien = ''
				while html[i] != '"':
					lien+= html[i]
					i += 1
				i += 2
				titre_courant = ''
				while html[i] != ';<':
					titre_courant += html[i]
					i += 1
				return [lien, titre_courant]
			else:				
				titre_courant = self.content().find(self.delimiters[0], 
									attrs={self.delimiters[1] : self.delimiters[2]})
				return [titre_courant.find('a').get('href'), 
			re.sub(r'   \d+', '', titre_courant.find('a').text.strip().replace('\n', ''))]
	def pending(self):
			return self.titre()


ti = CrawlerTitreUne('parisien', 'http://leparisien.fr', ['article', 'class', 'article-une clearfix '])
print([x.encode('utf8') for x in ti.pending()])


On peut ainsi créer un crawler par site et lancer le tout via un multi thread