python實戰之selenium自動爬蟲

今天用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('-----寫入文件完成-----')

運行結果:

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