노기자카46의 멤버 아키모토 한여름의 블로그 사진을 스크래핑

노기자카46의 멤버 아키모토 한여름의 블로그 사진을 스크래핑



BeautifulSoup의 사용법 연습도 아니고, 아키모토 한여름의 블로그의 사진을 모두 보존하는 프로그램을 작성했다.
url = 'http://blog.nogizaka46.com/manatsu.akimoto/'
headers = {
        "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
        }
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")


  • 우선, url은 아키모토 한여름의 블로그의 톱 페이지. 스쿠쇼의 오른쪽 하단 부분이 과거 블로그의 아카이브.
  • url에 액세스하는 모듈로는 urllib 모듈과 requests 모듈이 있지만 requests 모듈이 직관적이고 사용하기 쉬운 것 같습니다. 본 기사에서도 이쪽을 사용했다. 다만, 후술하지만, url로부터 이미지를 보존할 때는 urllib 모듈의 urlretrieve 함수를 사용하고 있다.
  • get 요청을 할 때 403 오류가 발생했습니다. 이것은 사용자 에이전트를 firefox로 위장함으로써 해결되었습니다.
  • get 요청의 response를 html의 성형 모듈인 BeautifulSoup에 준다.
  • past_blog_link_list = []
    
    
    for option_tag in option_tag_list:
        if type(option_tag) == str:
            continue
            # なぜかoption_tagタグではない、strの型のものも引っかかるので、除外。
        link = option_tag['value']
        if re.search('\d{6}$', link):
        # 過去のブログのリンク先のリストは201212のような形式になっている。こうしたものだけ抽出。
            past_blog_link_list += [link]
    
  • option 태그를 모두 취득해, 그 value가 201212와 같이, 년, 월의 배열이 되고 있는 것의 src 속성을 취득한다. 이것은 지난 달마다 블로그에 대한 링크입니다.
  • # for past_blog_link in past_blog_link_list:
    os.chdir('/Users/mizukoshiryuuhei/nogi_pic/nogizaka_pic')
    cnt = 1
    for past_blog_link in past_blog_link_list:
        response = requests.get(past_blog_link, headers=headers)
        soup = BeautifulSoup(response.text, "lxml")
        img_tag_list = soup.find_all('img')
        for img_tag in img_tag_list:
            img_link = img_tag['src']
            if re.search('jpeg$', img_link):
                try:
                    urlretrieve(img_link, f"akimoto_manatsu_blog_{cnt}.jpg")
                    cnt += 1
                except error:
                # urllibのリクエストのエラーの基底クラス
                    pass
    
    
    print(f'{cnt} pictures were saved')
    
  • 얻은 각 링크 당, 또한 get 요청. 방금전과 같은 요령으로 responsnse 를 beautiful soup 에 주어, img 태그의 src 속성을 취득. urlretreive로 jpeg를 저장합니다. (실제는 좋지 않지만) 에러는 모두 except절에 던졌다.
  • 총 1630장의 이미지를 저장할 수 있었다.
  • import requests
    from bs4 import BeautifulSoup
    import re
    from urllib.request import urlretrieve
    from urllib import error
    import os
    
    
    
    url = 'http://blog.nogizaka46.com/manatsu.akimoto/'
    headers = {
            "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
            }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "lxml")
    # 過去のブログのリンク先のリスト(月別)
    option_tag_list = soup.find_all('option')
    past_blog_link_list = []
    
    for option_tag in option_tag_list:
        if type(option_tag) == str:
            continue
            # なぜかoption_tagタグではない、strの型のものも引っかかるので、除外。
        link = option_tag['value']
        if re.search('\d{6}$', link):
        # 過去のブログのリンク先のリストは201212のような形式になっている。こうしたものだけ抽出。
            past_blog_link_list += [link]
    
    
    # for past_blog_link in past_blog_link_list:
    os.chdir('/Users/mizukoshiryuuhei/nogi_pic/nogizaka_pic')
    cnt = 1
    for past_blog_link in past_blog_link_list:
        response = requests.get(past_blog_link, headers=headers)
        soup = BeautifulSoup(response.text, "lxml")
        img_tag_list = soup.find_all('img')
        for img_tag in img_tag_list:
            img_link = img_tag['src']
            if re.search('jpeg$', img_link):
                try:
                    urlretrieve(img_link, f"akimoto_manatsu_blog_{cnt}.jpg")
                    cnt += 1
                except error:
                # urllibのリクエストのエラーの基底クラス
                    pass
    
    
    print(f'{cnt} pictures were saved')
    

    !

    좋은 웹페이지 즐겨찾기