python爬虫類でCSDNブロガー情報を取る


一、プロジェクト紹介
ネットアドレス:CSDNトップページのPython、Java、先端、アーキテクチャ及びデータベース欄。それぞれのURLを簡単に分析します。https://www.csdn.net/nav/+欄の名前の形を書いてください。これで違う欄に登れます。
Pythonディレクトリページを例にとって、次の図のようになります。
在这里插入图片描述
各文章のブロガー情報、例えば、ブロガーの名前、年齢、オリジナルの数、訪問量、ファンの数、賞賛の数、コメント数、コレクション数
(週間ランキング、総順位、ポイントは上記の情報に基づいて総合的に得られたもので、後続の分析には実質的な役割がないと考えて、ここではしばらく登りません。)
在这里插入图片描述
コードを見たくない友達は直接第三部分までジャンプできます。
二、Selenium登山
カタログページを分析すると、文章は動的にロードする必要があることが分かります。この時はseleniumシミュレーションブラウザが絶えずダウンしてこそ、新しい文章を取得することができます。記事のリンクは以下の通りです。
在这里插入图片描述
1、第一種類は考えを登ります(未果)
構想図は以下の通りです
在这里插入图片描述
実行するキーコードは以下の通りです。

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/nav/python')
#     
for i in range(10):
        driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
	time.sleep(1)
#      
blog_url = driver.find_elements_by_css_selector('div.title > h2 > a') #  :        element  
for i in range(len(blog_url)):
	url = blog_url[i].get_attribute('href')
	driver.get(url)
	#------------      (  )----------
	driver.back() #     
理論上、このコードは要求を実現できるように見えますが、実際には次の二つの問題があります。
(1)元素の位置決め問題
エラーの原因:seleniumは新しいページを開けたら、元の位置付けした要素は全部無効になります。元素を再配置する必要があります。上のdriver.backは開いている新しいページに相当します。しかし、私達にとっては元のページに戻るだけです。
解決方法:カタログページに戻ったら要素を再配置すればいいです。以下のようになります。

for i in range(len(blog_url)):
	blog_refind_url = driver.find_elements_by_css_selector('div.title > h2 > a')  #    
	url = blog_refind_url[i].get_attribute('href')
	driver.get(url)
	#------------      (  )----------
	driver.back() #     
改めて位置付けをしたら、なかなか見つけられません。これはblogを要求しなければなりません。urlとblogrefind_urlという二つのリストの長さは同じです。つまり、目次のページに戻るたびに、前のページの位置に保つ必要があります。これによって第二の問題が発生した。局在要素の不一致。
(2)位置決め要素が一致しない
すべてのリンクを取得する前に、まずスライドページの操作を行います。そして、毎回driver.backの後、ページは最初の位置に戻ります。これはとても頭が痛いです。同じ位置を維持するには毎回同じ回数のページをめくりますか?そこで、私たちが解決したい問題は、前のページの閲覧位置をどう維持するかです。emでは、いくつかの資料を調べましたが、この需要はjavascriptと関連していることが分かりました。詳細はこのブログを参照してください。js:ページに戻ると、前回の閲覧位置にスクロールします。
考え方を大体解決します。降りる位置を保存して、最後のスライドの位置を呼び出します。つまり、ページをスライドさせるたびに、やっぱり面倒くさいということは、これでおしまいです。javascriptができる友達はどのようにページを直接上のページのブラウズ位置に回復するかを試してもいいです。
2、第二の考え方(成功)
でも、よく考えてみてください。上の二つの問題の源はseleniumがページを訪問した後、元素が再配置されます。最初のステップは、すべての記事がリンクされている時に保存されているリストにあります。中身はすべてelementオブジェクトです。ページの変化によって変化します。だから、私たちは文章を一つのリストに保存して、一つずつのurlにアクセスすればいいです。
構想図は以下の通りです
在这里插入图片描述
二つの考えの対比と思考:前者はすべての文章のリストにelementの対象で、後者はすべての文章のリストにurlが入っています。後者はページに戻る操作をやめて、一つのページを二段階のページに登る問題を一級のページ問題に転化することに相当します。
すべてのコードは以下の通りです。

from selenium import webdriver
import os
os.chdir('C:/Users/dell/Desktop')
import time
import pandas as pd
def scroll_down(driver,num):
    for i in range(num):
        driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
        time.sleep(1)
def save_data(df):
    data=pd.DataFrame(df,columns=['blog_name','code_time','blog_num',
                                'view_num','fans_num','likes_num',
                                'comments_num','collections_num'])
    data.to_csv('csdn_user.csv',index=False,encoding='gb18030')
def crawler_csdn(parts_list):
    opt = webdriver.ChromeOptions()
    opt.add_experimental_option('excludeSwitches',['enable-automation'])
    opt.add_argument('--headless')
    opt.add_argument('--disable-gpu')
    opt.add_argument('blink-settings=imagesEnabled=false')
    driver = webdriver.Chrome(options=opt)
    df = []
    for part in parts_list:
        count=0
        url_des='https://www.csdn.net/nav/'+part
        driver.get(url_des)
        scroll_down(driver,30)
        time.sleep(2)
        print('    {}  '.format(part))
        blog_list=[]
        blog_url = driver.find_elements_by_css_selector('div.title > h2 > a')
        for url in blog_url:
            blog_list.append(url.get_attribute('href'))
        print(' {}   '.format(len(blog_list)))
        for i in range(len(blog_list)):
            try:
                driver.get(blog_list[i])
                blog_name = driver.find_element_by_css_selector('div.profile-intro-name-boxTop > a >span.name').text
                code_time = driver.find_element_by_css_selector('span.personal-home-page.personal-home-years').text
                blog_num = driver.find_element_by_css_selector(
                    'div.data-info.d-flex.item-tiling>dl.text-center>a>dt>span.count').text
                inf_list = driver.find_elements_by_css_selector('div.data-info.d-flex.item-tiling>dl.text-center>dt>span.count')
                df.append([blog_name, code_time, blog_num,
                           inf_list[0].text, inf_list[2].text, inf_list[3].text,
                           inf_list[4].text, inf_list[5].text])
                count += 1
                print(' {}         '.format(count))
            except:
                print('      ')
        print('{}      '.format(part))
    return df
if __name__ =='__main__':
    start = time.time()
    parts_list=['Python','Java','web','arch','db']
    df = crawler_csdn(parts_list)
    save_data(df)
    end = time.time()
    spend_time = int((end-start)/60)
    print('   {}  '.format(spend_time))
登山の結果は以下の通りです。
在这里插入图片描述
三、Webscraperは這って取る
以前のブログでWebscraperを共有したことがあります。ライト級の登山ソフトです。コードを見たくない友達は上記の登山過程を再現するためにそれを使ってもいいです。注:以下の這い取りはトップページのある欄に対してだけです。
最終的な登取路線図は以下の通りです。
在这里插入图片描述
トップページのPython欄を例にします。
1、プルダウンオブジェクトを作成する
このcontainerはIDだけです。任意の名前を付けられます。他の設定は下図のようにします。
在这里插入图片描述
TypeはElementにチェックしてくださいscroll_ダウンタウン(ページを引き下げる担当)でMultipleにチェックを付け、複数の記事のあるモジュールをクリックすると、赤で選択されます。Donselectingをクリックして、selectorの配置を完了します。Delayは2000ミリ秒に設定されています(ページ反応時間を与える)
また、selectorの後ろに:nth-of-type(-n+300)を追加して、よじ登る本数を制御してください。そうでないと、ずっとページを引き落とします。ここの300は登るべき総条数を表します。最終的に、selectorの配置は以下の通りです。
在这里插入图片描述
2、記事のリンク先を作成する
containerのselectorを保存し、次の階にクリックして次のselectorを作成します。
在这里插入图片描述
具体的な内容は以下の通りです。
在这里插入图片描述
TypeはLinkSelectorの中からMultipleにチェックしないで、h 2 aは文章のリンクの位置です。
Linkが位置を決めるのが不便なら、textを選んで位置を決めてから、linkにコピーすればいいです。
3、ブロガー情報オブジェクトの作成
同じように、infのselectorを保存してから、次の階にクリックして、各種類の情報を順次作成するselectorを下記に示します。
在这里插入图片描述
nameを例にとって、その内容は以下の通りです。
在这里插入图片描述
typeはtextを選択して、該当する選択内容はマウスでブロガーの名前をクリックすれば獲得できます。
これですべての準備が完了しました。次は登れます。すべての遅延時間は2000 msに設定されています。
在这里插入图片描述
最終登山の結果は以下の通りです。
在这里插入图片描述
今回作成したsitemapは以下の通りです。興味のある方は自分で実験してみてください。import sitemapだけでいいです。
在这里插入图片描述

{"startUrl":"https://blog.csdn.net/nav/python","selectors":[{"parentSelectors":
["_root"],"type":"SelectorElementScroll","multiple":true,"id":"container","selector":"ul.feedlist_mod li.clearfix:nth-of-type(-n+300)","delay":"2000"},{"parentSelectors":
["container"],"type":"SelectorLink","multiple":false,"id":"inf","selector":"h2 a","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"name","selector":"div.profile-intro-name-boxTop span.name","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"blog_num","selector":"dl.text-center:nth-of-type(1) a span.count","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"code_time","selector":"span.personal-home-page.personal-home-years","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"views_num","selector":"div.data-info:nth-of-type(2) dl.text-center > dt span.count","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"fans","selector":"dl#fanBox.text-center span.count","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"agreement","selector":"dl.text-center:nth-of-type(3) > dt span.count","regex":"","delay":""},{"parentSelectors":
["inf"],"type":"SelectorText","multiple":false,"id":"comment","selector":"div.data-info:nth-of-type(4) dl.text-center:nth-of-type(4) span.count","regex":"","delay":""},{"parentSelectors":["inf"],"type":"SelectorText","multiple":false,"id":"collection_num","selector":"dl.text-center:nth-of-type(5) span.count","regex":"","delay":""}],"_id":"csdn"}
まとめ:Webscraperは簡単で操作しやすくて、スピードもseleniumと同じですが、毎回一つのURLを登るしかないです。複数のURLを連続して登らなければなりません。コードを取らなければなりません。
以上はpythonを使ってCSDNブロガー情報の詳細を素早く登り、pythonについてCSDNブロガー情報の資料を多く取ります。他の関連記事に注目してください。