Scrapping vers Wordpress

Rédigé par jeromef aucun commentaire


04 septembre 2014 Python, tutoriel aucun


Je blog ici sur différents sujets et je souhaitais regrouper certains articles (tous ceux concernant l'apiclock) uniquement sur un autre blog à côté.
Je vous détaille ici mon script python pour :
  • Scrapper un blog avec condition
  • Ne récupérer que les nouveaux articles
  • Envoyer tout ca sur un wordpress


Je me suis servi de : Les imports dont on a besoin :
(et la ligne d'instanciation du client python-wordpress-xmlrpc... à mettre à jour avec vos paramètres

 #!/usr/bin/python
# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import urllib2, codecs
import re
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import posts

# connection au wp
    client = Client('http://url_de_votre_wordpress.com/xmlrpc.php', 'user_admin', 'password_admin')

Scrapping (des titres + extrait + url des articles) avec BEAUTIFULSOUP

Pour récupérer les articles depuis une url avec BeautifulSoup :

    base = urllib2.urlopen('http://jblablablabla').read()
    soup = BeautifulSoup(base)
    elements = soup.findAll("div", { "id" : re.compile("^post") })
La dernière ligne indique :
Sélectionne dans la page récupérée toutes les balises div ayant un id commençant par "post".
En effet sur mon blog (http://jeromefiot.fr/index.php?blog) les débuts d'articles de cette page sont encadrés par une balise de la forme:
div id="post-23" 

Traitement

Afin de n'avoir à chaque passage du script que les nouveaux titres, je stock les résultats (uniquement la ligne de titre) dans un fichiers txt à côté (pas besoin d'une base pour ça):

    # on crée pour ensuite insérer les titres dans une liste 
    ltitre = []
    # on charge les titres précédemment scrappés dans loldtitre en parcourant chaque ligne du fichier
    fichier = codecs.open("titres.txt", "r")
    loldtitre = fichier.readlines()
    # On vérifie que ce n'est pas le premier passage (et si c'est le cas on passe cette étape)
    if len(loldtitre)==0:
        pass
    else:
        # Pour chaque ligne on la ré écrit en la décodant en UTF8 (la j'ai pataugé sévére)+ enlevant la dernière partie ('\n') qui correspond au retour charriot ajouté lors de l'écriture dans le fichier
        loldtitre = [line.decode('utf8').rstrip() for line in loldtitre]
    fichier.close()

Re Scrapping (contenu) des pages articles

Boucle sur tous les éléments récup lors du premier scrap, vérification que l'on a bien une string spécifique dans le titre (j'ai choisi [APICLOCK]) et récup du titre + url concaténés dans la liste ltitre:

    for items in elements:
        titrearticle = items.h1.a['title']
        urlarticle = items.h1.a['href']
        
        # si il y a apiclock dans le titre on ajoute tout aux listes crees
        if '[APICLOCK]' in titrearticle:
            ltitre.append(titrearticle+'==='+urlarticle)

Extraction des nouveaux titres récupérés (ltitres) et qui ne sont pas dans le fichier textes = précédent scrap (lodltitre) vers une nouvelle liste = lnewtitre.

    lnewtitre = [val for val in ltitre if val not in loldtitre]

Traitement et envoi à Wordpress

Dernière partie !
On procède pour chaque élément de la nouvelle liste (lnewtitre) en :
  • Coupant la chaine en 2 pour récup le titre et l'url
  • Scrapant les URL (cf. plus haut c'est exactement pareil)
  • Envoyant à Wordpress avec les bons élemenst

for i in range(0, len(lnewtitre)):
        
        # on découe la chaine recuperee depuis l'iteration des elements de lnewtitre = hop[0] : titre // hop[1] : url
        hop = lnewtitre[i].split('===')
        
        content = urllib2.urlopen(hop[1]).read()
        soup = BeautifulSoup(content)
        contenuarticle = soup.find("div", { "id" : re.compile("^post") })
        
        # on balance tout ca à wordpress
        post = WordPressPost()
        post.title = hop[0]
        post.content = contenuarticle.encode_contents()
        post.id = client.call(posts.NewPost(post))
        post.post_status = 'publish'
        client.call(posts.EditPost(post.id, post))
        
        i=i+1

Ecriture du Fichier TXT

On prend les éléments de la liste lnewtitre et on les ajoute au fichier txt (ici titres.txt) en encodant en utf8 et sautant une ligne pour chaque :

    # si il y a des nouveaux titres alors on les ajoute au fichier txt
    if len(lnewtitre)>0:
        fichier = codecs.open("titres.txt", "a")
        for titre in lnewtitre:
            fichier.write(titre.encode('utf8')+'\n')
        fichier.close()
    else:
        print "nada"


Plus qu'a affiner les envois vers wordpress, mettre un cron sur le scrip et roule jean-pierre !

Partager cet article sur :


Écrire un commentaire

Quelle est la quatrième lettre du mot unezs ? :