Grattage de la toile avec Python
j'aimerais prendre l'heure quotidienne du lever et du coucher du soleil sur un site web. Est-il possible de gratter du contenu web avec Python? quels sont les modules utilisés? Est-il un tutoriel disponible?
12 réponses
utiliser urllib2 en combinaison avec le brillant BeautifulSoup bibliothèque:
import urllib2
from BeautifulSoup import BeautifulSoup
# or if you're using BeautifulSoup4:
# from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://example.com').read())
for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
tds = row('td')
print tds[0].string, tds[1].string
# will print date and sunrise
je recommande Scrapy.
citation tirée d'une réponse supprimée:
- Scrapy l'analyse est plus rapide que de mécaniser car utilise les opérations asynchrones (sur le haut de Tordu).
- Scrapy supporte mieux et plus rapidement le parsing (x)html sur libxml2.
- Scrapy est un framework mature avec unicode complet, gère les redirections, les réponses gzippées, les encodages impairs, cache http intégré, etc.
- une fois que vous êtes dans Scrapy, vous pouvez écrire une araignée en moins de 5 minutes qui télécharge des images, crée des vignettes et exporter les données extraites directement à csv ou json.
j'ai rassemblé des scripts de mon travail de grattage de web dans cette bibliothèque bit-bucket .
exemple de script pour votre cas:
from webscraping import download, xpath
D = download.Download()
html = D.get('http://example.com')
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'):
cols = xpath.search(row, '/td')
print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2])
sortie:
Sunrise: 08:39, Sunset: 16:08
Sunrise: 08:39, Sunset: 16:09
Sunrise: 08:39, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:10
Sunrise: 08:40, Sunset: 16:11
Sunrise: 08:40, Sunset: 16:12
Sunrise: 08:40, Sunset: 16:13
je suggère fortement de cocher pyquery . Il utilise la syntaxe jquery-like (alias CSS-like) qui rend les choses vraiment faciles pour ceux qui viennent de cet arrière-plan.
pour votre cas, ce serait quelque chose comme:
from pyquery import *
html = PyQuery(url='http://www.example.com/')
trs = html('table.spad tbody tr')
for tr in trs:
tds = tr.getchildren()
print tds[1].text, tds[2].text
sortie:
5:16 AM 9:28 PM
5:15 AM 9:30 PM
5:13 AM 9:31 PM
5:12 AM 9:33 PM
5:11 AM 9:34 PM
5:10 AM 9:35 PM
5:09 AM 9:37 PM
vous pouvez utiliser urllib2 pour faire les requêtes HTTP, puis vous aurez du contenu Web.
Vous pouvez l'obtenir comme ceci:
import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()
Beautiful Soup est un analyseur HTML python qui est censé être bon pour le screen scraping.
en particulier, ici est leur tutoriel sur l'analyse D'un document HTML.
bonne chance!
j'utilise une combinaison de Scrapemark (trouver des urls - py2) et httlib2 (télécharger des images - py2+3). Les scrapemark.py dispose de 500 lignes de code, mais utilise des expressions régulières, de sorte qu'il peut ne pas être si rapide, n'a pas testé.
Exemple pour gratter votre site web:
import sys
from pprint import pprint
from scrapemark import scrape
pprint(scrape("""
<table class="spad">
<tbody>
{*
<tr>
<td>{{[].day}}</td>
<td>{{[].sunrise}}</td>
<td>{{[].sunset}}</td>
{# ... #}
</tr>
*}
</tbody>
</table>
""", url=sys.argv[1] ))
Utilisation:
python2 sunscraper.py http://www.example.com/
résultat:
[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'},
{'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'},
{'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'},
{'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'},
{'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'},
{'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'},
{'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}]
j'ai juste vu RoboBrowser dans Pycoder Hebdomadaire .
Une bibliothèque pour le web scraping construit sur la Demande et BeautifulSoup. Comme mécaniser, mais avec des tests, des docs, et une interface pythonique.
Scrapy open source framework aidera à Web scrap en python.Ce cadre open source et collaboratif pour extraire les données dont vous avez besoin à partir de sites web.
le raclage Web est étroitement lié à l'indexation web, qui répertorie l'information sur le web à l'aide d'un bot ou d'un crawler web et est une technique universelle adoptée par la plupart des moteurs de recherche.
facilitez votre vie en utilisant CSS Selectors
je sais que je suis arrivé en retard à la fête, mais j'ai une suggestion pour vous.
utilisant BeautifulSoup
est déjà suggéré je préférerais utiliser CSS Selectors
pour gratter des données à L'intérieur de HTML
import urllib2
from bs4 import BeautifulSoup
main_url = "http://www.example.com"
main_page_html = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html)
# Scrape all TDs from TRs inside Table
for tr in main_page_soup.select("table.class_of_table"):
for td in tr.select("td#id"):
print(td.text)
# For acnhors inside TD
print(td.select("a")[0].text)
# Value of Href attribute
print(td.select("a")[0]["href"])
# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects)
def tryAgain(passed_url):
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
return page
except Exception:
while 1:
print("Trying again the URL:")
print(passed_url)
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
print("-------------------------------------")
print("---- URL was successfully scraped ---")
print("-------------------------------------")
return page
except Exception:
time.sleep(20)
continue
voici un simple crawler web, j'ai utilisé BeautifulSoup et nous allons chercher tous les liens(ancres) qui le nom de classe est _3NFO0d. J'ai utilisé Flipkar.com, it is an online retailing store.
import requests
from bs4 import BeautifulSoup
def crawl_flipkart():
url = 'https://www.flipkart.com/'
source_code = requests.get(url)
plain_text = source_code.text
soup = BeautifulSoup(plain_text, "lxml")
for link in soup.findAll('a', {'class': '_3NFO0d'}):
href = link.get('href')
print(href)
crawl_flipkart()
si nous pensons obtenir le nom des articles de n'importe quelle catégorie spécifique, alors nous pouvons le faire en spécifiant le nom de classe de cette catégorie en utilisant le sélecteur css:
import requests ; from bs4 import BeautifulSoup
soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml")
for link in soup.select('div._2kSfQ4'):
print(link.text)
résultats de la recherche partielle:
Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes
Shirts, T-Shirts...Under ₹599For Men
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers
Philips & moreStarting ₹99LED Bulbs & Emergency Lights
Nouvelle réponse à cette question. lxml est apparu comme le moyen préféré pour faire du raclage web en Python. Elle n'est pas dépendante de Twisted contrairement à scrapy. Également approuvé par le Guide de L'auto-stoppeur pour Python .