1. 程式人生 > >selenium點選連結進入子頁面抓取內容(新聞抓取案例一)

selenium點選連結進入子頁面抓取內容(新聞抓取案例一)

找了一個新聞網站練習爬蟲抓取,目標:逐一點選目錄標題,進入詳細新聞頁面,抓取子頁面的標題和正文內容並打印出來,返回目錄標題頁,點選下一篇文章。注:沒有新開視窗,是在原視窗實現跳轉。新開視窗進行抓取看下一篇文章。

試了很多種方法都抓取不到class=rightContent下面每個a標籤裡的href連結,開始思考是不是因為href連結都放在li列表裡面導致。

後面終於試到怎麼獲取這些在列表li裡的href連結了:首先第一步先抓取到所有a標籤,這裡用的是絕對路徑,比較方便,直接右鍵copy→xpath。這樣抓取出來的是一個列表links:

links=driver.find_elements_by_xpath("/html/body/div[5]/div[4]/ul/li/a") 

通過for link in links遍歷所有抓取出來的a標籤內容,然後再用get_attribute()函式來獲取每一個link的href屬性,得到的是a標籤對應的目標頁面的URL:

link.get_attribute('href')

這樣就能獲得每一個子頁面地址。但要注意,這裡抓取出來的是地址的字串,不能點選。相當於在word裡面輸入網址,但是沒按回車製造超連結,使網址變成了普通文字。這時候不能用click(),應該要用driver.get()來讓瀏覽器載入這個url,相當於把網址的字串複製到瀏覽器網址欄直接開啟網址:

driver.get(url) 

開啟子頁面成功抓取第一篇的標題和正文退回目錄頁後,發現停住不動了。這時候是因為頁面發生跳轉後,所有元素的資訊都變更了。因此,需要在每次回到目錄頁面後重新抓取a標籤,同時又必須接著上次點選後一個的元素繼續點選。使用遍歷的方法來實現這個for迴圈,完整程式碼如下:

from selenium import webdriver
import time

driver=webdriver.Chrome()
driver.get("http://www.spic.com.cn/2018news/zhxx/")
time.sleep(3)               #留出載入時間

links=driver.find_elements_by_xpath("/html/body/div[5]/div[4]/ul/li/a")  #獲取到所有a標籤,組成一個列表
length=len(links)           #列表的長度,一共有多少個a標籤

for i in range(0,length):   #遍歷列表的迴圈,使程式可以逐一點選
    links=driver.find_elements_by_xpath("/html/body/div[5]/div[4]/ul/li/a")    #在每次迴圈內都重新獲取a標籤,組成列表
    link=links[i]           #逐一將列表裡的a標籤賦給link
    url=link.get_attribute('href')  #提取a標籤內的連結,注意這裡提取出來的連結是字串
    driver.get(url)         #不能用click,因為click點選字串沒用,直接用瀏覽器開啟網址即可
    time.sleep(1)           #留出載入時間
    title=driver.find_element_by_xpath("//div[@class='articleTitle']").text   #.text的意思是指輸出這裡的純文字內容
    print(title)
    content=driver.find_element_by_xpath("//div[@class='TRS_Editor']").text
    print(content)
    print("\n")
    driver.back()           #後退,返回原始頁面目錄頁
    time.sleep(1)           #留出載入時間

print(length)               #列印列表長度,即有多少篇文章