python抓取动态网页( 如何利用Python爬取模块获取查看器的html内容(图))

优采云 发布时间: 2021-12-04 18:19

  python抓取动态网页(

如何利用Python爬取模块获取查看器的html内容(图))

  

  1. 文章 目的

  我们在使用Python抓取网页数据时,经常会用到urllib模块,通过调用urllib模块的urlopen(url)方法返回网页。

  页面对象,使用read()方法获取url的html内容,然后使用BeautifulSoup抓取某个标签的内容,结合正则表

  亲爱的过滤器。然而,你用 urllib.urlopen(url).read() 得到的只是网页的静态 html 内容,还有很多动态数据(比如 网站

  访问量、当前在线人数、微博点赞数等)不收录在静态html中,比如我要抢这个bbs网

  当前点击打开网站各版块链接的在线人数不收录在静态html网页中(如果不信,请尝试查看页面的源代码,

  只有一条简单的线)。这些动态数据大部分是由JavaScript、JQuery、PHP等语言动态生成的,因此,

  不宜使用爬取静态html内容的方法。

  2. 解决方案

  我试过网上提到的浏览器自带的开发者工具(一般是F12弹出对应网页的开发者工具),上网查了一下

  动态数据的趋势是可以得到的,但是这需要从众多的URL中寻找线索,我个人觉得太麻烦了。另外,使用查看器

  查看的html内容也收录动态数据,但是有几个问题:如何实时获取查看器的html内容?如何查看

  html变成python程序?因此,使用查看器的html内容的方法也不符合爬虫的要求。

  并且无意中找到了selenium模块,发现这个模块可以很方便的根据url加载页面获取session,并找到当前se

  ssion 对应的标签。本文将使用 selenium webdriver 模块来获取这些动态生成的内容,尤其是一个

  一些重要的动态数据。其实selenium模块的功能不限于抓取网页,它是网络自动化测试的常用模块

  ,在Ruby和Java中被广泛使用。Python虽然使用的比较少,但它也是一个非常简洁、高效、易用的工具。

  手的自动化测试模块。通过使用selenium的子模块webdriver解决动态数据的捕获问题,还可以

  可以对selenium有一个基本的了解,为进一步学习自动化测试打下基础。

  3. 实施过程

  3.1 运行环境

  我在windows 7系统上安装了Python2.7版本,使用的是Python(X,Y)的IDE,安装的Python库没有self

  用selenium,如果直接在Python程序中导入selenium,会提示没有这个模块。联网状态下,cmd直接进入pip i

  安装selenium,系统会找到Python安装目录直接下载、解压安装这个模块。等到终端提示完成

  看看C:\Python27\Lib\site-packages目录下有没有selenium模块,这个目录取决于你安装的Python

  的路径。如果有两个文件夹,selenium和selenium-2.47.3.dist-info,可以在Python程序中添加模块

  已加载。

  使用 webdriver 捕获动态数据

  先导入webdriver子模块

  从硒导入网络驱动程序

  获取浏览器会话,可以使用火狐、Chrome、IE等浏览器,这里以火狐为例

  浏览器 = webdriver.Firefox()

  加载页面,只需在url中指定一个有效的字符串

  browser.get(url)

  获取到session对象后,为了定位元素,webdriver提供了一系列的元素定位方法。常用的方法有以下几种:

  ID

  姓名

  班级名称

  关联

  文本

  部分的

  关联

  文本

  标签

  姓名

  路径

  css选择器

  比如通过id定位,返回一个所有元素组成的列表,lis=borwser.find_elements_by_id_name('kw'')

  按类名定位,lis=find_elements_by_class_name('title_1')

  更详细的定位方法请参考selenium webdriver(python)教程第三章-定位方法(第一版可百度

  学位图书馆阅读)

  结合正则表达式过滤相关信息

  定位后的一些元素是不可取的,使用常规过滤即可。比如我想只提取英文字符(包括0-9),创建如下

  常规的

  pa=堆(r'\w+')

  对于 lis 中的你:

  en=pa.findall(u.lis)

  印刷英文

  关闭会话

  执行fetch操作后必须关闭session,否则让它一直占用内存会影响机器上其他进程的操作

  Browser.close() 或 browser.quit() 可以关闭会话,前者只是关闭当前会话,浏览器的webdrive

  r 没有关闭,后者是关闭包括webdriver在内的所有东西

  添加异常处理

  这是必须的,因为有时候会获取session失败,所以把上面的语句块放到try里面,然后用exception处理

  除了 NoSuchElementException:

  断言 0,“找不到元素”

  4. 代码实现

  我通过点击打开链接抓取了指定分区中每个分区的在线用户数,并指定分区id号(0-9),可以得到分区名和对

  在线用户数应该打印在一个列表中,代码如下

  [python] 查看平原

  # -*- 编码:utf-8 -*-

  从硒导入网络驱动程序

  从 mon.exceptions 导入 NoSuchElementException

  导入时间

  *敏*感*词*重新

  def find_sec(secid):

  pa=堆(r'\w+')

  browser = webdriver.Firefox() # 获取firefox的本地会话

  browser.get("!section/%s "%secid) # 加载页面

  time.sleep(1) # 让页面加载

  结果=[]

  尝试:

  #获取页面名称和在线号码组成列表

  board=browser.find_elements_by_class_name('title_1')

  ol_num=browser.find_elements_by_class_name('title_4')

  max_bindex=len(板)

  max_oindex=len(ol_num)

  assert max_bindex==max_oindex,'索引不等价!'

  #页面名称为中英文,所以常规过滤后只剩下英文

  对于范围内的 i (1,max_oindex):

  board_en=pa.findall(board.text)

  result.append([str(board_en[-1]),int(ol_num.text)])

  浏览器关闭()

  返回结果

  除了 NoSuchElementException:

  断言 0,“找不到元素”

  print find_sec('5')#打印第5分区下所有版块的当前在线用户列表

  运行结果如下:

  终端打印效果

  4. 总结

  Selenium 在代码简洁性和执行效率方面非常出色。使用 selenium webdriver 捕获动态数据不是

  它通常简单而有效。也可以进一步利用这个来实现数据挖掘、机器学习等深度研究,所以selenium+pyth

  就值得深入研究!如果觉得每次都用selenium打开浏览器不方便,可以用phantomjs模拟一个虚拟的

  浏览器出来了,这里就不赘述了。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线