読者です 読者をやめる 読者になる 読者になる

MATHGRAM

主に数学とプログラミング、時々趣味について。

まとめサイトから画像をスクレイピングする[python]

スクレイピング

作ってた線画着色NNモデルのためにpixivからイラストを集めたのですが, 諸事情によりまとめサイトからも画像を集めたかったのでスクレイピングしました.

まぁ端的に理由を言うと, エロ画像の特徴量も欲しかったと言うことですw

コード

BeautifulSoupはhtmlのソースを見ながら書けばかなり使いやすいので, 特に詳しい説明はしません. 質問があればコメントでどうぞ.

一つ注意点として, サイトによってはうまくリンクを取得できない場合があります.
対処法として, firefoxなどのブラウザから飛んできていることを装う, と言うものがあるらしく以下の部分でそれを指定しています.

opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]

正直仕組みは全然わかってないです. 今のところ仕組み気にならないし, 目的が達成できればよかったので.

以下のコードは, http://momoniji.com からサイト内のリンクを辿ってリンク先の画像を保存していくと言うものです.

書き換えればいろんなサイトで使えると思います.

#coding:utf-8

import os
from bs4 import BeautifulSoup
import requests

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

import time

from urllib import request

import random

def make_randname():
    source_str = '#$%&0123456789abcdefghijklmnopqrstuvwxyz'
    random.choice(source_str)  #a〜zでランダムに1文字
    name = "".join([random.choice(source_str) for x in range(20)])
    return name + ".jpg"


def getimg(link):
    opener=request.build_opener()
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
    request.install_opener(opener)
    # リンク先(一覧から一回飛んだページ)のContent-Body を取得する
    response = requests.get(link)
    body = response.content
    soup = BeautifulSoup(body,"lxml")
    a_tags = soup.find_all("a", target="_blank")
    for a_tag in a_tags:
        try:
            src = a_tag["href"]
            name = src.split("/")[-1]
            if name.find(".jpg") < 0: break
            name = make_randname()
            request.urlretrieve(src, "./eroimages/"+name)
            print("[success]: {}".format(name))
            time.sleep(0.05)
        except:
            print("[failed]: {}".format(name))

def geturl(link):
    print("###############################################")
    #print("Page: {}".format(i))
    # リンク先(一覧から一回飛んだページ)のBodyを取得する
    response = request.urlopen(link)
    body = response.read()

    # HTML をパースする
    soup = BeautifulSoup(body, "lxml")
    links = soup.find_all('a', class_="read_more")
    for link in links:
        title = link.find("strong")
        child = link["href"]
        print("-----------------------------------------------")
        print("Title: {}".format(title.string))
        print(child)
        getimg(child)

def main():
    if not os.path.exists("./eroimages"):
        os.mkdir("./eroimages")
    for i in range(1,300):
        link = "http://momoniji.com/page/{}".format(i)
        geturl(link)

if __name__ == "__main__":
    main()

以上です.