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()
未完待續