今天用selenium爬取了我關注的某個博主的所有文章,並保存到本地文件。
思路:自動打開瀏覽器並搜索網址,找到文章的標題,評論數,閱讀量以及鏈接和下一頁的節點,爬取完一頁後就自動點擊下一頁繼續爬取,直到爬完,最後關閉瀏覽器。
過程中遇到的問題:
一,關於找節點:如果節點比較簡單的,可以直接copy xpath得到,然後利用find_element_by_xpath()得到相應的節點,進而得到信息(所需的信息可能是該節點的某個屬性(get_attribute('xxx'))或者文本內容(.text))。但是如果節點比較複雜,比如某個節點通過copy得到的xpath有這種構造:...div[14]/div[2]/div[4]這種子節點和父節點同名的,在爬取過程中是找不到的,只能自己去分析它的其他的方式。
二,關於“下一頁”這個節點的問題,每一頁刷新之後,都要重新獲取一次這個節點。如果把它放到循環的外面,則在點擊下一頁的時候,會出現不能跳轉的問題,這樣爬取的就一直是重複某一頁的內容了
三,關於延時等待:第一次爬取的時候,沒有做延時等待,爬取結束後發現文件夾裏沒有東西。然後檢查代碼,以爲是文件寫入錯誤,所以就先把爬取的內容先打印一下,發現結果爲空,說明節點沒有獲取到。調整思路,應該是節點爲出現,就跳找節點的過程了,所以我在每次刷新一個網頁就停留5秒(有隱式等待和顯式等待,但是用顯示等待是,獲取節點的方法變量一點,不怎麼能看懂,就沒用那種方法,直接time的sleep(5)方法)
四,關於寫入文件:得到的文章的標題,鏈接,評論數,閱讀量都是列表,然後利用pandas庫就可以寫入了,還有一個問題,就是編碼,之前用的是encoding='gb2312',但是出錯了(寫到一半在某條數據哪兒斷了,之後的內容沒有寫入),之後換成了'gbk',可以的。
放代碼:
from selenium import webdriver
import time
import pandas as pd
def get_text(url):
# 自動爬取博主的文章
browser = webdriver.Chrome()
browser.get(url)
# 下一頁的按鈕next_page
titles = [] # 標題
comments = [] # 評論
links = [] # 鏈接
reading_nums = [] # 閱讀量
time.sleep(10) # 首次加載可能會慢一點,所以延時等待時間久一點
for page in range(1, 15):
time.sleep(5) # 每一頁都等待5秒,等待“下一頁“的節點出來
next_page = browser.find_element_by_xpath('//a[@class="btn btn-xs btn-default btn-next"]') # 下一頁的這個節點在每一頁刷新後都重新獲取一次
try:
for j in range(1, 11):
try:
title = browser.find_element_by_xpath('//div[@id="divResources"]/div[1]/li[{}]/a'.format(str(j)))
comment = browser.find_element_by_xpath('//div[@id="divResources"]/div[1]/li[{}]/span[1]'.format(str(j)))
reading_num = browser.find_element_by_xpath('//div[@id="divResources"]/div[1]/li[{}]/span[2]'.format(str(j)))
titles.append(title.get_attribute('title')) # 標題
links.append(title.get_attribute('href')) # 鏈接
comments.append(comment.text) # 評論
reading_nums.append(reading_num.text) # 閱讀量
print('第{}頁第{}條爬取成功'.format(str(page),str(j)))
except Exception as er:
print('第{}頁第{}條爬取失敗:{}'.format(str(page),str(j),er))
print('第{}頁爬取完成'.format(str(page)))
if next_page:
next_page.click()
else:
print('第{}頁的下一頁節點沒有找到'.format(str(page)))
except Exception as e:
print(e)
browser.close() # 關閉瀏覽器
return titles, comments, links, reads
def text_to_excel(titles, comments, links, reads):
# 將爬取到的數據寫入Excel中
try:
dataframe = pd.DataFrame({'標題':titles, '鏈接':links, '閱讀量':reads, '評論數':comments})
dataframe.to_csv('articles.csv', index = False, encoding = 'gbk')
except Exception as e:
print(e)
if __name__ == '__main__':
url = 'https://my.csdn.net/ohmygirl'
print('開始爬取......')
titles, comments, links, reads = get_text(url)
print('爬取完成\n開始寫入文件......')
text_to_excel(titles, comments, links, reads)
print('-----寫入文件完成-----')
運行結果: