目次
序文
最近出張に行ったのですが、宿泊していたホテルにXiaoqiangがあることに気づきました。それで、出張で退屈していたときに、趣味でクローラー コードを書いたのですが、質問するのはちょうどいい機会でした。この記事は主に、CSDN 総合ホットリストの 100 タイトルをクロールし、単語分割によってキーワードを抽出し、単語の頻度をカウントします。
考えてみましたが、これは他のブロガーにとっても便利ですし、どのようなタイトルがホットリストに載るかを確認して共有することができます。さて、様々な問題を解決する方法についてお話します。
環境
使用される IDE は次のとおりです: spyder (インターフェイスを見ることに慣れていない場合は、我慢してください。これは重要ではありません)
chromedriverを使ってページをクロールしているのですが、その理由については後ほどお話します。
ワード ブレーカー: ジーバ
クロールページアドレス: https://blog.csdn.net/rank/list
クローラーコード
ページのソース コードがリクエストで直接取得されない理由について説明します。主に、ページはソース コードを直接リクエストできないためです。代わりに、ページの一番下までスクロールして、ランク付けされた 100 件の記事をすべて表示します。
したがって、私のアイデアは、chromedriver を使用し、js を実行してページを一番下までスクロールすることです。
ここでは、Chromedriver のダウンロードについて説明する必要があります。これは、Google ブラウザのバージョンに基づく必要があります。私のラップトップは Mac です。左上隅にある Chrome をクリックし、[ Google Chrome について]をクリックすると、ブラウザのバージョンが表示されます。
chromedriver のダウンロード アドレスを共有します: Google chrome driver ダウンロード アドレス
ドライバーの原理を簡単に説明します。これは、私たちの手と同じように、ブラウザーで URL を開く操作をシミュレートするものです。具体的な原理については、また別の機会に説明します。
もうナンセンスではありません。クローラー ツールのコードにアクセスしてください
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 4 17:15:06 2021
@author: huyi
"""
from selenium import webdriver
import time
# =============================================================================
# 爬取动态下滑加载网页
# =============================================================================
def pa(url):
driver = webdriver.Chrome('/usr/local/bin/chromedriver')
driver.get(url)
js = '''
let height = 0
let interval = setInterval(() => {
window.scrollTo({
top: height,
behavior: "smooth"
});
height += 500
}, 500);
setTimeout(() => {
clearInterval(interval)
}, 20000);
'''
driver.execute_script(js)
time.sleep(20)
source = driver.page_source
driver.close()
return source
コードの説明
1. コードは主にツール メソッドであり、diver を使用してブラウザを開きます。次に、js コードを通じて、下にスクロールする操作をシミュレートします。
2. ネットワークの状況に応じて、内部のタイムアウト時間を調整できます。私のホテルのネットワークは比較的遅いため、設定が比較的大きいため、一番下までスクロールして終了することは避けてください。
3. 後の xpath 分析のために、ページのソース コードに戻ります。
確認する
OK、ページのソースコードを取得しました。
キーワード抽出コード
キーワード抽出の手法も用意しています。コードに関してはナンセンスではありません。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 4 21:53:22 2021
@author: huyi
"""
import jieba.analyse
def get_key_word(sentence):
result_dic = {}
words_lis = jieba.analyse.extract_tags(
sentence, topK=3, withWeight=True, allowPOS=())
for word, flag in words_lis:
if word in result_dic:
result_dic[word] += 1
else:
result_dic[word] = 1
return result_dic
コードの説明
1. 簡単に説明すると、この方法では最も重みの高い 3 つの単語が使用されますが、好みに応じて調整できます。
2. 同じ単語の数を数えます。これは、100 個のタイトル キーワードの頻度を数えるのに便利です。
メインプログラムコード
メインプログラムは主にソースコード中のタイトルを抽出し、lxmlを使って要素を抽出してタイトルを取得するというものです。次に、単語頻度統計の後に結果テキストを出力します。
コードに関してはナンセンスではありません。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 4 14:01:38 2021
@author: huyi
"""
from lxml import etree
from tools.dynamic_page import pa
from tools.analyse_word import get_key_word
csdn_url = 'https://blog.csdn.net/rank/list'
source = etree.HTML(pa(csdn_url))
titles = source.xpath("//div[@class='hosetitem-title']/a/text()")
key_word_dic = {}
for x in titles:
if x:
for k, v in get_key_word(x).items():
if k.lower() in key_word_dic:
key_word_dic[k.lower()] += v
else:
key_word_dic[k.lower()] = v
word_count_sort = sorted(key_word_dic.items(),
key=lambda x: x[1], reverse=True)
with open('result.txt', mode='w', encoding='utf-8') as f:
for y in word_count_sort:
f.write('{},{}\n'.format(y[0], y[1]))
コードの説明
1. xpath を取得するにはどうすればよいですか? Google ブラウザは右クリックによる直接コピーをサポートしていますが、それでも xpath 関連の構文について学ぶことをお勧めします。
2. 繰り返しを避けるために、すべての英単語を小文字にします。
3. 出力を単語頻度の逆順に並べます。頻度が最も高い単語が最初になります。
検証結果
当然のことですが、Java は yyds です。
要約する
最終的な統計には、何というか、いくつかの記号があることがわかります。スクリーニング方法によっては、jieba ストップワードで削除できます。
明確にしておきますが、この記事のケーススタディは調査と使用のみを目的としており、悪意のある攻撃を目的としたものではありません。
この記事が役に立った場合は、ケチらずに「いいね」を押してください。ありがとうございます。