Exemples de code de travail pyspider simplifiés

Extraction et filtrage des URLs sur la pagee d'accuiel

@config(age=10 * 24 * 60 * 60)
def page_accueil(self, response):
    for element in response.doc('a[href^="http"]').items():
        if re.match('http://www.yunjinet.com/sell/show.+', element.attr.href):
            self.crawl(element.attr.href, callback=self.page_detail)
        else:
            self.crawl(element.attr.href, callback=self.page_accueil)

Parcours des URLs sur la page d'accueil

    @config(age=10 * 24 * 60 * 60)
    def page_accueil(self, response):
        # Extraction des URLs de produits
        for element in response.doc('.list_products_row_box .list_products_name > a').items():
            self.crawl(element.attr.href, callback=self.page_detail, validate_cert=False)
        
        # Navigation vers la page suivante
        suivant = response.doc('nav a').attr.href
        self.crawl(suivant, callback=self.page_accueil, validate_cert=False)

Pagination incrémentale classique

from pyspider.libs.base_handler import *
 
 
class Collecteur(BaseHandler):
    crawl_config = {
    }
    
    def __init__(self):
        self.url_base = 'https://mm.taobao.com/json/request_top_list.htm?page='
        self.numero_page = 1
        self.total_pages = 30
 
    @every(minutes=24 * 60)
    def on_start(self):
        while self.numero_page <= self.total_pages:
            url = self.url_base + str(self.numero_page)
            print(url)
            self.crawl(url, callback=self.page_accueil)
            self.numero_page += 1
 
    @config(age=10 * 24 * 60 * 60)
    def page_accueil(self, response):
        for element in response.doc('a[href^="http"]').items():
            self.crawl(element.attr.href, callback=self.page_detail)
 
    @config(priority=2)
    def page_detail(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

Parcours des URLs sur la page de détail

    @config(priority=2)
    def page_detail(self, response):
        # Extraction des images de la page courante
        for element in response.doc('.xzoom-container > img.img-responsive').items():
            url_image = element.attr.src
        
        # Navigation vers la page suivante
        for element in response.doc('.pagenavi > a:last-child').items():
            self.crawl(element.attr.href, callback=self.page_detail, validate_cert=False)

Stockgae des données dans MySQL

from pyspider.libs.base_handler import *
import re
from pyspider.database.mysql.mysqldb import SQL
import html

# Configuration d'accès à la base de données

config_bdd = {
'hote': '127.0.0.1',
'utilisateur': 'root',
'mot_de_passe': 'root',
'base_donnees': 'pyspider',
}

#Création de la table de stockage

@every(minutes=24 * 60)
def on_start(self):
self.creer_table_resultats()



# Création de la table [résultats du scraper]
def on_result(self, resultat):
if not resultat or not resultat['v_metatags_title_1']:
return
sql = SQL(hote=config_bdd['hote'], utilisateur=config_bdd['utilisateur'],
mot_de_passe=config_bdd['mot_de_passe'], base_donnees=config_bdd['base_donnees'])
sql.insert(self.nom_projet + '_resultats', **resultat)

# Méthode de création de la table [résultats]
def creer_table_resultats(self):
sql = SQL(hote=config_bdd['hote'], utilisateur=config_bdd['utilisateur'],
mot_de_passe=config_bdd['mot_de_passe'], base_donnees=config_bdd['base_donnees'])

requete_creation = """CREATE TABLE IF NOT EXISTS `""" + self.nom_projet + '_resultats' + """` (
`v_products_model` mediumtext NOT NULL,
`v_products_type` int(2) DEFAULT '1',
`v_products_image` mediumtext NOT NULL,
`v_products_name_1` mediumtext NOT NULL,
`v_products_description_1` mediumtext NOT NULL,
`v_products_url_1` mediumtext NOT NULL,
`v_specials_price` int(2) DEFAULT '0',
`v_specials_date_avail` varchar(50) DEFAULT '0000-00-00 00:00:00',
`v_specials_expires_date` varchar(50) DEFAULT '0000-00-00 00:00:00',
`v_products_price` mediumtext NOT NULL,
`v_products_weight` int(2) DEFAULT '0',
`v_product_is_call` int(2) DEFAULT '0',
`v_products_sort_order` int(2) DEFAULT '1',
`v_products_quantity_order_min` int(2) DEFAULT '1',
`v_products_quantity_order_units` int(2) DEFAULT '1',
`v_products_priced_by_attribute` int(2) DEFAULT '0',
`v_product_is_always_free_shipping` int(2) DEFAULT '1',
`v_date_avail` varchar(50) DEFAULT '0000-00-00 00:00:00',
`v_date_added` varchar(50) DEFAULT '0000-00-00 00:00:00',
`v_products_quantity` int(10) DEFAULT '1000',
`v_manufacturers_name` mediumtext NOT NULL,
`v_categories_name_1` mediumtext NOT NULL,
`v_tax_class_title` varchar(50) DEFAULT '--none--',
`v_status` int(2) DEFAULT '1',
`v_html_uri` mediumtext NOT NULL,
`v_products_options_type` int(2) DEFAULT '0',
`v_metatags_title_1` mediumtext NOT NULL,
`v_metatags_keywords_1` mediumtext NOT NULL,
`v_metatags_description_1` mediumtext NOT NULL,
`v_products_options_name_1` mediumtext NOT NULL,
`v_products_options_values_name_1` mediumtext NOT NULL,
`v_products_options_name_2` mediumtext NOT NULL,
`v_products_options_values_name_2` mediumtext NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8"""
try:
resultat_sql = sql.execute(requete_creation)
sql.disconnect()
return resultat_sql is not False
except Exception as erreur:
print("[Table de résultats] Erreur détectée: " + str(erreur))
return False

Étiquettes: Python pyspider web-scraping crawl extraction-donnees

Publié le 28 juillet à 07h23