Seleniumを使って微博爬虫類を実現します。


前言
CSDNでの最初の文章は、2年ぶりにマイクロブログに登る自由が実現しました。本稿では、マイクロブログの事前登録、「全文展開」を識別し、完全なデータを取得し、ページをめくる設定などの問題を解決することができる。爬虫類に接触したばかりなので、一部の用語は正しくないかもしれません。ご指摘ください。
一、動的爬虫類と静的爬虫類を区別する
1、静的ホームページ
静的なウェブページは純粋なHTMLで、バックグラウンドのデータベースがなくて、プログラムをくわえないで、インタラクションすることができなくて、体の量はより少なくて、スピードをロードするのは速いです。静的なウェブページの取得には、要求を送信し、対応するコンテンツを取得し、解析内容とデータを保存する4つのステップが必要です。
2、ダイナミックページ
ダイナミックウェブページのデータは時間とユーザーのインタラクションによって変化しますので、データは直接ホームページのソースコードに現れません。データはJsonの形式で保存されます。したがって、動的ページは、静的ページよりも1ステップ多くなり、関連データをレンダリングする必要があります。
3、静的なページを区別する方法
ウェブページをロードした後、右ボタンをクリックして、「ウェブページのソースコードを確認する」を選択してください。ウェブページのほとんどのフィールドにソースコードが表示されている場合、これは静的なウェブページです。そうでなければ、ダイナミックなウェブページです。
在这里插入图片描述
二、動態爬虫の二つの方法
1.逆方向分析によるダイナミックページの登用
スケジューリングリソースに対応するURLに適用されるデータはJson形式であり、Javascriptのトリガ・スケジュールである。主なステップは、スケジューリングされたリソースが必要とされる対応するアドレス・アクセス・アドレスを取得するためのデータを取得することである(ここは詳しく説明しません。
2.Seleniumライブラリを使って動的ページを登る
Seleniumライブラリを使って、JavaScriptを使って実際のユーザーをシミュレーションしてブラウザを操作します。このケースはこの方法を使用します。
三、Seleniumライブラリの設置とブラウザのパッチのダウンロード
1.Seleniumライブラリはpipツールでインストールすればいいです。
2.Chromeブラウザのバージョンにマッチするブラウザのパッチをダウンロードします。
Step 1:Chromeのバージョンを見る
在这里插入图片描述
Step 2:該当バージョンのブラウザパッチをダウンロードします。URL:http://npm.taobao.org/mirrors/chromedriver/
Step 3:ファイルを解凍し、python.exeと同じファイルの下に置く
在这里插入图片描述
四、ページの開きと事前登録
1.seleniumバッグの導入

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time
import pandas as pd
2.ページを開く

driver = webdriver.Chrome()    
print('    Weibo.cn  ...')
#    
driver.get("https://login.sina.com.cn/signup/signin.php")
wait = WebDriverWait(driver,5)
#  :  1       ,           
time.sleep(60)
3.インタラクティブ運転を採用して、上の二つのプログラムを実行したら、一つの枠がポップアップします。この枠はウェブページのインタラクションをシミュレートするために使います。このボックスで登録を完了する(ログイン名、パスワード、ショートメールの検証などを含む)
在这里插入图片描述
4.事前登録が完了したら、個人のホームページに入ります。
在这里插入图片描述
五、キーワード検索操作
1.上の図のキーワード入力ボックスを位置づけ、ボックスに検索対象を入力し、例えば「一生懸命勉強する」

#  selector         
s_input = driver.find_element_by_css_selector('#search_input')
#         
s_input.send_keys("    ")
#     
confirm_btn = driver.find_element_by_css_selector('#search_submit')
#  
confirm_btn.click()
2.前のステップのコードの実行が完了すると、新しいウィンドウが表示され、個人のホームページからミニブログの検索ページにジャンプします。しかし、driverはまだ個人のホームページにあります。人のためにドライブの移動をして、微博検索ページに移動する必要があります。
在这里插入图片描述
3.スイッチを使うト.window()方法シフト

#    driver
driver.switch_to.window(driver.window_handles[1])
六、「全文展開」を識別してデータを取得する
1.各要素のSelectorを理解し、位置を決める(一意の標識性に重点がある)
在这里插入图片描述
2.Selectorで元素を位置決めし、該当データを取得する

comment = []
username = []

#    :         (      、  、     ),     20   ,  nodes     20
nodes = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')

#           
for i in range(0,len(nodes),1):
    #         “    ”   
    flag = False
    try:
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
        flag = True  
    except:
        flag = False
    
    #       “    ”   ,         “    c”,        ,          ;        
    #(          ,   selector         ,        ,        )
    if(flag and nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('    c')):
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
    else:
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
    username.append(nodes[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)
七、二ページ設置
1.forサイクルを使ってページをめくることを実現します。ポイントは「次のページ」ボタンを識別してクリックすることです。

for page in range(49):
    print(page)
    #        
    nextpage_button = driver.find_element_by_link_text('   ')
    #    
    driver.execute_script("arguments[0].click();", nextpage_button)
    wait = WebDriverWait(driver,5)
    #     
    nodes1 = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')
    for i in range(0,len(nodes1),1):
        flag = False
        try:
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
            flag = True
        
        except:
            flag = False
        if (flag and nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('    c')):
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
        else:
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
        username.append(nodes1[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)
八、データの保存
1.DataFrameを使ってフィールドを保存する

data = pd.DataFrame({'username':username,'comment':comment})
在这里插入图片描述
2.Excelにエクスポート

data.to_excel("weibo.xlsx")
九、完全コード

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import pandas as pd

'''    ,   '''
driver = webdriver.Chrome()    
print('    Weibo.cn  ...')
#    
driver.get("https://login.sina.com.cn/signup/signin.php")
wait = WebDriverWait(driver,5)
#  :  1       ,           
time.sleep(60)

'''         ,    '''
#  selector         
s_input = driver.find_element_by_css_selector('#search_input')
#         
s_input.send_keys("    ")
#     
confirm_btn = driver.find_element_by_css_selector('#search_submit')
#  
confirm_btn.click()

#    driver
driver.switch_to.window(driver.window_handles[1])

'''       '''
comment = []
username = []

#    :         (      、  、     ),     20   ,  nodes     20
nodes = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')

#           
for i in range(0,len(nodes),1):
    #         “    ”   
    flag = False
    try:
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
        flag = True  
    except:
        flag = False
    
    #       “    ”   ,         “    c”,        ,          ;        
    #(          ,   selector         ,        ,        )
    if(flag and nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('    c')):
        nodes[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
    else:
        comment.append(nodes[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
    username.append(nodes[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)

'''    ,         '''
for page in range(49):
    print(page)
    #        
    nextpage_button = driver.find_element_by_link_text('   ')
    #    
    driver.execute_script("arguments[0].click();", nextpage_button)
    wait = WebDriverWait(driver,5)
    #     
    nodes1 = driver.find_elements_by_css_selector('div.card > div.card-feed > div.content')
    for i in range(0,len(nodes1),1):
        flag = False
        try:
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").is_displayed()
            flag = True
        
        except:
            flag = False
        if (flag and nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").text.startswith('    c')):
            nodes1[i].find_element_by_css_selector("p>a[action-type='fl_unfold']").click()
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content_full"]').text)
        else:
            comment.append(nodes1[i].find_element_by_css_selector('p[node-type="feed_list_content"]').text)
        username.append(nodes1[i].find_element_by_css_selector("div.info>div:nth-child(2)>a").text)

'''    '''
data = pd.DataFrame({'username':username,'comment':comment})
data.to_excel("weibo.xlsx")
ここでSeleniumを使って微博爬虫(前登録、全文展開、ページをめくる)を実現する記事について紹介します。Selenium微博爬虫類に関する詳細は以前の文章を検索してください。または次の関連記事を引き続きご覧ください。これからもよろしくお願いします。