最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用python爬蟲爬取CSDN博主信息

 更新時(shí)間:2021年04月14日 15:36:42   作者:皖渝  
這篇文章主要介紹了如何用python爬蟲獲取CSDN博主信息的方法,原理和代碼寫的非常詳細(xì),對(duì)大家學(xué)習(xí)Python爬取很有用處,有需要的朋友可以和小編一起看一下

一、項(xiàng)目介紹

爬取網(wǎng)址:CSDN首頁(yè)的Python、Java、前端、架構(gòu)以及數(shù)據(jù)庫(kù)欄目。簡(jiǎn)單分析其各自的URL不難發(fā)現(xiàn),都是https://www.csdn.net/nav/+欄目名樣式,這樣我們就可以爬取不同欄目了。

以Python目錄頁(yè)為例,如下圖所示:

在這里插入圖片描述

爬取內(nèi)容:每篇文章的博主信息,如博主姓名、碼齡、原創(chuàng)數(shù)、訪問量、粉絲數(shù)、獲贊數(shù)、評(píng)論數(shù)、收藏?cái)?shù)

(考慮到周排名、總排名、積分都是根據(jù)上述信息綜合得到的,對(duì)后續(xù)分析沒實(shí)質(zhì)性的作用,這里暫不爬取。)

在這里插入圖片描述

不想看代碼的朋友可直接跳到第三部分~

二、Selenium爬取

分析目錄頁(yè)可知文章是需要?jiǎng)討B(tài)加載的,此時(shí)需要selenium模擬瀏覽器不斷下拉才能獲取新的文章。文章的鏈接如下所示:

在這里插入圖片描述

1、第一種爬取思路(未果)

思路圖如下:

在這里插入圖片描述

執(zhí)行的關(guān)鍵代碼如下:

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對(duì)象
for i in range(len(blog_url)):
	url = blog_url[i].get_attribute('href')
	driver.get(url)
	#------------相關(guān)信息爬取(省略)----------
	driver.back() #返回目錄頁(yè)

理論上,這段代碼看起來是可以實(shí)現(xiàn)要求的,但實(shí)際上會(huì)遇到以下兩個(gè)問題!

(1)元素定位問題

報(bào)錯(cuò)的原因:selenium當(dāng)打開新的頁(yè)面后,原來定位過的元素都會(huì)失效,需要重新定位元素。上面的driver.back()相當(dāng)于打開的新的頁(yè)面(但是對(duì)于我們來說只是返回原來的頁(yè)面)

解決方式:只要每次返回目錄頁(yè)后重新定位元素即可,如下所示:

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)
	#------------相關(guān)信息爬取(省略)----------
	driver.back() #返回目錄頁(yè)

重新定位后,不難發(fā)現(xiàn),這必須要求blog_url和blog_refind_url這兩個(gè)列表的長(zhǎng)度一致啊!那也就是:每次返回目錄頁(yè)后,需要保持在上一次瀏覽的位置! 由此引發(fā)了第二個(gè)問題:定位元素的不一致。

(2)定位元素不一致

我們?cè)讷@取所有的文章鏈接之前,首先進(jìn)行的下滑頁(yè)面的操作。而每次driver.back()之后,頁(yè)面都會(huì)回到最初的位置!這就很頭疼,如果要保持一樣的瀏覽位置,難道每次返回后都要下拉相同次數(shù)的頁(yè)面么?那么此時(shí)我們需要解決的問題則是:如何保持上一級(jí)頁(yè)面的瀏覽位置。emm,查了一些資料,發(fā)現(xiàn)這個(gè)需求是和javascript相關(guān)的。詳細(xì)可參考這篇博客:js:返回到頁(yè)面時(shí)滾動(dòng)到上次瀏覽位置

大致解決思路:保存每次下滑的位置,然后最終調(diào)用最后一次下滑的位置。但歸根到底,還是需要每次滑動(dòng)頁(yè)面,依舊很麻煩,這種思路到這也只能不了了之了。(會(huì)javascript的朋友可以嘗試如何讓頁(yè)面直接恢復(fù)到上一級(jí)頁(yè)面瀏覽的位置)

2、第二種爬取思路(成功)

不過,仔細(xì)思考一下,上面兩個(gè)問題的來源關(guān)鍵在于selenium訪問頁(yè)面后,元素會(huì)重新定位。而我們第一步定位所有文章鏈接時(shí)保存的列表,里面的元素都是element對(duì)象(它是會(huì)隨著頁(yè)面變化而改變的?。?/strong>。所以,我們只要保存每個(gè)文章的url到一個(gè)列表,挨個(gè)訪問每個(gè)url,不就可以了?

思路圖如下:

在這里插入圖片描述

兩種思路的對(duì)比與思考:前者裝有所有文章的列表里都是element對(duì)象,而后者裝有所有文章的列表里都是url。后者免去了再返回頁(yè)面這一操作,相當(dāng)于將一個(gè)爬取二級(jí)頁(yè)面問題轉(zhuǎn)化為一級(jí)頁(yè)面問題!

全部代碼如下:

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('共{}個(gè)博主'.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('第{}個(gè)博主信息爬取完成'.format(count))
            except:
                print('相關(guān)信息不全')
        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('共花費(fèi){}分鐘'.format(spend_time))

爬取結(jié)果如下:

在這里插入圖片描述

三、Webscraper爬取

之前的博客分享過Webscraper是一種輕量級(jí)的爬取軟件。不想看代碼的朋友可以用它來復(fù)現(xiàn)上述爬取過程。(注:以下爬取過程只是針對(duì)首頁(yè)的某一個(gè)欄目)

最終的爬取線路圖如下

在這里插入圖片描述

依舊以首頁(yè)的Python欄為例:

1、創(chuàng)建下拉對(duì)象

這個(gè)container只是一個(gè)ID,它可以取任意名字的。其他的設(shè)置如下圖所示:

在這里插入圖片描述

Type勾選Element_scroll_down(負(fù)責(zé)下拉頁(yè)面)勾選上Multiple后,點(diǎn)擊多個(gè)文章所在模塊后,則會(huì)出現(xiàn)紅色選定。此時(shí)點(diǎn)擊Done selecting,完成selector的配置。Delay設(shè)置為2000毫秒(給予頁(yè)面反應(yīng)時(shí)間)

此外,需要在selector后面加上:nth-of-type(-n+300),控制爬取的條數(shù),否則它會(huì)一直下拉頁(yè)面?。ㄟ@里的300則代表需要爬取的總條數(shù))最終,selector的配置如下:

在這里插入圖片描述

2、創(chuàng)建文章鏈接對(duì)象

保存container的selector后,點(diǎn)擊進(jìn)入下一層,創(chuàng)建如下selector

在這里插入圖片描述

具體內(nèi)容如下:

在這里插入圖片描述

Type選擇LinkSelector中不勾選Multiple,h2 a則是文章鏈接定位的位置

Link不方便定位的話,可以先選擇text進(jìn)行定位,然后得到位置后,再?gòu)?fù)制到link這即可。

3、創(chuàng)建博主信息對(duì)象

同理,保存完inf的selector后,再點(diǎn)擊進(jìn)入下一層,依次創(chuàng)建各類信息的selector,如下所示:

在這里插入圖片描述

以name為例,其內(nèi)容如下:

在這里插入圖片描述

type選擇text,相應(yīng)的選擇器內(nèi)容只要鼠標(biāo)點(diǎn)擊博主姓名即可獲得。

這樣,我們就完成了所有的準(zhǔn)備工作,接下來就可爬取啦~所有延遲時(shí)間均設(shè)置為2000ms

在這里插入圖片描述

最終爬取結(jié)果如下(這里僅作演示,只爬取了七條):

在這里插入圖片描述

本次創(chuàng)建的sitemap如下,有興趣的朋友可以自己實(shí)驗(yàn)下,只需要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"}

總結(jié):Webscraper雖然簡(jiǎn)單易操作,速度也和selenium差不多,但每次只能爬一個(gè)網(wǎng)址,需要連續(xù)爬取多個(gè)網(wǎng)址,還是得碼代碼~
以上就是使用python快速爬取CSDN博主信息的詳細(xì)內(nèi)容,更多關(guān)于python爬取CSDN博主信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中zip()函數(shù)用法及應(yīng)用場(chǎng)景詳解

    Python中zip()函數(shù)用法及應(yīng)用場(chǎng)景詳解

    Python的zip()函數(shù)用于將多個(gè)可迭代對(duì)象的元素按位置組合成元組,支持不等長(zhǎng)的可迭代對(duì)象和多個(gè)可迭代對(duì)象,這篇文章主要介紹了Python中zip()函數(shù)用法及應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • python3 requests 各種發(fā)送方式詳解

    python3 requests 各種發(fā)送方式詳解

    這篇文章主要介紹了python3 requests 各種發(fā)送方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 關(guān)于Python3爬蟲利器Appium的安裝步驟

    關(guān)于Python3爬蟲利器Appium的安裝步驟

    在本篇文章里小編給大家整理的是一篇關(guān)于Python3爬蟲利器Appium的安裝步驟,需要的朋友們可以跟著參考下。
    2020-07-07
  • 圖解Python中的淺拷貝和深拷貝

    圖解Python中的淺拷貝和深拷貝

    這篇文章主要介紹了圖解Python中的淺拷貝和深拷貝,深拷貝,拷貝的程度深,自己新開辟了一塊內(nèi)存,將被拷貝內(nèi)容全部拷貝過來了,淺拷貝,拷貝的程度淺,只拷貝原數(shù)據(jù)的首地址,然后通過原數(shù)據(jù)的首地址,去獲取內(nèi)容,需要的朋友可以參考下
    2023-11-11
  • python os.path.isfile()因參數(shù)問題判斷錯(cuò)誤的解決

    python os.path.isfile()因參數(shù)問題判斷錯(cuò)誤的解決

    今天小編就為大家分享一篇python os.path.isfile()因參數(shù)問題判斷錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法

    python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法

    python,本身來說是一門高級(jí)編程語(yǔ)言,python它入門簡(jiǎn)單,有基礎(chǔ)的學(xué)起來很快就能有簡(jiǎn)單的應(yīng)用,但是在非常高的抽象計(jì)算中,高級(jí)的python程序設(shè)計(jì)也是非常難學(xué)的。接下來給大家介紹python2.7讀取文件夾下所有文件名稱及內(nèi)容的方法,一起看看吧
    2018-02-02
  • 解決Pycharm輸入法無法切換中英文問題

    解決Pycharm輸入法無法切換中英文問題

    這篇文章主要介紹了解決Pycharm輸入法無法切換中英文問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Python使用當(dāng)前時(shí)間、隨機(jī)數(shù)產(chǎn)生一個(gè)唯一數(shù)字的方法

    Python使用當(dāng)前時(shí)間、隨機(jī)數(shù)產(chǎn)生一個(gè)唯一數(shù)字的方法

    這篇文章主要介紹了Python使用當(dāng)前時(shí)間、隨機(jī)數(shù)產(chǎn)生一個(gè)唯一數(shù)字的方法,涉及Python時(shí)間與隨機(jī)數(shù)相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Python中is與==判斷的區(qū)別

    Python中is與==判斷的區(qū)別

    在python中,is檢查兩個(gè)對(duì)象是否是同一個(gè)對(duì)象,而==檢查他們是否相等.這樣說起來很簡(jiǎn)單,我們通過具體的實(shí)例來分析吧
    2017-03-03
  • django框架配置swagger以及自定義參數(shù)使用方式

    django框架配置swagger以及自定義參數(shù)使用方式

    這篇文章主要介紹了django框架配置swagger以及自定義參數(shù)使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評(píng)論

固安县| 九江县| 长治县| 通渭县| 衡阳市| 太仓市| 焉耆| 怀柔区| 洮南市| 买车| 海丰县| 崇义县| 视频| 新余市| 定边县| 米泉市| 行唐县| 望谟县| 饶阳县| 镇雄县| 长武县| 阳谷县| 江源县| 墨脱县| 临湘市| 新巴尔虎左旗| 当雄县| 贵阳市| 繁峙县| 邢台市| 吉首市| 大理市| 中方县| 辰溪县| 调兵山市| 福泉市| 乌拉特后旗| 清水河县| 白河县| 洪雅县| 和林格尔县|