在我们进行数据爬去的过程中,我们有时候会遇到异步加载信息的情况,以豆瓣电影分来排行榜为例,当我们在查看数据的过程中,会发现网页源码中并不包含我们想要的全部数据,但是当我们在进行向下滚动的时候,数据会一点点的加载出来,这就说明它是通过异步加载模式展示出的数据。在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浏览器,出现收到测试软件控制的内容,如下图所示:
然后会发现浏览器自动进行向下滚动的操作来帮我们加载数据。
可以打印出结果: