web-dev-qa-db-fra.com

Raclage et analyse des résultats de recherche Google à l'aide de Python

J'ai demandé à question de concrétiser une idée générale d'explorer et de sauvegarder des pages Web. Une partie de la question initiale est la suivante: comment explorer et enregistrer de nombreuses pages "À propos" sur Internet.

Après des recherches plus poussées, j'ai eu le choix d’aller de l'avant avec le grattage et l'analyse syntaxique (voir la liste en bas).

Aujourd'hui, j'ai rencontré un autre discussion Ruby sur la façon de récupérer des résultats de recherche Google. Cela fournit une excellente alternative à mon problème qui permettra d'économiser tous les efforts sur la partie d'exploration.

Les nouvelles questions sont les suivantes: en Python, à gratter les résultats de recherche Google pour un mot clé donné, dans le cas présent "À propos de", et enfin obtenir les liens pour une analyse ultérieure. Quels sont les meilleurs choix de méthodes et de bibliothèques pour aller de l'avant? (dans une mesure de facile à apprendre et facile à mettre en œuvre).

p.s. dans ce site , la même chose est implémentée, mais fermée et demander de l'argent pour plus de résultats. Je préférerais le faire moi-même s'il n'y a pas de source ouverte disponible et en apprendre plus sur Python en attendant.

Oh, au fait, des conseils pour l’analyse des liens à partir des résultats de recherche seraient bien, le cas échéant. Toujours, facile à apprendre et facile à mettre en œuvre. Vient de commencer à apprendre Python. : P


Mise à jour finale , problème résolu. Code utilisant xgoogle, veuillez lire la note dans la section ci-dessous afin de rendre xgoogle opérationnel.

import time, random
from xgoogle.search import GoogleSearch, SearchError

f = open('a.txt','wb')

for i in range(0,2):
    wt = random.uniform(2, 5)
    gs = GoogleSearch("about")
    gs.results_per_page = 10
    gs.page = i
    results = gs.get_results()
    #Try not to annnoy Google, with a random short wait
    time.sleep(wt)
    print 'This is the %dth iteration and waited %f seconds' % (i, wt)
    for res in results:
        f.write(res.url.encode("utf8"))
        f.write("\n")

print "Done"
f.close()

Remarque sur xgoogle (Mike Pennington répond ci-dessous): La dernière version de Github ne fonctionne pas déjà par défaut, probablement en raison de modifications des résultats de recherche Google. . Ces deux réponses ( ab ) sur la page d'accueil de l'outil donnent une solution et il fonctionne toujours avec ce Tweak. Mais peut-être un autre jour, il pourrait ne plus fonctionner à cause du changement/blocage de Google.


Ressources connues jusqu'à présent:

  • Pour gratter, Scrapy semble être un choix populaire et une application Web appelée ScraperWiki est très intéressante et il y a n autre projet extraire sa bibliothèque pour hors ligne/utilisation locale. Mechanize a été évoqué plusieurs fois dans différentes discussions.

  • Pour l'analyse HTML, BeautifulSoup semble être l'un des choix les plus populaires. Bien sûr. lxml aussi.

19
Flake

Vous pouvez trouver xgoogle utile ... une grande partie de ce que vous semblez demander est là ...

10
Mike Pennington

Celui-ci fonctionne bien pour ce moment. Si une recherche est effectuée, le grattoir peut extraire 100 éléments de cette recherche en parcourant plusieurs pages. J'ai essayé d'utiliser la fonction pour compléter le code sans faille, mais le problème ipv4 se pose et la page est redirigée vers celle avec captcha. Vous ne comprenez toujours pas pourquoi celui-ci fonctionne, mais s'il est intégré à une fonction, il ne fonctionnera plus. Au fait, le grattoir semble un peu gênant car j'ai utilisé la même boucle deux fois dans mon grattoir pour qu'il ne puisse pas ignorer le contenu de la première page.

import requests ; from bs4 import BeautifulSoup

search_item = "Excel"
base = "http://www.google.de"
url = "http://www.google.de/search?q="+ search_item

response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
for item in soup.select(".r a"):
    print(item.text)
for next_page in soup.select(".fl"):
    res = requests.get(base + next_page.get('href'))
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".r a"):
        print(item.text)
1
SIM

Il existe un twill lib pour un navigateur émulé. Je l'ai utilisé lorsque j'avais besoin de me connecter avec un compte de messagerie Google. Bien que ce soit un excellent outil avec une bonne idée, il est assez ancien et semble manquer de support de nos jours (la dernière version date de 2007) . Il peut être utile de récupérer des résultats nécessitant la gestion des cookies ou authentification. Probablement que twill est l’un des meilleurs choix à cette fin… .. BTW, il est basé sur mechanize.

En ce qui concerne l'analyse syntaxique, vous avez raison, BeautifulSoup et Scrapy sont excellents. L’un des avantages intéressants de BeautifulSoup est qu’il peut gérer un code HTML non valide (contrairement à Genshi , par exemple.)

1
ikostia

Jetez un coup d’œil à cet impressionnant wrapper urllib pour le scraping Web https://github.com/mattseh/python-web/blob/master/web.py

1
justinfay
from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request
import re

import numpy as np
count=0
query=input("query>>")
query=query.strip().split()
query="+".join(query)

html = "https://www.google.co.in/search?site=&source=hp&q="+query+"&gws_rd=ssl"
req = urllib.request.Request(html, headers={'User-Agent': 'Mozilla/5.0'})

soup = BeautifulSoup(urlopen(req).read(),"html.parser")

#Regex
reg=re.compile(".*&sa=")

links = []
#Parsing web urls
for item in soup.find_all('h3', attrs={'class' : 'r'}):
    line = (reg.match(item.a['href'][7:]).group())
    links.append(line[:-4])

print(links)

cela devrait être pratique .... pour plus aller à - https://github.com/goyal15rajat/Crawl-google-search.git

0
Rajat Goyal