[PYTHON] Échantillon de grattage

obtenir le titre de yahoo! news

from urllib.request import urlopen
from bs4 import BeautifulSoup
from pprint import pprint

URL = 'http://news.yahoo.co.jp/'
with urlopen(URL) as res:
  html = res.read().decode("utf-8")
    
soup = BeautifulSoup(html, 'html.parser')

titles = soup.select('.ttl a') #Obtenez dom
titles = [t.contents[0] for t in titles] #Obtenir du texte
pprint(titles)

Résultat de sortie


>>>
['M. Trump "Judiciaire trop"',
 'Rapport quotidien PKO Inspection spéciale de la défense instruite',
 'Erreur d'administration à l'hôpital Arrêt cardio-pulmonaire temporaire',
 '200 élèves du premier cycle du secondaire en vêtements spéciaux Fukuoka',
 'Le parti au pouvoir néerlandais conservera le premier parti',
 'Rare avec une probabilité de 1/320 000 à WBC',
 'Le bureau passionné de Nakai sans nier',
 'La légende la plus forte de Watase et l'existence d'un frère aîné']

Méthode de sélection des éléments de BeautifulSoup4 Il y a aussi «find» et «find_all», mais «select» est souvent utilisé.

Si aucun n'est renvoyé lors de la récupération du texte Essayez .string, .text, .contents [0] etc. http://stackoverflow.com/questions/20750852/beautifulsoup-4-python-string-returns-none

Obtenez les prévisions météorologiques et enregistrez-les au format CSV / JSON

Obtenez la météo

from urllib.request import urlopen
from bs4 import BeautifulSoup
from pprint import pprint
import csv
import re

tenki = []
URL = "http://weather.livedoor.com/forecast/rss/area/130010.xml"

with urlopen(URL) as res:
  html = res.read().decode("utf-8")
  
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all("item"):
    title = item.find("title").string
    if title.find("[ PR ]") == -1: #Le ramassage des poubelles
        text = re.sub(r'\[?.+\]\s', '', title) # []Supprimer à l'intérieur
        result = text.split(' - ')
        tenki.append(result)
pprint(tenki)

Résultat de sortie


>>>
[['Tokyo', 'Nuageux', 'Température maximale ℃', '23 juillet(journée)'],
 ['Tokyo', 'Nuageux', 'Température maximale 32 ℃', '24 juillet(Mois)'],
 ['Tokyo', 'Nuageux', 'Température maximale 34 ℃', '25 juillet(Feu)'],
 ['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 33 ℃', '26 juillet(eau)'],
 ['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 31 ℃', '27 juillet(bois)'],
 ['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '28 juillet(Argent)'],
 ['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '29 juillet(sol)'],
 ['Tokyo', 'Nuageux et parfois ensoleillé', 'Température maximale 32 ℃', '30 juillet(journée)']]

Faites-en html.parser de base lxml.parser semble avoir des erreurs occasionnelles https://www.crummy.com/software/BeautifulSoup/bs4/doc/

Enregistrer au format CSV

with open('weather.csv','w',newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['city','status','max','date'])
    writer.writerows(tenki)

weather.csv


place,status,max,date
Tokyo,Nuageux,Température maximale ℃,23 juillet(journée)
Tokyo,Nuageux,Température maximale 32 ℃,24 juillet(Mois)
Tokyo,Nuageux,Température maximale 34 ℃,25 juillet(Feu)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 33 ℃,26 juillet(eau)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 31 ℃,27 juillet(bois)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,28 juillet(Argent)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,29 juillet(sol)
Tokyo,Nuageux et parfois ensoleillé,Température maximale 32 ℃,30 juillet(journée)

CSV->JSON

rows = []
csvfile = open('weather.csv', 'r')
jsonfile = open('weather.json', 'w')
fieldnames = ('city','status','max','date')
reader = csv.DictReader(csvfile, fieldnames)
for index,row in enumerate(reader):
    if(index == 0): continue #  {"city": "city" ...}Est inutile
    rows.append(row)
json.dump(rows, jsonfile, ensure_ascii=False, indent=2)

weather.json


[
  {
    "date": "7\u670823\u65e5(\u65e5)",
    "status": "\u66c7\u308a",
    "city": "\u6771\u4eac",
    "max": "\u6700\u9ad8\u6c17\u6e29\u2103"
  },
  {
    "date": "7\u670824\u65e5(\u6708)",
    "status": "\u66c7\u308a",
    "city": "\u6771\u4eac",
    "max": "\u6700\u9ad8\u6c17\u6e2932\u2103"
  },
  ...
]

Obtenez des images de nouveaux articles sur ics.media et enregistrez-les localement

# ics.Grattage des médias
import os
from urllib.request import urlopen
from bs4 import BeautifulSoup

URL = "https://ics.media/"
with urlopen(URL) as res:
    html = res.read().decode("utf-8")
    
soup = BeautifulSoup(html, "html.parser")

#Obtenez des images (et des titres) de nouveaux articles
topics = soup.select(".topicsContainer")[0].nextSibling
topics_urls = topics.select(".thumb img")
topics_ttls = topics.select(".entryTitle a")
img_urls = [e["src"] for e in topics_urls]
img_ttls = [e.string for e in topics_ttls]

"""
#S'il s'agit d'un chemin relatif, convertissez-le en chemin absolu
#Notation d'inclusion de liste, opérateur ternaire
img_urls = [u if u.find("http") == 0 else URL + u for u in img_urls]
"""

#sauvegarder
img_dir = "images"
if not os.path.exists(img_dir):
    os.mkdir(img_dir)
    
for i,url in enumerate(img_urls):
    print("article"+str(1+i), img_ttls[i])
    print(url)
    with urlopen(url) as res:
        img = res.read()
        with open(img_dir + "/entry_image%d.png " % (i+1), "wb") as f:
            f.write(img)

Résultat de sortie


>>>
Article 1 Connaissance de base de la conception CSS que les créateurs Web doivent connaître
https://ics.media/wp-content/uploads/2017/03/170315_eyecatch-640x256.jpg
Article 2 Exprimé uniquement avec CSS3! J'ai fait une micro interaction qui peut être utilisée avec copie
https://ics.media/wp-content/uploads/2017/03/main-640x256.png
Article 3 La qualité des sites Web publicitaires est incroyable!5 sites nationaux qui sont devenus un sujet brûlant récemment
https://ics.media/wp-content/uploads/2017/03/170227_web_trend_1611_1702_eye-640x256.jpg
... (Omis) ...

Obtenez des éléments frères et sœurs http://tdoc.info/beautifulsoup/

module os https://docs.python.jp/3/library/os.html

énumération, fonction Boucle avec index http://python.civic-apps.com/zip-enumerate/

Obtenir du DOM de rendu de site avec JavaScript

chrome dev tool Settings > Preferences > Debugger > Disable JavaScript

Si vous désactivez JS et rechargez et que l'élément disparaît, Sites où le DOM est généré dynamiquement par JS

Cette fois, j'utiliserai PhantomJS et Selenium

$ brew install phantomjs $ pip3 install —upgrade selenium

from selenium import webdriver
from bs4 import BeautifulSoup
from pprint import pprint

URL = "https://dokusho-ojikan.jp/original/#!top"

driver = webdriver.PhantomJS()
driver.get(URL)
html = driver.page_source

bs = BeautifulSoup(html, "html.parser")
img_urls = [img.get("src") for img in bs.select("#unique-pickup img")]
for u in img_urls:
    print(u)

Résultat de sortie


>>>
https://cdn.om.dokusho-ojikan.jp/img/1f387c10-a8f8-11e6-8a10-525431b7cd60.jpg
https://cdn.om.dokusho-ojikan.jp/img/98c2e066-9a44-11e5-9ae2-52540e2de543.png
https://cdn.om.dokusho-ojikan.jp/img/7adbba1b-344b-11e5-be53-5254f877f35f.jpg
... (Omis) ...

Recommended Posts

Échantillon de grattage
Grattage 1
Début du grattage
Échantillon PyAudio
[Scraping] Scraping Python
raclage Web
Mémo de raclage Python
Grattage au sélénium
Scraping Python get_ranker_categories
Grattage au sélénium ~ 2 ~
Grattage avec Python
À propos du scraping Twitter
Grattage avec Python
grattage Web (prototype)
Exemple de fermeture Python
Exemple de MCMC adaptatif
Python racle eBay
Grattage avec du sélénium
Grattage Python get_title
Python: grattage partie 1
[PyTorch] Échantillon ② ~ TENSOR ~
[PyTorch] Exemple ① ~ NUMPY ~
Scraping à l'aide de Python
Exemple d'apprentissage automatique
Python: grattage, partie 2