由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScript代码,最后呈现出来的数据是通过JavaScript提取服务器返回的数据加载到源代码中进行呈现。因此爬取静态网页的技术可能无法正常使用。因此,我们需要用到动态网页抓取的两种技术:

1.通过浏览器审查元素解析真实网页地址;

2.使用selenium模拟浏览器的方法。

我们这里先介绍第一种方法。

以爬取《Python 网络爬虫:从入门到实践》一书作者的个人博客评论为例。网址:http://www.santostang.com/2017/03/02/hello-world/

1)“抓包”:找到真实的数据地址


右键点击“检查”,点击“network”,选择“js”。刷新一下页面,选中页面刷新时返回的数据list?callback....这个js文件。右边再选中Header。如图:

其中,Request URL即是真实的数据地址。

在此状态下滚动鼠标滚轮可发现User-Agent。

2)相关代码:


import requests
import json
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
link="https://api-zero.livere.com/v1/comments/list?callback=jQuery112405600294326674093_1523687034324&limit=10&offset=2&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1523687034329"
r=requests.get(link,headers=headers)
# 获取 json 的 string
json_string = r.text
json_string = json_string[json_string.find('{'):-2]
json_data=json.loads(json_string)
comment_list=json_data['results']['parents']
for eachone in comment_list:message=eachone['content']print(message)

输出为:

现在死在了4.2节上,页面评论是有的,但是XHR里没有东西啊,这是什么情况?有解决的大神吗?
为何静态网页抓取不了?
奇怪了,我按照书上的方法来操作,XHR也是空的啊
XHR没有显示任何东西啊。奇怪。
找到原因了
caps["marionette"] = True
作者可以解释一下这句话是干什么的吗
我用的是 pycham IDE,按照作者的写法写的,怎么不行
对火狐版本有要求吗
4.3.1 打开Hello World,代码用的作者的,火狐地址我也设置了,为啥运行没反应
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinarycaps = webdriver.DesiredCapabilities().FIREFOX
caps["marionette"] = False
binary = FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')
#把上述地址改成你电脑中Firefox程序的地址
driver = webdriver.Firefox(firefox_binary=binary, capabilities=caps)
driver.get("http://www.santostang.com/2017/03/02/hello-world/")
我是番茄
为什么刷新没有XHR数据,评论明明加载出来了

代码解析:

1)对于代码  json_string.find()  api解析为:

Docstring:
S.find(sub[, start[, end]]) -> intReturn the lowest index in S where substring sub is found,
such that sub is contained within S[start:end].  Optional
arguments start and end are interpreted as in slice notation.Return -1 on failure.
Type:      method_descriptor

所以代码  json_string.find('{') 即返回”{“在json_string字符串中的索引位置。

2)若在代码中增加一句代码 print json_string,则该句输出结果为(由于输出内容过多,只截取了开头和结尾,关键位置均作了红色标记):

/**/ typeof jQuery112405600294326674093_1523687034324 === 'function' && jQuery112405600294326674093_1523687034324({"results":{"parents":[{"replySeq":33365104,"name":"骨犬","memberId":"B9E06FBF9013D49CADBB5B623E8226C8","memberIcon":"http://q.qlogo.cn/qqapp/101256433/B9E06FBF9013D49CADBB5B623E8226C8/100","memberUrl":"https://qq.com/","memberDomain":"qq","good":0,"bad":0,"police":0,"parentSeq":33365104,"directSeq":0,"shortUrl":null,"title":"Hello world! - 数据科学@唐松
Santos","site":"http://www.santostang.com/2017/03/02/hello-world/","email":null,"ipAddress":"27.210.192.241","isMobile":"0","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.8.3.16721","septSns":null,"targetService":null,"targetUserName":null,"info1":null,"info2":null,"info3":null,"image1":null,"image2":null,"image3":null,"link1":null,"link2":null,"link3":null,"isSecret":0,"isModified":0,"confirm":0,"subCount":1,"regdate":"2018-01-01T06:27:50.000Z","deletedDate":null,"file1":null,"file2":null,"file3":null,"additionalSeq":0,"content":"现在死在了4.2节上,页面评论是有的,但是XHR里没有东西啊,这是什么情况?有解决的大神吗?"
 。。。。。。。。。 tent":"我的也是提示火狐版本不匹配,你解决了吗","quotationSeq":null,"quotationContent":null,"consumerSeq":1020,"livereSeq":28583,"repSeq":3871836,"memberGroupSeq":26828779,"memberSeq":27312353,"status":0,"repGroupSeq":0,"adminSeq":25413747,"deleteReason":null,"sticker":0,"version":null}],"quotations":[]},"resultCode":200,"resultMessage":"Okay, livere"});

由上面输出结果可知,我们在代码中加入 json_string = json_string[json_string.find('{'):-2]的重要性。

若不加入json_string.find('{')则该结果不是合法的json格式,不能顺利构成json文件;若不截取到倒数第二位,则结果包含多余的);也构不成合法的json格式。

3)对于代码comment_list=json_data['results']['parents']和message=eachone['content'] 中的中括号中的字符串类型的标签定位,可在上面2)中关键部位查找,即完成截取后的合法的json文件由“results”和“parents”两者所包含故使用两个中括号逐级定位,又由于我们爬取的是评论,其内容在该json文件的“content”标签中,故使用["content"]进行定位。

据观察,在真实的数据地址中的offset是页数。

爬取所有页面的评论:

import requests
import json
def single_page_comment(link):headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}r=requests.get(link,headers=headers)# 获取 json 的 stringjson_string = r.textjson_string = json_string[json_string.find('{'):-2]json_data=json.loads(json_string)comment_list=json_data['results']['parents']for eachone in comment_list:message=eachone['content']print(message)for page in range(1,4):link1="https://api-zero.livere.com/v1/comments/list?callback=jQuery112405600294326674093_1523687034324&limit=10&offset="link2="&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1523687034329"page_str=str(page)link=link1+page_str+link2print(link)single_page_comment(link)

输出为:

https://api-zero.livere.com/v1/comments/list?callback=jQuery112405600294326674093_1523687034324&limit=10&offset=1&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1523687034329
在JS 里面也找不到https://api.gentie.163.com/products/ 哪位大神帮忙解答下。谢谢。
在JS 里面也找不到https://api.gentie.163.com/products/ 哪位大神帮忙解答下。谢谢。
在JS 里面也找不到https://api.gentie.163.com/products/ 哪位大神帮忙解答下。谢谢。
测试
为什么我用代码打开的文章只有两条评论,本来是有46条的,有大神知道怎么回事吗?
菜鸟一只,求学习群
lalala1
我来试一试 :smiley:
我来试一试 :smiley:
应该点JS,然后看里面的Preview或者Response,里面响应的是Ajax的内容,然后如果去爬网站的评论的话,点开js那个请求后点Headers -->在General里面拷贝 RequestURL 就可以了 :grinning:
https://api-zero.livere.com/v1/comments/list?callback=jQuery112405600294326674093_1523687034324&limit=10&offset=2&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1523687034329
现在死在了4.2节上,页面评论是有的,但是XHR里没有东西啊,这是什么情况?有解决的大神吗?
为何静态网页抓取不了?
奇怪了,我按照书上的方法来操作,XHR也是空的啊
XHR没有显示任何东西啊。奇怪。
找到原因了
caps["marionette"] = True
作者可以解释一下这句话是干什么的吗
我用的是 pycham IDE,按照作者的写法写的,怎么不行
对火狐版本有要求吗
4.3.1 打开Hello World,代码用的作者的,火狐地址我也设置了,为啥运行没反应
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinarycaps = webdriver.DesiredCapabilities().FIREFOX
caps["marionette"] = False
binary = FirefoxBinary(r'C:\Program Files\Mozilla Firefox\firefox.exe')
#把上述地址改成你电脑中Firefox程序的地址
driver = webdriver.Firefox(firefox_binary=binary, capabilities=caps)
driver.get("http://www.santostang.com/2017/03/02/hello-world/")
我是番茄
为什么刷新没有XHR数据,评论明明加载出来了
https://api-zero.livere.com/v1/comments/list?callback=jQuery112405600294326674093_1523687034324&limit=10&offset=3&repSeq=3871836&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1523687034329
为什么刷新没有XHR数据,评论明明加载出来了
为什么刷新没有XHR数据,评论明明加载出来了
第21条测试评论
第20条测试评论
第19条测试评论
第18条测试评论
第17条测试评论
第16条测试评论
第15条测试评论
第14条测试评论

注意:page变量取自int,进行字符串拼接前需要进行转换,即page_str=str(page)

参考书目:唐松,来自《Python 网络爬虫:从入门到实践》

转载于:https://www.cnblogs.com/dudududu/p/8832178.html

Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...相关推荐

  1. python动态页面元素爬取_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  2. python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. Python网络爬虫(四):selenium+chrome爬取美女图片

    说明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因为是模拟浏览器访问,chrome需要再下载一个驱动,具体方式在我的上 ...

  4. Python爬虫自学之第(⑤)篇——爬取某宝商品信息

    题外话: <Pi Network 免费挖矿国外热门项目 一个π币大约值3元到10元>相信过去BTC的人,信不信未来的PI,了解一下,唯一一个高度与之持平的项目 能看到这里说明快进入动态网页 ...

  5. python开发跟淘宝有联系没_Python爬取淘宝店铺和评论

    1.安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动s ...

  6. 利用python编写爬虫程序,从招聘网站上爬取数据,将数据存入到MongoDB数据库中,将存入的数据作一定的数据清洗后做数据分析,最后将分析的结果做数据可视化

    教程演示 创建爬虫项目 编写需要爬取的字段(items.py) 编写spider文件(wuyou.py) 编写数据库连接(pipelines.py) 编写反爬措施(settings.py) Mongo ...

  7. 利用Python网络爬虫实现对网易云音乐歌词爬取

    今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本地 ...

  8. 【Python】爬虫初体验,40行代码爬取双色球2003年至今的开奖号码

    爬虫爬取的双色球开奖号码 按我目前的理解,爬虫的工作原理大致是: 获取目标网页,在网页(html文件)中筛选目标数据,最后把数据导出 利用爬虫爬取数据看似很"高深莫测",只需几分钟 ...

  9. python开发跟淘宝有关联微_python - 爬取某淘宝店铺所有宝贝遇到的问题?

    问 题 在爬一个淘宝店铺的信息时发现会通过jsonp去网站取回数据,url如下: https://tianziyujushangcheng.taobao.com/i/asynSearch.htm?ca ...

最新文章

  1. 根据keyName(如:result.data.name),无限深度遍历获取keyValue
  2. windows xp远程桌面没有反应
  3. 深度丨霍金的去世让我想起了微软提出的人工智能十大原则
  4. JavaScript那些事儿-不被知晓的预解释
  5. 第4章:介绍python对象类型/4.1 python的核心数据类型/4.7 集合
  6. beacon帧字段结构最全总结(三)——VHT字段总结
  7. wxWidgets:wxRecursionGuard类用法
  8. 摇杆小霸王红白机在线游戏网页源码
  9. lazada发货_Lazada 怎么发货:Lazada 订单发货流程
  10. 矩池云安装PyQt5,并在VNC中测试使用
  11. Linux下mysql主从复制配置(CentOS7)
  12. 当我们谈论深度学习时,我们在谈论什么?
  13. 不用PLC编程,实现USB或串口条码枪对接PLC,数据直接写入寄存器
  14. 医药电子 | 温度传感器的类型原理特点和应用
  15. 电工/模电/数电/电气控制/PLC/单片机综合实验装置
  16. python dict.get 用法
  17. vue-ssr在项目中的实践
  18. python docx 提取图片_Python提取docx文档中所有嵌入式图片和浮动图片
  19. 读书笔记-精准努力-思考时间和精力的分配
  20. 使用 Flutter 开发 Github 客户端及学习历程的小结

热门文章

  1. 服务器迁移需要备份哪些文件?
  2. 关注与粉丝表结构设计及查询
  3. 22下半年:来长沙建第二支团队与所读的30本书(含哲学文学历史书单/笔记)
  4. 按关键字搜索易贝商品 API
  5. mysql-8.0.19-winx64安装过程
  6. ct扫描方式有哪些_医学影像技术(医学高级):CT必看题库知识点(考试必看) - 考试题库...
  7. 设计模式深入学习---Decorator装饰模式(结构型模式)
  8. 平板触控笔有哪些用途?超高性价比的触控笔推荐
  9. 解决php加载慢的一个办法
  10. 如何利用爬虫工具实现竞品价格监控