您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源功能測(cè)試工具 > Selenium
使用Selenium簡(jiǎn)單收集知乎的話題數(shù)據(jù)
作者:鄧旭東 發(fā)布時(shí)間:[ 2017/3/21 11:00:18 ] 推薦標(biāo)簽:功能測(cè)試 Selenium Python

  當(dāng)你在知乎上搜索一個(gè)話題,如王寶強(qiáng)的時(shí)候,搜索結(jié)果頁(yè)面的底部有個(gè)“更多”按鈕,如下圖

  遇到這個(gè)坑爹了,因?yàn)槟惆l(fā)現(xiàn)點(diǎn)擊“更多”按鈕后,網(wǎng)址部分沒(méi)有變化,但頁(yè)面卻加載了新的數(shù)據(jù)。怎么辦????
  沒(méi)法按照之前的 有規(guī)律的網(wǎng)址&page=number ,通過(guò)for循環(huán)依次遍歷網(wǎng)頁(yè)。
  在這里我不講抓包,分析請(qǐng)求包。咱們用生硬的方法,破解這問(wèn)題。在這里我使用了selenium庫(kù),并且要安裝一個(gè)火狐瀏覽器(firefox36)。輕松破解該問(wèn)題。
  selenium教程,建議大家網(wǎng)上買(mǎi)《selenium 2自動(dòng)化測(cè)試實(shí)戰(zhàn)-基于python語(yǔ)言》 這本書(shū)閱讀相關(guān)知識(shí)。當(dāng)然也可以根據(jù)本代碼,在網(wǎng)上查相關(guān)selenium的知識(shí)。
import re
import csv
import time
import urllib.parse as parse
from selenium import webdriver
from bs4 import BeautifulSoup
# keyword話題名 ,filename保存數(shù)據(jù)的文件名,page_num收集多少頁(yè)
def topic_title_spider(keyword='王寶強(qiáng)', filename = 'wangbaoqiang', page_num = 10):
start = time.time()
# 建立一個(gè)收集數(shù)據(jù)的csv文件
csvFile = open(r'E:\%s.csv'% filename, 'a+', newline='')
writer = csv.writer(csvFile)
writer.writerow(('title', 'review_num'))
# 將關(guān)鍵詞轉(zhuǎn)換為十六進(jìn)制格式,填入到鏈接中
kw = parse.quote(keyword)
driver = webdriver.Firefox()
driver.get('https://www.zhihu.com/search?type=content&q=%s' % kw)
# 正則表達(dá)式,用來(lái)匹配標(biāo)題,評(píng)論數(shù)
reg_title = re.compile(r'<a class="js-title-link" href=.*?" target="_blank">(.*?)</a>')
reg_li = re.compile(r'item clearfix.*?')
reg_num = re.compile(r'<a class="zm-item-vote-count hidden-expanded js-expand js-vote-count" data-bind-votecount="">(.*?)</a>')
# 先循環(huán)點(diǎn)擊頁(yè)面底部“更多”,加載盡可能多的頁(yè)面數(shù)據(jù)
for i in range(1, page_num, 1):
driver.find_element_by_link_text("更多").click()
duration = time.time()-start
print('%s小爬蟲(chóng) 已經(jīng)跑到 第%d頁(yè) 了,運(yùn)行時(shí)間%.2f秒,好累啊'%(keyword, i, duration))
time.sleep(5)
soup = BeautifulSoup(driver.page_source, 'lxml')
li_s = soup.find_all('li', {'class': reg_li})
for li in li_s:
li = str(li)
try:
title = re.findall(reg_title, li)[0]
title = title.replace('<em>', '')
title = title.replace('</em>', '')
review_num = re.findall(reg_num, li)[0]
except:
continue
writer.writerow((title, review_num))
print(title, review_num)
csvFile.close()
driver.quit()
  代碼在我這里運(yùn)行成功,不過(guò)在你那里需要注意拷貝代碼后,要調(diào)整代碼,因?yàn)橛械拇a一行太長(zhǎng)了,被知乎調(diào)整到第二行了,這樣可能會(huì)出錯(cuò)。
  該方法缺點(diǎn)是運(yùn)行速度慢,不過(guò)對(duì)于小數(shù)據(jù)需求的小白們來(lái)說(shuō),還是可以接受的。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd