作ってた線画着色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()
以上です.