前言:當爬蟲爬取多頁時,大部分網站都是有下一頁,或者標記有總頁數,這讓我們可以通過查找下一頁的標籤獲取下一頁的內容,又或者得到總頁數,直接for循環url遍歷所有頁的內容,這兩種都可以得到你想爬取多頁的信息。
那麼碰到動態加載的網頁,或者點擊出現,又或者滑動滾動條加載數據,這種網頁的話就需要用其他的方法找數據了
1 解析JSON(好用,難度較大)
2使用selenium 實現點擊及滑動滾動條加載數據!
3 。。。。
這次我們使用selenium爬取豆瓣高評分電影,通過點擊實現加載數據!
1,打開要爬取的網站
通過-->選電影-->豆瓣高分 得到想要的網頁
用代碼實現點擊效果
2,找到需要的標籤
找到加載更多,並用代碼實現。
3,開始爬取數據
1)導入所需要的包
2)創建瀏覽器對象
這裏選擇爬取網頁的鏈接,電影名稱,以及前五的熱門評論,所以我們創建兩個瀏覽器對象(瀏覽器自選)
因爲網頁數據多少未知,所以我們選擇爬取多少數據
3)爬取主頁數據(可以根據單機次數選擇爬取的多少頁數)
4)爬取分頁
5)爬蟲結束,問題 : 因爲這是個點擊加載的網頁所以我們不知有多少條數據!所以我們簡單規定一下所要爬取的數量
以下爲完整代碼
# 爬取豆瓣電影網高分電影及熱門影評
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
# from selenium import webdriver
url = 'https://movie.douban.com/'
# 獲取電影詳情地址以及電影的名稱
def get_detail_url_and_movie_name(movie_count):
# 定位 “選電影” ,
driver_info.get(url)
# class屬性查找
WebDriverWait(driver_info, 10).until(lambda driver_info:driver_info.find_elements_by_css_selector('.nav-items a')[1]).click()
# 定位 “豆瓣高分” 選項
WebDriverWait(driver_info, 10).until(lambda driver_info:driver_info.find_elements_by_css_selector('.tag-list label')[4]).click()
# 需要根據電影總數量,計算需要點擊幾次“加載更過”,下載電影信息
# open_more變量用於記錄點擊次數
open_more = int(movie_count)//20 - 1
print(open_more)
# 定位加載更多
for x in range(1, open_more+1):
WebDriverWait(driver_info, 10).until(lambda driver_info: driver_info.find_element_by_css_selector('.more')).click()
# 提取電影名稱
a_list = driver_info.find_elements_by_css_selector('.item')
for a in a_list:
print(u"電影地址:"+a.get_attribute('href'))
print(u"電影名稱:"+a.text)
# 根據電影詳情url下載熱門評論
get_detail_info(a.get_attribute('href'))
def get_detail_info(url):
driver_detail.get(url)
div = WebDriverWait(driver_detail, 10).until(lambda driver_detail:driver_detail.find_element_by_css_selector('#hot-comments'))
comments_list = div.find_elements_by_class_name('comment-item')
# 獲取前5條熱門評論
for comment in comments_list[:5]:
# 在comment這個對象的基礎上繼續定位p標籤
p = comment.find_element_by_tag_name('p').text
print(u'熱門評論:'+p)
if __name__ == "__main__":
options = webdriver.FirefoxOptions()
options.set_headless()
# 創建兩個瀏覽器對象,一個用於解析列表頁,一個用於解析詳情頁的熱門評論。
driver_info = webdriver.Chrome(chrome_options=options)
driver_detail = webdriver.Chrome(chrome_options=options)
# 輸入需要下載的數量
number = input('請輸入下載總數:')
get_detail_url_and_movie_name(number)
ok。關於點擊加載數據內容先學習着,關於通過selenium事件控制滾動條滑動來獲取數據還要繼續研究。