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

  然后会发现浏览器自动进行向下滚动的操作来帮我们加载数据。

  可以打印出结果:

selenium异步爬取(selenium+Chromedriver)的更多相关文章

  1. selenium登录爬取知乎出现:请求异常请升级客户端后重试的问题(用Python中的selenium接管chrome)

    一.问题使用selenium自动化测试爬取知乎的时候出现了:错误代码10001:请求异常请升级客户端后重新尝试,这个错误的产生是由于知乎可以检测selenium自动化测试的脚本,因此可以阻止selen ...

  2. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  3. Python3.x:Selenium+PhantomJS爬取带Ajax、Js的网页

    Python3.x:Selenium+PhantomJS爬取带Ajax.Js的网页 前言 现在很多网站的都大量使用JavaScript,或者使用了Ajax技术.这样在网页加载完成后,url虽然不改变但 ...

  4. selenium+phantomjs爬取京东商品信息

    selenium+phantomjs爬取京东商品信息 今天自己实战写了个爬取京东商品信息,和上一篇的思路一样,附上链接:https://www.cnblogs.com/cany/p/10897618. ...

  5. selenium+phantomjs爬取bilibili

    selenium+phantomjs爬取bilibili 首先我们要下载phantomjs 你可以到 http://phantomjs.org/download.html 这里去下载 下载完之后解压到 ...

  6. 使用selenium 多线程爬取爱奇艺电影信息

    使用selenium 多线程爬取爱奇艺电影信息 转载请注明出处. 爬取目标:每个电影的评分.名称.时长.主演.和类型 爬取思路: 源文件:(有注释) from selenium import webd ...

  7. scrapy中使用selenium来爬取页面

    scrapy中使用selenium来爬取页面 from selenium import webdriver from scrapy.http.response.html import HtmlResp ...

  8. Python使用asyncio+aiohttp异步爬取猫眼电影专业版

    asyncio是从pytohn3.4开始添加到标准库中的一个强大的异步并发库,可以很好地解决python中高并发的问题,入门学习可以参考官方文档 并发访问能极大的提高爬虫的性能,但是requests访 ...

  9. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

随机推荐

  1. 书列荐书 |《黑天鹅·如何应对不可预知的未来》【美】纳西姆 尼古拉斯 塔勒布 著

    你不知道的事比你知道的事更有意义,因为生活中发生了许多微小的事情,尽管出现的概率非常小,但是却以某一种巨大的力量影响我们的生活.但是由于思维习惯的问题,导致我们看问题的方式使得我们不能很快地把握事物的 ...

  2. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  3. AI+IoT+电池应用

    AI+IoT+电池应用 AIoT电池 突破你的想象 将行业领先的电池电化学技术与前沿的能源物联网最佳实践相结合,利用智能物联技术开展电池全生命周期的管理优化和交叉领域的协同应用,解锁动力电池全生命周期 ...

  4. NVIDIA安培架构

    NVIDIA安培架构 NVIDIA Ampere Architecture In-Depth 在2020年英伟达GTC主题演讲中,英伟达创始人兼首席执行官黄仁勋介绍了基于新英伟达安培GPU架构的新英伟 ...

  5. 记录第一次完整的uni-app开发经验

    由于我是做后端的,一直没有做过前端的页面,以前在学校图书馆看的都是jsp技术,几乎是把java代码嵌套在前端界面.后面出来实习了才发现,jsp是真的落后了.现在的大学和实际工作所需偏差太大了,没办法. ...

  6. 七、SSL加密网站(待解决)

    keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore  //创建私钥和证书文件提示输入密 ...

  7. 工具篇:介绍几个好用的guava工具类

    前言 平时我们都会封装一些处理缓存或其他的小工具.但每个人都封装一次,重复造轮子,有点费时间.有没有一些好的工具库推荐-guava.guava是谷歌基于java封装好的开源库,它的性能.实用性,比我们 ...

  8. 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    反射的概念 反射: Refelection,反射是Java的特征之一,允许运行中的Java程序获取自身信息,并可以操作类或者对象的内部属性 通过反射,可以在运行时获得程序或者程序中的每一个类型的成员活 ...

  9. Redundant Paths 分离的路径

    Redundant Paths 分离的路径 题目描述 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她 ...

  10. C程序从编译到运行

    第一篇文章 一.前言 最近在看CSAPP(深入理解计算机系统)然后以前也学过C语言,但是从来没有深究写好的C代码是怎么编译再到执行的. 所以现在自己学习,然后记录下来. 以最常用的hello worl ...