Récemment, j'ai eu beaucoup de travail de grattage dans mon travail. J'avais l'habitude d'implémenter le scraping avec une bibliothèque PHP appelée simplehtml.
Pour cette raison, j'ai récemment effectué un travail de scraping en utilisant Scrapy de Python. (PHP est facile, mais j'ai aussi un désir personnel d'obtenir un diplôme de PHP.)
Les principales raisons pour lesquelles Scrapy est bon sont les suivantes.
――Vous pouvez faire un grattage compliqué
Je pense que cela peut être mentionné. Jusqu'à présent, le scraping permettait de lire les modèles d'URL. Scrapy fournit une méthode pour les transitions d'écran, qui vous permet de soumettre des formulaires, par exemple, avec beaucoup moins de ressources mémoire que l'automatisation du navigateur que vous pouvez faire avec *** sélénium ***.
*** Installation de scrapy ***
$pip install scrapy
*** Démarrer le projet Scrapy Spider ***
$scrapy startproject [project_name] [project_dir]
*** Liste des projets Spider créés ***
$scrapy list
*** Créez une nouvelle Spider dans le projet créé ***
#Ajouter un nom de domaine
$scrapy genspider [spider_name] mydomain.com
** Spécifiez l'URL lors de l'exécution de la ligne de commande **
$scrapy crawl -a start_urls="http://example1.com,http://example2.com" [spider_name]
*** Sortie au format CSV ***
$scrapy crawl -o csv_file_name.csv [spider_name]
*** Sortie en JSON ***
$scrapy crawl -o json_file_name.json [spider_name]
** Lancez le Scrapy shell **
$ scrapy shell [URL]
** Afficher toutes les pages **
#la réponse peut être utilisée sans définition
response.body
** Obtenez tous les liens **
for link in response.css('a::attr(href)'):
print link.get()
** Utilisez des expressions régulières **
#Lorsqu'un fichier spécifique dans le href de la balise a correspond
matched = response.css('a::attr(href)').re(r'detail\.php')
if len(matched) > 0:
print 'matched'
#Lorsqu'un japonais spécifique dans la chaîne de caractères de la balise a correspond
matched = response.css('a::text').re(u'Résumé')
if len(matched) > 0:
print 'matched'
** Obtenir le tag **
#obtenir un tag
response.css('a')
** Obtenez avec le sélecteur **
#obtenir un tag
response.css('a.link')
#Obtenez plusieurs cours<li class="page next"></li>
response.css('li.page.next')
** Convertir le chemin relatif en URL **
for link in response.css('a::attr(href)'):
print response.urljoin(link.get())
** Soumettre les informations du formulaire **
scrapy.FormRequest(response,formdata={"username":"login_username","password":"login_password"}
** Traitement itératif des éléments enfants de l'élément acquis par XPath **
#Obtenir l'élément DIV
divs = response.xpath('//div')
#Répéter l'élément P dans DIV
for p in divs.xpath('.//p'):
print(p.get())
** Transition vers une autre page **
#self.parse(self,response)En tant que fonction de rappel
yield scrapy.Request([url],callback=self.parse)
** Créer un élément (modifier les éléments.py directement sous Projet) ** Histoire originale
class Product(scrapy.Item):
name = scrapy.Field()
price = scrapy.Field()
stock = scrapy.Field()
tags = scrapy.Field()
last_updated = scrapy.Field(serializer=str)
** Allez à la page de détails jusqu'à ce qu'il n'y ait plus d'éléments dans la liste (cela ne fonctionnera pas tel quel, veuillez donc le mettre dans la classe) **
def parse(self, response):
title = a.css('::text').extract_first()
title_match = a.css('::text').re(u'entraînement')
if len(title_match) > 0:
"title":title,
"url":response.urljoin(link_param)
}
ptn = re.search("\/jinzaiikusei\/\w+\/",url)
if ptn:
self.scraping_list.append(url)
yield scrapy.Request(self.scraping_list[0],callback=self.parse_detail)
pass
def parse_detail(self, response):
for item in response.css('a'):
title = item.css('::text').extract_first()
url = item.css('::attr(href)').extract_first()
title_matched = item.css('::text').re(u'entraînement')
url_matched = item.css('::attr(href)').re(r'jinzaiikusei\/.*\/.*\.html')
if url_matched:
item = {
"title":title,
"url":url
}
yield item
self.current_index = self.current_index + 1
if self.current_index < len(self.scraping_list):
yield scrapy.Request(self.scraping_list[self.current_index],callback=self.parse_detail)
else:
pass
--2019 / 12/06 nouvellement créé --2019 / 12/07 Ajout de techniques de bibliothèque --2019 / 12/09 Ajout de techniques de bibliothèque (saisie de formulaire, etc.) --2019 / 12/16 Ajout d'un chapitre sur les objets --2019 / 12/21 Commande ajoutée
Recommended Posts