简介

有时候,我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现,我们要提取的网页元素并不在我们下载到的HTML之中,尽管它们在浏览器里看起来唾手可得。

这说明我们想要的元素是在我们的某些操作下通过js事件动态生成的。举个例子,我们在刷QQ空间或者微博评论的时候,一直往下刷,网页越来越长,内容越来越多,就是这个让人又爱又恨的动态加载。

爬取动态页面目前来说有两种方法

分析页面请求

selenium模拟浏览器行为

1.分析页面请求

键盘F12打开开发者工具,选择Network选项卡,选择JS(除JS选项卡还有可能在XHR选项卡中,当然也可以通过其它抓包工具),如下图

然后,我们来拖动右侧的滚动条,这时就会发现,开发者工具里出现了新的js请求(还挺多的),不过草草翻译一下,很容易就能看出来哪个是取评论的,如下图

好,复制出js请求的目标url

在浏览器中打开,发现我们想要的数据就在这里,如下图

这整个页面是一个json格式的数据,对于京东来说,当用户下拉页面时,触发一个js事件,向服务器发送上面的请求取数据,然后通过一定的js逻辑把取到的这些json数据填充到HTML页面当中。对于我们Spider来说,我们要做的就是把这些json数据整理提取。

在实际应用中,当然我们不可能去每个页面里找出来这个js发起的请求目标地址,所以我们需要分析这个请求地址的规律,一般情况下规律是比较好找的,因为规律太复杂服务方维护也难。

2.selenium模拟浏览器行为

对于动态加载,能看到Selenium+Phantomjs的强大。打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面。也就是说,从网页源码无法通过解析得到数据。Selenium+Phantomjs的强大一方面就在于能将完整的源码抓取到

例子:在豆瓣电影上根据给出的名字搜索对应的信息

#-*- coding:utf-8 -*-

importsysfrom selenium importwebdriverfrom selenium.webdriver.common.keys importKeysfrom bs4 importBeautifulSoup

reload(sys)

sys.setdefaultencoding('utf-8')

url= 'https://movie.douban.com/'

#这个路径就是你添加到PATH的路径

driver = webdriver.PhantomJS(executable_path='C:/Python27/Scripts/phantomjs-2.1.1-windows/bin/phantomjs.exe')

driver.get(url)#在搜索框上模拟输入信息并点击

elem = driver.find_element_by_name("search_text")

elem.send_keys("crazy")

elem.send_keys(Keys.RETURN)#得到动态加载的网页

data =driver.page_source

soup= BeautifulSoup(data, "lxml")#进行匹配

for i in soup.select("div[class='item-root']"):

name= i.find("a", class_="title-text").text

pic= i.find("img").get('src')

url= i.find("a").get('href')

rate= ""num= ""

if i.find("span", class_="rating_nums") isNone:print name.encode("gbk", "ignore"), pic, urlelse:

rate= i.find("span", class_="rating_nums").text

num= i.find("span", class_="pl").textprint name.encode("gbk", "ignore"),pic,url,rate.encode("gbk", "ignore"),num.encode("gbk", "ignore")

python动态页面元素爬取_python动态爬取网页相关推荐

  1. 静态页面和动态页面中的静态和动态到底指的是什么

    今天讨论一个话题,这是在考研的专业课考试中的一个问题:静态页面和动态页面的联系和区别 ,这考的我就很猝不及防 ,这个方面虽然以前有了解 ,但是理解得并不深刻,网安方向涉及到的东西太多了,慢慢学习吧~首 ...

  2. python爬虫什么网站都能爬吗_python如何爬取动态网站

    python有许多库可以让我们很方便地编写网络爬虫,爬取某些页面,获得有价值的信息!但许多时候,爬虫取到的页面仅仅是一个静态的页面,即网页 的源代码,就像在浏览器上的"查看网页源代码&quo ...

  3. beautifulsoup解析动态页面div未展开_Python爬虫 | 0xb 数据解析:PyQuery库

    (给抠腚男孩加星标,提升Python.Android技能) 作者:CoderPig 本节带来数据解析部分最后一个解析库PyQuery,它的API和前端著名框架jQuery相似,名字由此而来.如果你有前 ...

  4. python跑一亿次循环_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  5. python做手机应用宝下载_Python代码爬取下载应用宝所有APP软件

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本环境配置 python 3.6 pycharm requests parsel 打开开发 ...

  6. php动态页面加载慢,通过动态加载JS文件提升网站访问速度

    相对与HTML,CSS,javascript是最影响浏览器性能的,因为浏览器在遇到<script>标签时,必须等待js代码下载和执行完毕后再执行后面的内容,因此当页面中js文件过多时,网站 ...

  7. python网络爬图_Python爬虫爬图片需要什么

    Python爬虫爬图片需要什么?下面用两种方法制作批量爬取网络图片的方法: 第一种方法:基于urllib实现 要点如下: 1.url_request = request.Request(url) 2. ...

  8. html5什么是动态页面,举例说明什么是动态网站、静态网站

    记得有一次和一朋友散步,他问到什么是动态网页.什么是静态网页.动态网页与静态网页有什么区别.当时我的回答似乎并没有让他真的明白到底什么是动态.什么是静态,所以今天想在这篇文章中详细的举例说明什么是动态 ...

  9. python程序语法元素的描述_Python入门——Python程序语法元素

    Python程序语法元素 缩进:表达程序的格式框架 严格明确, 缩进是语法的一部分,缩进不正确程序运行错误 所属关系, 缩进是表达代码间包含和层次关系的唯一手段 长度一致, 程序内缩进长度统一 注释: ...

最新文章

  1. Tools and Strategies for Long-Read Sequencing and De Novo Assembly of Plant Genomes
  2. 微信样式组件遇到的小坑
  3. 凭兴趣求职80%会失败,为什么
  4. 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素...
  5. cad pu插件下载lisp_【技巧】cad计算面积、周长方法汇总
  6. CSS3 :nth-child(n)使用注意
  7. 截取字符串,但要保证汉字不被截取半个
  8. 匿名内部类与Lambda表达式
  9. Excel的一点小事
  10. 使用HTML5 canvas做地图(1)基础知识
  11. 深度学习-吴恩达-笔记-2-神经网络的编程基础
  12. python isfile_基于Python中isfile函数和isdir函数使用详解
  13. 2006-8-11 11:29:00 搜索算法及其在ACM竞赛中的应用(作者/刘力科 计算机系01级4班)...
  14. Unity插件-HighlightingSystem(边缘光)
  15. Android Binder传递文件描述符原理分析
  16. python正则匹配内网IP
  17. 上周内外盘行情回顾及交易情况2022.4.4
  18. time.h头文件解析
  19. 帝国cms支付系统的漏单风险
  20. Acorn Mac 7.1.1

热门文章

  1. JDBC(实现增删改查的通用操作)
  2. 字符串的连接最长路径查找
  3. 自下而上分析法基本问题
  4. SQL Server维护计划–好处,功能和特性
  5. SQL Server高级数据库管理员面试问答
  6. 磁盘IO性能监控(Linux 和 Windows)
  7. less知识点总结(二)
  8. 关于Android sdkmanager目录结构的总结
  9. 基于Gsoap 的ONVIF C++ 库
  10. 快速排序的递归方式和非递归方式