知乎內容爬取

1.子話題網頁爬取

第一篇爬蟲博客,爬取“心理學”話題的所有層次的子話題網址、以及名稱
地址:https://blog.csdn.net/qq_35159009/article/details/90516414

2.話題頁面動態加載,模擬下滾

知乎界面採用動態加載技術,只有瀏覽器下滾,才能刷新出數據
第二篇爬蟲博客,利用Selenium與PhantomJS模擬瀏覽器下滾
地址:https://blog.csdn.net/qq_35159009/article/details/90522384

3.進入內容頁面爬蟲

頁面展示:
在這裏插入圖片描述

3.1 topic爬蟲

採用chrome複製xpath路徑的方式,得到topic的表達
在這裏插入圖片描述
結果://*[@id=“root”]/div/main/div/div[1]/div[2]/div[1]/div[1]/h1

topic=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/h1').text

3.2 內容爬蟲

第一個圖中可以看到,有“顯示全部”按鈕,同樣是動態加載,只有點擊了這個按鈕,才能爬取全部。

  • 獲取按鈕xpath(在按鈕上右鍵檢查,在前端元素上右鍵複製xpath路徑)
    //*[@id=“root”]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/button
  • 模擬click點擊操作
more=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/button').click()
  • 爬取內容
    xpath://*[@id=“root”]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span/text()
content=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span').text

注意這裏是末尾加.text,前面的xpath是/text(),除了這一點不同,其他沒有任何區別

3.3 標籤爬蟲

第一個標籤直接複製://[@id=“Popover5-toggle”]
這個結果不方便將所有標籤爬蟲
所以自己構造xpath路徑
在這裏插入圖片描述
先抓大’//
[@class=“Tag QuestionTopic”]’(循環)
後抓小’span/a/div/div’

labels=driver.find_elements_by_xpath('//*[@class="Tag QuestionTopic"]')
label_x=[]
for label in labels:
	try:
   		label_x.append(label.find_element_by_xpath('span/a/div/div').text)
   	except IndexError:
        pass

另一種方法:
在這裏插入圖片描述
直接一起搞
複製得到的xpath是: //*[@id=“root”]/div/main/div/meta[3]

f_label=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/meta[3]').get_attribute('content')

拿個屬性.get_attribute(‘content’)就得到了,是不是更快

總結一下
代碼爲:

#獲取子頁面內容
def get_question_info(url):
    driver = webdriver.PhantomJS()
    #driver.keep_alive = False
    driver.get(url)
    driver.implicitly_wait(1)
    try:
        topic=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/h1').text
        #print("題目是",topic)
        try:
            more=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/button').click()
            #content=driver.find_element_by_xpath('//*[@class="RichText ztext"]').text
            #//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span
            content=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div[1]/div[2]/div[1]/div[1]/div[2]/div/div/div/span').text
        except:
            try:
                content=driver.find_element_by_xpath('//*[@class="RichText ztext"]').text
            except:
                content='無'
        #print("內容是",content)
        f_label=driver.find_element_by_xpath('//*[@id="root"]/div/main/div/meta[3]').get_attribute('content')
        #print(f_label)
        
        labels=driver.find_elements_by_xpath('//*[@class="Tag QuestionTopic"]')
        label_x=[]
        for label in labels:
            try:
                label_x.append(label.find_element_by_xpath('span/a/div/div').text)
            except IndexError:
                pass
        #print(label_x)
     
        driver.close()
        cont.insert_one({'topic':topic,'content':content,'labels':f_label})  #mongodb數據插入
    except :
        pass
    driver.quit()

未完待續

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