selenium異步爬取(selenium+Chromedriver)


  在我們進行數據爬去的過程中,我們有時候會遇到異步加載信息的情況,以豆瓣電影分來排行榜為例,當我們在查看數據的過程中,會發現網頁源碼中並不包含我們想要的全部數據,但是當我們在進行向下滾動的時候,數據會一點點的加載出來,這就說明它是通過異步加載模式展示出的數據。在urllib3中,支持的也僅僅是當前的HTML頁面,所以,我們要使用異步加載模式進行數據的獲取。

  在這個時候,我們一般會采用以下兩種方法來進行數據的加載:一種是模擬瀏覽器進行頁面訪問(selenium),另外一種是進行更深層次的HTTP請求訪問分析,同時再利用分析加載出的路徑進行異步數據加載。


 selenium下載

  selenium是一個利用模擬瀏覽器進行調用的的模塊,他可以直接通過一些特定支持的主流瀏覽器進行本地瀏覽器的數據驅動執行,而后會模擬瀏覽器進行數據加載,通過網頁分析后獲取到我們需要的所有數據。

  Windows下下載selenium,使用  pip install selenium 即可


 Chromedriver下載

  Chromedriver是基於Google的一個獨立服務器,它實現了W3C標准的webdriver。

  要想進行在Google瀏覽器上模擬數據的加載,那就必須下載這個工具。下載Chromedriver之前,我們需要知道我們的Google瀏覽器的版本是什么,注意,一定要與自己的版本相匹配,否則會出錯,例如,使用 79.0.3945.29的Google瀏覽器,就要下載版本為79開頭的Chromedriver驅動。

  下載Chromedriver國內地址:http://npm.taobao.org/mirrors/chromedriver/  找到對應版本的Chromedriver,下載后解壓。

  如果沒有查詢到自己的版本,那就需要進入Chromedriver官網進行下載, 對於不能進行Google訪問的,可以下載谷歌訪問助手,按照教程安裝即可。


selenium異步爬取

  (1)創建項目,命名為selenium_demo,將下載到的Chromedriver拷貝到工作區中(或者放置在我們能夠明確知道路徑的位置中)。

  (2)創建python文件,命名為t1.py,將以下代碼復制其中。

 1 '''
 2 @Description: selenium異步爬取
 3 @Version: 1.0
 4 @Autor: Montoin Yan
 5 @Date: 2020-02-06 20:43:01
 6 @LastEditors  : Montoin Yan
 7 @LastEditTime : 2020-02-08 21:55:48
 8 '''
 9 
10 import selenium,selenium.webdriver
11 import time #追加延遲處理,防止在爬取過程中被封
12 import re
13 
14 URL = 'https://movie.douban.com/typerank?type_name=劇情&type=11&interval_id=100:90&action=' #設置網頁的根路徑
15 
16 CHROME_DRIVER = "chromedriver.exe" #這里填寫你Chromedriver的所在路徑
17 
18 HEADERS = {
19     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36'
20 }
21 
22 class Movie: #定義一個保存電影信息的類
23     def __init__(self,type): #初始化
24         self.img = None #電影圖片
25         self.name = None #電影名稱
26         self.type = None #電影類型,是通過上一級解析出來的
27         self.rank = None #電影評分
28         self.crew = None #演員列表
29         self.rating = None #電影平均分
30         self.comment = None #評論人數
31     def __repr__(self)->str: 
32         return "【電影信息】分類:%s、名次:%d、名稱:%s、評分:%f、評論人數:%d、圖片:%s、列表類型:%s" % \
33             (self.type,self.rank,self.name,self.rating,self.comment,self.img,self.crew)
34 
35 def main(): #主函數
36     driver = selenium.webdriver.Chrome(executable_path=CHROME_DRIVER) #加載瀏覽器驅動
37     driver.get(url=URL) #訪問加載路徑
38     for item in range(2): #設置加載次數
39         target = driver.find_element_by_id("footer") #通過分析可以知道,這個元素是用來定義頁面尾部的
40         driver.execute_script("arguments[0].scrollIntoView();",target) #通過js定義滾動操作
41         time.sleep(2) #每間隔兩秒進行一次滾動處理
42     time.sleep(2) #因為異步加載需要時間,所以在爬取之后需要停頓兩秒
43     count = 0 #抓取計數,進行統計
44     try:
45         for content in driver.find_elements_by_xpath("//div[@class='movie-content']"): #通過xpath定位所有的div塊且屬性為movi-content
46             time.sleep(0.2) 
47             movie = Movie("情劇") #實例化電影信息
48             movie.img = content.find_element_by_class_name("movie-img").get_property("src") #通過上面爬取下來的地址img上的解析,獲取到圖片的src地址
49             if movie.img:
50                 movie.name = content.find_element_by_class_name("movie-name-text").text #名稱
51                 movie.rank = int(content.find_element_by_class_name("rank-num").text) #名次
52                 movie.crew = content.find_element_by_class_name("movie-crew").text.split("/") #列表名稱
53                 movie.rating = float(content.find_element_by_class_name("rating_num").text) #平均分
54                 movie.comment = int(re.sub("\D","",content.find_element_by_class_name("comment-num").text)) #評論人數
55             print(movie)
56             print(movie.type)
57             count += 1
58             if count >= 50:
59                 raise Exception("123")
60 
61     except Exception as exp: #拋出異常信息
62         print(exp)
63         pass
64 
65 if __name__ == "__main__":
66     main()

  調試運行,會發現自動彈出Google瀏覽器,出現收到測試軟件控制的內容,如下圖所示:

   然后會發現瀏覽器自動進行向下滾動的操作來幫我們加載數據。

  可以打印出結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM