爬取微博特定一用户的微博评论(一)

项目简述

下面的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()

你可能感兴趣的:(Python,爬虫)