使用selenium簡單收集知乎的話題數據

當你在知乎上搜索「王寶強」時候,搜索結果頁面的底部有個「更多」按鈕,如下圖

遇到這個坑爹了,因為你發現點擊「更多」按鈕後,網址部分沒有變化,但頁面卻載入了新的數據。怎麼辦????

沒法按照之前的 有規律的網址&page=number ,通過for循環依次遍歷網頁。

在這裡我不講抓包,分析請求包。咱們就用生硬的方法,破解這問題。在這裡我使用了selenium庫,並且要安裝一個火狐瀏覽器(firefox36)。輕鬆破解該問題。

selenium教程,建議大家網上買《selenium 2自動化測試實戰-基於python語言》 這本書閱讀相關知識。當然也可以根據本代碼,在網上查相關selenium的知識。

import reimport csvimport timeimport urllib.parse as parsefrom selenium import webdriverfrom bs4 import BeautifulSoup# keyword話題名 ,filename保存數據的文件名,page_num收集多少頁def topic_title_spider(keyword="王寶強", filename = "wangbaoqiang", page_num = 10):start = time.time()# 建立一個收集數據的csv文件csvFile = open(r"E:\%s.csv"% filename, "a+", newline="")writer = csv.writer(csvFile)writer.writerow(("title", "review_num"))# 將關鍵詞轉換為十六進位格式,填入到鏈接中kw = parse.quote(keyword)driver = webdriver.Firefox()driver.get("https://www.zhihu.com/search?type=content&q=%s" % kw)# 正則表達式,用來匹配標題,評論數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>")# 先循環點擊頁面底部「更多」,載入儘可能多的頁面數據for i in range(1, page_num, 1):driver.find_element_by_link_text("更多").click()duration = time.time()-startprint("%s小爬蟲 已經跑到 第%d頁 了,運行時間%.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:continuewriter.writerow((title, review_num))print(title, review_num)csvFile.close()driver.quit()

代碼在我這裡運行成功,不過在你那裡需要注意拷貝代碼後,要調整代碼,因為有的代碼一行太長了,被知乎調整到第二行了,這樣可能會出錯。

該方法缺點是運行速度慢,不過對於小數據需求的小白們來說,還是可以接受的。

----------------------------------

作者:鄧旭東

博客專欄:鄧旭東HIT的博客專欄

歡迎關注 簡書賬號 鄧旭東HIT

知乎: 鄧旭東HIT

微信公眾號: 大鄧帶你玩轉python

大家也可以加小編微信:tszhihu (備註:Python),拉大家到 Python愛好者社區 微信群,可以跟鄧旭東、崔慶才等老師互相交流。謝謝

推薦閱讀:

說話重複啰嗦是怎麼樣的體驗?
知乎「中世紀」話題下 答案的水平怎麼樣?
為什麼知乎上關於佟大為話題的頭像和回答都很奇怪?
如何評價知乎部分話題頁 2016 年 5 月上線的「索引」功能?
自認為人生重要路口,求導師指點迷津,懼怕一念成魔。?

TAG:Selenium | 知乎话题 | Python |