項目簡述
下面的url是朋友叫我爬取的對象共青團的微博。
會爬取共青團的所有熱門微博的全部的微博下的前20個一級評論
打包到一個文件夾中,每個文件都是放一個微博的前20條評論
(本來目標是拿200個微博的,但是後來就變成只有86個了…)
使用要求
就是需要在打開網頁的30秒內,完成微博的登錄。
因爲,在後面,需要爬取很多的個微博,所以,只有登錄後纔會拿到。
缺點分析
- 通過模擬人的行爲,來進行爬取,這大概是目前爬蟲最慢,但是卻最厲害的方法了。(人眼所見,就是可以拿到的數據)
比較慢,這除了導致在使用的時候很慢,而且debug的時候也會特別的慢。 - 爬取的時候,只是拿到了比較熱的前87個。要是熱門的微博數量小於200的時候,我沒有做容錯。還有就是,如果想要去拿到所有微博的信息,那就要在開始的時候,先做頁面的切換先(這個,可以手動操作,也可以,設置在代碼中)
- 登錄那裏還是需要手寫,因爲,我懶得設置定位了…(大家有需求可以自己加)
使用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()