なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【Python】なろう作品の「http://」画像の存在をチェックするサンプルコード

SSL(HTTP)サイトの画像は標準で表示されなくなる

画像設定項目見直しのお願い - 小説家になろうグループ公式ブログ
blog.syosetu.com

昨今、ほとんどのwebサイトでは、よりセキュリティ性の高いSSLに対応していますが、まだ一部では従来の非SSLサイトも存在します。

なので現状ではSSL化されたサイトから非SSLサイトの画像コンテンツを呼び出すことも可能となっていますが、Chromeブラウザにおいてウェブページ上の混在コンテンツを標準でブロックする予定であることが発表されました。

www.suzukikenichi.com

なので従来使えていた「ランキングタグ」や「作者マイページのプロフィール欄」での画像が「一部表示されなくなるかもしれないので各自対応をしてくださいね」というのが、今回のなろう運営からのお知らせとなっています。

対応方法としては、画像引用元のwebサイトがhttpsに対応している場合はURLに「s」を付け足すだけで大丈夫ですが、対応していない場合はimgタグを削除したり、他の場所にアップロードし直したりする必要がありそうです。

しかし大分前に投稿した作品のランキングタグ設定などを忘れている作者さんや、作品数が多くて対応が必要化どうか調べるのが大変という作者さんも多くいると思います。

そこで今回、自動で非SSLサイトの「http://画像」をチェックするPythonコードをご紹介したいと思います。

準備

pip

pip install pandas
pip install requests
pip install beautifulsoup4

サンプルコード

import pandas as pd
import requests
import time
import gzip
import json
from bs4 import BeautifulSoup

##### ここに作者IDを入力する ######
userid="1272067"
##################################

headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"}
cookie = {'over18': 'yes'}  # Xサイト用のクッキー

all_list=[]
   
def check_novel_img():
    
    novel_data=[]
    
    payload = {'out': 'json','gzip':5,'lim':500,'userid':userid}
    res = requests.get('https://api.syosetu.com/novelapi/api/', params=payload).content
    r =  gzip.decompress(res).decode("utf-8")

    for data in json.loads(r):
        try:
            temp=[]
            temp.append(data['ncode'])
            temp.append(data['general_all_no'])
            temp.append(data['novel_type'])
            temp.append(data['writer'])
            novel_data.append(temp)
            
            writer_name=data['writer']
            
        except KeyError:
            pass
        
    get_text_all(novel_data,writer_name)   
    
def get_text_all(novel_data,writer_name):
        
    for i in range(len(novel_data)):
        if novel_data[i][2]==2:
            urls = ["https://ncode.syosetu.com/%s/"%novel_data[i][0]]
        else:
            urls = ["https://ncode.syosetu.com/%s/"%novel_data[i][0],
                  "https://ncode.syosetu.com/%s/1"%novel_data[i][0]]

        for url in urls:
            response = requests.get(url=url, headers=headers, cookies=cookie)
            html = response.content
            soup = BeautifulSoup(html, "lxml")

            imgs = soup.find_all("img")
            is_http = "大丈夫"
            
            for img in imgs:
                if "http://" in img.get("src"):
                    is_http = "http画像が存在します"
            temp = []
            temp.append(int(userid))
            temp.append(writer_name)
            temp.append(novel_data[i][0])
            temp.append(url)
            temp.append(is_http)
            all_list.append(temp)
            time.sleep(1)
                
def check_mypage():
    url = "https://mypage.syosetu.com/mypage/top/userid/%s/"%userid
    response = requests.get(url=url, headers=headers, cookies=cookie)
    html = response.content
    soup = BeautifulSoup(html, "lxml")
    
    imgs = soup.find_all("img")
    is_http = "大丈夫"

    for img in imgs:
        if "http://" in img.get("src"):
            is_http = "http画像が存在します"
    temp = []
    temp.append(int(userid))
    temp.append("作者マイページ")
    temp.append("")
    temp.append(url)
    temp.append(is_http)
    all_list.append(temp)
    time.sleep(1)

check_mypage()
check_novel_img()

df = pd.DataFrame(all_list, columns=["userid","作者名","ncode","掲載URL","http画像の有無"])
df.to_excel('check_http_img.xlsx')           

print("end")

使い方

userid="1272067"

の箇所に自分の作者IDを入力するだけでOKです。

Pythonコードを実行すると「check_http_img.xlsx」が実行ファイルと同じフォルダに出力されます。

出力例

f:id:karupoimou:20191030010951p:plain:w400
出力例

その他

有名どころでは俺Tueee.Net! Ψ(`∀´)Ψさまは現時点(2019/10/30)でSSL非対応みたいです。

なので俺Tueeeさまの評価pt画像やワードクラウドとか使っている人は修正が必要そうです。

こういうです↓

f:id:karupoimou:20191030011252p:plain:w400
こういうの