爬取微博特定一用戶的微博評論(一)

項目簡述

下面的url是朋友叫我爬取的對象共青團的微博。
會爬取共青團的所有熱門微博的全部的微博下的前20個一級評論
打包到一個文件夾中,每個文件都是放一個微博的前20條評論
(本來目標是拿200個微博的,但是後來就變成只有86個了…)

使用要求

就是需要在打開網頁的30秒內,完成微博的登錄。
因爲,在後面,需要爬取很多的個微博,所以,只有登錄後纔會拿到。

缺點分析

  1. 通過模擬人的行爲,來進行爬取,這大概是目前爬蟲最慢,但是卻最厲害的方法了。(人眼所見,就是可以拿到的數據)
    比較慢,這除了導致在使用的時候很慢,而且debug的時候也會特別的慢。
  2. 爬取的時候,只是拿到了比較熱的前87個。要是熱門的微博數量小於200的時候,我沒有做容錯。還有就是,如果想要去拿到所有微博的信息,那就要在開始的時候,先做頁面的切換先(這個,可以手動操作,也可以,設置在代碼中)
  3. 登錄那裏還是需要手寫,因爲,我懶得設置定位了…(大家有需求可以自己加)

使用Selenium技巧

  • 使用了Selenium模擬鼠標點擊。
  • Selenium通過CSS選擇器來定位數據。
  • Browser切換

代碼

from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
import xlwt
import os

if not os.path.exists('./Data'):
    os.mkdir('./Data')


browser = webdriver.Chrome()
url = 'https://weibo.com/u/3937348351?topnav=1&wvr=6&topsug=1'
browser.get(url)
print('Waiting')
time.sleep(30)
print('Finish Waiting')

Pl_Official_MyProfileFeed__25 = browser.find_element_by_id('Pl_Official_MyProfileFeed__25')
WB_feed_WB_feed_v3_WB_feed_v4 = Pl_Official_MyProfileFeed__25.find_element_by_css_selector('div[module-type="feed"]')
divs = WB_feed_WB_feed_v3_WB_feed_v4.find_elements_by_css_selector('div[tbinfo="ouid=3937348351"]')
TIMES = 0
FLESH_TIME = 0
for div in divs:
    fl_comment = div.find_element_by_css_selector('a[action-type="fl_comment"]')
    ActionChains(browser).click(fl_comment).perform()
    time.sleep(2)
    need_approval_comment = div.find_element_by_css_selector('div[node-type="need_approval_comment"]')
    list_ul = need_approval_comment.find_element_by_css_selector('div[class="list_ul"]')
    _blank = list_ul.find_elements_by_css_selector('a[target="_blank"]')[-1]
    ActionChains(browser).click(_blank).perform()
    browser.switch_to_window(browser.window_handles[1])
    time.sleep(5)
    list_ul = browser.find_element_by_css_selector('div[class="list_ul"]')
    comments = list_ul.find_elements_by_css_selector('div[class="WB_text"]')
    count = 0

    work_book = xlwt.Workbook("./Data/")
    sheet = work_book.add_sheet('sheet 1')
    for comment in comments:
        string = comment.text
        if '回覆' in string:
            continue
        else:
            # print(string)
            sheet.write(count, 0, string)
            count += 1
        if count == 20:
            break
    work_book.save('./Data/%d.xls' % TIMES)
    time.sleep(3)

    browser.close()
    browser.switch_to_window(browser.window_handles[0])
    print(
        ' Finish', TIMES
    )
    TIMES += 1
    FLESH_TIME += 1
    if TIMES == 200:
        break
    if TIMES > 12:
        Pl_Official_MyProfileFeed__25 = browser.find_element_by_id('Pl_Official_MyProfileFeed__25')
        WB_feed_WB_feed_v3_WB_feed_v4 = Pl_Official_MyProfileFeed__25.find_element_by_css_selector(
            'div[module-type="feed"]')
        divs_Change = WB_feed_WB_feed_v3_WB_feed_v4.find_elements_by_css_selector('div[tbinfo="ouid=3937348351"]')
        divs.extend(divs_Change[FLESH_TIME:FLESH_TIME+1])
    if TIMES == len(divs):
        W_pages = browser.find_elements_by_css_selector('div[class="W_pages"]')[-1]
        nextPaga = W_pages.find_elements_by_tag_name('a')[-1]
        # nextPaga = W_pages.find_element_by_css_selector('a[suda-uatrack="key=tblog_profile_v6&value=weibo_page"]')
        ActionChains(browser).click(nextPaga).perform()

        time.sleep(5)

        FLESH_TIME = 0

        Pl_Official_MyProfileFeed__25 = browser.find_element_by_id('Pl_Official_MyProfileFeed__25')
        WB_feed_WB_feed_v3_WB_feed_v4 = Pl_Official_MyProfileFeed__25.find_element_by_css_selector(
            'div[module-type="feed"]')
        divs_Change = WB_feed_WB_feed_v3_WB_feed_v4.find_elements_by_css_selector('div[tbinfo="ouid=3937348351"]')
        divs.extend(divs_Change[FLESH_TIME:FLESH_TIME + 1])


browser.close()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章