[PYTHON] Grattage WEB avec BeautifulSoup4 (page en couches)

Grattage WEB avec Beutiful Soup 4

Web scraping avec BeautifulSoup4 (page du numéro de série), j'ai écrit le code de la page en couches, alors notez

point

Si vous créez une liste dans l'ordre de catégorie → page → fichier souhaité et que vous la traitez, il est facile de redémarrer même si elle est interrompue au milieu

code

scraper.py


# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

try:
    # Python 3
    from urllib import request
except ImportError:
    # Python 2
    import urllib2 as request

from bs4 import BeautifulSoup
import time, os, codecs, string, json

domain = 'http://hoge.com'
wait_sec = 3
headers = { 'User-Agent' : 'Mozilla/5.0)' }
cwd = os.getcwd()
result_file = cwd + '/result_url.txt'
category_file = cwd + '/category.txt'
page_file = cwd + '/page.txt'

def fetchSoup(url):
    time.sleep(wait_sec)

    req = request.Request(url, headers = headers)
    try:
        print('open {url}'.format(url = url))
        response = request.urlopen(req)
        print('ok')
        body = response.read()
        return BeautifulSoup(body, 'lxml')
    except URLError, e:
        print('error: {reason}'.format(reason = e.reason))
        return None

def getUrl(src):
    return '{domain}{src}'.format(domain = domain, src = src)

def extractUrlFromTags(tags):
    result = []
    for tag in tags:
        if tag.name == 'a':
            result.append(getUrl(tag['href']))
        elif tag.name == 'img':
            result.append(getUrl(tag['src']))
    return result

def saveUrl(file_name, url_list):
    with codecs.open(file_name, 'a', 'utf-8') as f:
        f.write('{list}\n'.format(list = '\n'.join(url_list)))

def deleteFirstLine(file_name):
    with codecs.open(file_name, 'r', 'utf-8') as f:
        content = f.read()
        content = content[content.find('\n') + 1:]
    with codecs.open(file_name, 'w', 'utf-8') as f:
        f.write(content)

def fetchAllCategories():
    page = 1
    while True:
        url = '{domain}/category_{page}/'.format(domain = domain, page = page)
        soup = fetchSoup(url)
        categories = soup.find('div', id = 'list').find_all('a')
        url_list = extractUrlFromTags(categories)
        if len(url_list):
            saveUrl(category_file, url_list)
        page_list_last = soup.find('div', class = 'pagenation').find_all('a')[-1].string
        if page_list_last not in ['>', '>>']:
            break
        page += 1

def fetchCategory():
    if not os.path.exists(category_file):
        fetchAllCategories()
    with codecs.open(category_file, 'r', 'utf-8') as f:
        result = f.readline().rstrip('\n')
    return result

def fetchAllPages():
    category = fetchCategory()
    while category != '':
        soup = fetchSoup(category)
        pages = soup.find_all('a', class = 'page')
        url_list = extractUrlFromTag(pages)
        if len(url_list):
            saveUrl(page_file)
        deleteFirstLine(page_file)
        small_category = fetchCategory()

def fetchPage():
    if os.path.exists(page_file) or fetchCategory() != '':
        fetchAllPages()
    with codecs.open(page_file, 'r', 'utf-8'):
        result = f.readline().rstrip('\n')
    return result

def fetchTargets():
    page = fetchPage()
    while page != '':
        soup = fetchSoup(page)
        targets = soup.find_all('img', class = 'target')
        url_list = extractUrlFromTags(targets)
        if len(url_list):
            saveUrl(result_file, url_list)
        deleteFirstLine(page_file)
        page = fetchPage()

fetchTargets()

Technique pratique

Lorsque les noms, etc. sont classés par ordre alphabétique

alphabet_l = list(string.ascii_lowercase)
alphabet_u = list(string.ascii_uppercase)

Pour traiter les variables etc. extraites de la balise de script

data = json.loads(json_string)

Afin de traiter en arrière-plan lors de l'exécution avec VPS, etc. et continuer même si vous vous déconnectez

$ nohup python scraper.py < /dev/null &

Pour vérifier le processus qui se poursuit

$ ps x

Recommended Posts

Grattage WEB avec BeautifulSoup4 (page en couches)
Grattage WEB avec BeautifulSoup4 (page du numéro de série)
[Note personnelle] Scraping de pages Web en python3
Web scraping avec python + JupyterLab
Enregistrez des images avec le web scraping
Grattage Web facile avec Scrapy
Web scraping débutant avec python
Gratter la page i-town avec du sélénium
Gratter le classement Web d'Alexa avec pyQuery
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
raclage Web
Grattage WEB avec Python (pour mémo personnel)
Premiers pas avec Python Web Scraping Practice
Site de courses de chevaux Web scraping avec Python
Surveillez les mises à jour des pages Web avec LINE BOT
Premiers pas avec Python Web Scraping Practice
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
[Pour les débutants] Essayez le web scraping avec Python
Grattage au sélénium
Grattage au sélénium ~ 2 ~
Grattage avec Python
Grattage avec Python
grattage Web (prototype)
Grattage avec du sélénium
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
[python] Récupérez rapidement les métadonnées de la page Web avec lassie
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Extraire des données d'une page Web avec Python
Réalisation Flask-Python
Page de résumé de l'article Flask
Résumé de l'article sur la programmation Web Python
Grattage WEB avec BeautifulSoup4 (page en couches)
[Note personnelle] Scraping de pages Web en python3
Surveillez les mises à jour des pages Web avec LINE BOT
Grattage WEB avec BeautifulSoup4 (page du numéro de série)
Grattage réussi avec Selenium
Grattage en Python (préparation)
Essayez de gratter avec Python.
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Grattage avec Python + PhantomJS
Premiers pas avec le Web Scraping
Scrapage Web rapide avec Python (tout en prenant en charge le chargement JavaScript)
Grattage avec coquille tremblante
Les débutants en Python sont bloqués dans leur premier scraping Web
Réalisation Flask-Python
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Gratter avec une belle soupe
Scraping RSS avec Python
[Part.2] Exploration avec Python! Cliquez sur la page Web pour vous déplacer!
Exploration Web, scraping Web, acquisition de caractères et sauvegarde d'image avec python
Afficher la page Web avec FastAPI + uvicorn + Nginx (conversion SSL / HTTPS)
J'ai essayé de gratter avec Python
Télécharger automatiquement des images avec grattage
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Grattage avec chromedriver en python
Grattage festif avec Python, scrapy
Développement d'applications Web avec Flask