Python を使用して特定の Web 小説のデータをクロールし、視覚的に分析する方法を教えます

网络文学インターネットを表示プラットフォームおよび通信媒体として使用し、関連するインターネット手段を使用して文学作品および一部の著作物を含むネットワーク技術製品を表現することは、現在新しい文学現象となり、急速に上昇しています。現在、Hongxiu Tianxiang Web サイトの新規データを Selenium を使用してクロールし、簡単なデータ視覚化分析を行っています。
ここに画像の説明を挿入

1999 年に設立された Honxiu Tianxiang は、女性文学の世界有数のデジタル著作権事業者の 1 つであり、毎日 5,000 件の小説を更新し、240 万人以上の登録ユーザーに小説、エッセイ、随筆、詩、歌詞、脚本、日記などのジャンルを提供しています。その高品質な創作および読書サービスは、恋愛小説や職場小説などの女性文学の執筆および出版の分野で独占的な地位を築いています。(百度百科事典)

Webページの事前分析

図に示すように Web ページを開きます。

ここに画像の説明を挿入

小説カテゴリの小説データをすべて取り込む必要があり、合計50ページ、1ページあたり20個、合計1,000個のデータがあります。

まず、次のように、リクエスト サードパーティ ライブラリを使用してデータをリクエストします。

import requests  
url = 'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_1' # 第一页url  
headers = { 'xxx' : 'xxx'}  
res = requests.get(url,headers=headers)  
print(data.content.decode('utf-8'))  

リクエストされたデータには、最初のページに新規データ情報が含まれていないことがわかりました。明らかに、そのデータは Web ページのソース コードに含まれていません。その後、ネットワークを確認すると、次のようなリクエスト フィールドが見つかりました。

_csrfToken: btXPBUerIB1DABWiVC7TspEYvekXtzMghhCMdN43  
_: 1630664902028  

これは js 暗号化なので、暗号化方法の解析を避けるために、Selenium を使用してデータをクロールした方が速いかもしれません。

Selenium によるデータのクロール

01 予備試験

from selenium import webdriver  
import time  
  
url = 'https://y.qq.com/n/ryqq/songDetail/0006wgUu1hHP0N'  
  
driver = webdriver.Chrome()  
  
driver.get(url)  

問題なく正常に動作することがわかりました。

02 小説データ

クロールする新規データ情報を指定します

画像リンク、名前、作者、種類、完結有無、人気度、プロフィール

次に、次のページのボタンをクリックして、動的データであるかどうかを確認します。動的データではないことがわかります。URL ルールは次のとおりです。

'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_1' # 第一页的url  
'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_2' # 第二页的url  

03 データの解析

ページ データを解析するコードは次のとおりです。

def get_data():  
    ficList = [] # 存储每一页的数据  
    items = driver.find_elements_by_xpath("//div[@class="right-book-list"]/ul/li")  
    for item in items:  
        dic = {}  
        imgLink = item.find_element_by_xpath("./div[1]/a/img").get_attribute('src')   
        # 1.图片链接 2.小说名称(name)  3.小说类型(types) ....  
        dic['img'] = imgLink  
        # ......   
        ficList.append(dic)  

注意すべき点がいくつかあります。

  1. xpath ステートメントの記述、細部に注意を払い、間違いを犯さないようにしてください。

  2. 小説の紹介文は、比較的長い紹介文や改行があるものもありますが、保存しやすくするために、文字列のreplaceメソッドを使用して「\n」を空の文字列に置き換える必要があります。

04 ページクローリング

データを反転およびクロールするコードは次のとおりです。

try:  
    time.sleep(3)  
    js = "window.scrollTo(0,100000)"  
    driver.execute_script(js)  
    while driver.find_element_by_xpath( "//div[@class='lbf-pagination']/ul/li[last()]/a"):  
        driver.find_element_by_xpath("//div[@class='lbf-pagination']/ul/li[last()]/a").click()  
        time.sleep(3)  
        getFiction()  
        print(count, "*" * 20)  
        count += 1  
        if count >= 50:  
            return None  
  
except Exception as e:  
    print(e)  

コードの説明:

  1. ステートメントを使用してtry例外処理を実行し、特殊なページ要素が一致しないことやその他の問題を防ぎます。

  2. ドライバーは js コードを実行し、スクロール ホイールを操作してページの一番下までスライドします。

    js = "window.scrollTo(0,100000)"  
    driver.execute_script(js)  
    
    
  3. time.sleep(n)ループ内に解析機能(ドライバー位置決め)を追加するため、データの読み込みが完了するまで待つ必要があります。

  4. whileループ ステートメントでは、次のページのデータが周期的にクロールされるように、while の後ろに‘下一页’ボタンが。

  5. ifこのステートメントを判定条件、while ループの終了条件として使用し、return を使用して関数を終了すると、break は機能しません。

05 データストレージ

titles = ['imgLink', 'name', 'author', 'types', 'pink','popu','intro']  
with open('hx.csv',mode='w',encoding='utf-8',newline='') as f:  
    writer = csv.DictWriter(f, titles)  
    writer.writeheader()  
    writer.writerows(data)  
    print('写入成功')  

06 プログラム実行中

1000 個のデータを表示した結果は次のようになります。

Selenium を使用してデータをクロールする場合は、次の点に注意してください。

① 次のページをクリックした後、すぐにデータが完全にロードされるわけではなく、データが完全にロードされない場合、Webdriver の find_Element_by_xpath ステートメントは dom ドキュメント上の要素を見つけることができず、エラーがスローされます。 :

selenium.StaleElementReferenceException:     
stale element reference: element is not     
attached to the page document  

大概意思:参照された要素は廃止されており、現在のページには接続されていません。
产生原因:通常、これはページの更新またはジャンプが原因です。

解决方法:
1. findElement または findElements メソッドを再利用して要素を見つけます。
2. または、webdriver.Chrome().refresh を使用して Web ページを更新し、更新する前に数秒待ってください (time.sleep(5))。

このエラーの解決策については、次のブログを参照してください:
https://www.cnblogs.com/qiu-hua/p/12603675.html

②動的に「次のページ」ボタンをクリックする場合、次のページのボタンを正確に見つける必要があります。第二に、非常に重要な問題は、Selenium がブラウザ ページを開くときにウィンドウを最大化する必要があることです

ウィンドウの右側に絶対位置の小さな QR コード ウィンドウがあるため、ウィンドウを最大化しないと次のページ ボタンがブロックされてクリックできなくなりますので注意が必要です。

データの分析と視覚化

ファイルを開く

import pandas as pd  
data = pd.read_csv('./hx.csv')  
data.head()  

データ情報によると、次のような視覚的な表示が可能です。

01 小説の種類の割合

types = ['现代言情', '古代言情', '玄幻', '玄幻言情', '科幻空间', '仙侠', '都市', '历史', '科幻', '仙侠奇缘', '浪漫青春', '其它']  
number = [343, 285,  83,  56,  45,  41,  41,  25,  14,  14,  13,40]  

pyecharts 円グラフ

from pyecharts import options as opts  
from pyecharts.charts import Page, Pie  
pie=(  
    Pie()  
    .add(  
            "",  
            [list(z) for z in zip(types, number)],  
            radius=["40%", "75%"],  
        )  
        .set_global_opts(  
            title_opts=opts.TitleOpts(title="不同类型小说占比"),  
            legend_opts=opts.LegendOpts(  
                orient="vertical", pos_top="15%", pos_left="2%"  
            ),  
        )  
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))  
    )  
  
pie.render('pie.html')  

結果を図に示します

この図からも恋愛小説が小説全体の半分を占めていることが分かります。

02 完結済み小説の割合

from pyecharts import options as opts  
from pyecharts.charts import Page, Pie  
  
ty = ['已完结','连载中']  
num = [723,269]  
pie=(  
        Pie()  
        .add("", [list(z) for z in zip(ty,num)])  
        .set_global_opts(title_opts=opts.TitleOpts(title="完结小说占比"))  
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))  
        )  
  
pie.render('pie1.html')  

結果を図に示します。

この図を見ると、小説の1/4以上が現在も連載中であることがわかります。

03 小説紹介ワードクラウド表示

.txt ファイルを生成する

with open('hx.txt','a',encoding='utf-8') as f:  
    for s in data['intro']:  
        f.write(s + '\n')  

初期化設定

# 导入相应的库  
import jieba  
from PIL import Image  
import numpy as np  
from wordcloud import WordCloud  
import matplotlib.pyplot as plt  
# 导入文本数据并进行简单的文本处理  
# 去掉换行符和空格  
text = open("./hx.txt",encoding='utf-8').read()  
text = text.replace('\n',"").replace("\u3000","")  
  
# 分词,返回结果为词的列表  
text_cut = jieba.lcut(text)  
# 将分好的词用某个符号分割开连成字符串  
text_cut = ' '.join(text_cut)  

ワードクラウド表示

word_list = jieba.cut(text)  
space_word_list = ' '.join(word_list)  
# print(space_word_list) 打印文字  可以省略  
# 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组  
mask_pic = np.array(Image.open("./xin.png"))  
word = WordCloud(  
    font_path='C:/Windows/Fonts/simfang.ttf',  # 设置字体,本机的字体  
    mask=mask_pic,  # 设置背景图片  
    background_color='white',  # 设置背景颜色  
    max_font_size=150,  # 设置字体最大值  
    max_words=2000,  # 设置最大显示字数  
    stopwords={'的'}  # 设置停用词,停用词则不在词云途中表示  
                 ).generate(space_word_list)  
image = word.to_image()  
word.to_file('h.png')  # 保存图片  
image.show()  

結果を図に示します

ここの写真からは特別な内容を見ることができませんが、他のより効果的な自然言語解析および処理方法を検討し、読者や友人に一緒に考えてもらうことができます。

04 小説人気ランキングをジャンル別に分析

from pyecharts.charts import Bar  
from pyecharts import options as opts  
bar = Bar()  
bar.add_xaxis(list(c['types'].values))  
bar.add_yaxis('小说热度排行',numList)  
bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)))  
bar.render()  

結果を図に示します

恋愛小説は古くから永遠のテーマだったことがわかります…。

ロマンス小説は中国の古風小説の一種で、天才学者や美女の小説としても知られています。これは、異性愛に焦点を当て、完全なストーリー展開と特定の環境描写を通じて、愛の心理学、状態、物事、その他の社会生活を反映する文学ジャンルです。

恋愛小説にはさまざまな種類があり、主に古代と現代のテーマに分けられます。その中には、再生記事、タイムトラベル記事、反タイムトラベル記事、SF記事、ハウスファイト記事、宮殿格闘記事、ファンタジー記事、ロード記事、その他のさまざまなテーマがあります。(百度百科事典)

05 異なる作家による人気小説の割合

著者が書いた小説の数を調べたところ、次のような結果が得られます。

data['author'].value_counts()  

最も多く執筆した上位 3 人の作家によると、ロマンス小説のみを執筆し、最後の 2 人は複数の小説を執筆しました。次に、これらの小説家のうち、恋愛小説家とその他の小説家の人気を分析します。

ロマンス小説家の人気

from pyecharts import options as opts  
from pyecharts.charts import Page, Pie  
attr = ["希行", "吱吱", "青铜穗"]  
v1 = [1383,1315,1074]  
  
pie=(  
        Pie()  
        .add("", [list(z) for z in zip(attr,v1)])  
        .set_global_opts(title_opts=opts.TitleOpts(title="言情小说作家热度"))  
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))  
        )  
  
pie.render('pie.html')  

これら 3 人の小説家は同様に人気があり、もちろん最も人気のある小説家です希行

Xixing、ペンネーム、以前は Pei Yun として知られていた女性、Qidian 中国のウェブサイトにある古代のことわざの代表的な作家の 1 人であり、女性オンライン文学の超人気作家です。中国作家協会会員。オレンジメロンの証人 · 20 年間のインターネット文学のトップ 100 作家。2009 年の創設以来、西興は 11 の作品を完成させ、1,000 万語以上を生み出しました。彼の作品のほとんどは、簡体字と伝統的な形式で出版されています。その中で、「Jiaoniang Medical Classic」と「Jun Jiuling」は映画やテレビで販売されています。権利。(百度百科事典)

小説家二人の人気ランキング

from pyecharts.charts import Bar  
from pyecharts import options as opts  
  
bar = Bar()  
#指定柱状图的横坐标  
bar.add_xaxis(['玄幻','奇幻','仙侠'])  
#指定柱状图的纵坐标,而且可以指定多个纵坐标  
bar.add_yaxis("唐家三少", [2315,279,192])  
bar.add_yaxis("我吃西红柿", [552,814,900])  
#指定柱状图的标题  
bar.set_global_opts(title_opts=opts.TitleOpts(title="热度小说排行"))  
#参数指定生成的html名称  
bar.render('tw.html')  
  

図に示されているように、Tang Jia San Shaoのファンタジー小説がより顕著ですが、 I Eat Tomatoesの人気は 3 つの小説の間で均等です。

最後に書きます

Honxiu Tianxiang Web サイトの小説ページ データをクロールするために Selenium を使用していますが、ページは js 暗号化されているため、注意点をまとめます。

① Selenium がデータをクロールする際の注意点がいくつかあります。

  • さまざまな要素の位置を正確に配置する必要があります。

  • Selenium を使用するには JS コードをロードする必要があるため、配置する前にすべての要素を完全にロードする必要があるため、Web ページを開くには time.sleep(n) を設定する必要があります。

  • さらに、多くの Web サイトには、QR コードなどの絶対位置の要素があり、これはコンピュータ画面上に固定されており、ページ ホイールのスクロールとともに移動しないため、これを防ぐためにページを最大化する必要があります。ウィンドウがページ要素をブロックするため、クリックやその他の操作ができなくなります。

② データを視覚的に表示する場合、データによっては次のようなエラーが発生する場合があるため、データをクリーンアップする必要があります。

'utf-8' codec can't decode byte 0xcb in   
position 2: invalid continuation byte  

これは、エンコード方法が異なるためです。一般に、エンコード方法はページのメタ タグの charset 属性をチェックすることによって取得され、エンコード属性値はパンダがファイルを開くときに設定されます。それでもエラーが報告される場合は、属性値は次のように変更できます'gb18030'

<meta charset="UTF-8">

注、この記事は学習とコミュニケーションのみを目的としており、サーバーの負荷を増やさないように、クローラーの味を少し試しています。

さて、今日の共有はこれで終わりです。

Pythonの
人気はますます高まっており、誰もがPythonを学ぶ時代もそう遠くなく、本業でも副業でもPythonの活用シーンはたくさんあります。 Python学習教材のフルセットですので、これからPythonを学習したい方のお役に立てれば幸いです!

1. Python全方位の学習ルート
Python全方位のルートは、Pythonでよく使われる技術的なポイントを整理し、さまざまな分野の知識をまとめたものであり、該当する学習リソースを見つけることができる点で有用です。上記の知識を踏まえて、より総合的に学んでください。
ここに画像の説明を挿入

2. ソフトウェアの学習
労働者が良い仕事をしたいなら、まず道具を研ぐ必要があります。Python を学習するために一般的に使用される開発ソフトウェアがここにあり、時間を大幅に節約できます。
ここに画像の説明を挿入

3. 入門学習ビデオビデオを
見て学習する場合、何もせずに目や頭を動かすだけではだめで、理解した上で活用するのがより科学的な学習方法であり、現時点ではハンズオンプロジェクトが非常に適しています。 。
ここに画像の説明を挿入

4. 実践事例
光学理論は役に立たないので、学んだことを実際に応用するには、手順を追って実践的な演習を行う必要がありますが、このとき、いくつかの実践事例から学ぶことができます。
ここに画像の説明を挿入

5. 面接資料
高収入の仕事を見つけるためには Python を学ばなければなりません. 以下の面接質問は Ali, Tencent, Byte などの第一線のインターネット企業からの最新の面接資料であり、Ali の上司が権威ある回答をしています。この一連の面接資料を完成させれば、誰もが満足のいく仕事を見つけることができると思います。
ここに画像の説明を挿入
ここに画像の説明を挿入

Python 学習教材のフルセットのこの完全版は CSDN にアップロードされています。必要な場合は、WeChat で以下の CSDN 公式認定の QR コードをスキャンして無料で入手できます【保证100%免费

おすすめ

転載: blog.csdn.net/wslejbb/article/details/130481705