python开发爬虫之动态网页抓取篇:爬取博客评论数据

小杜同学的嘚啵嘚      2022-02-10     733

关键词:

由于主流网站都使用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 FirefoxBinary

caps = 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]]) -> int

Return 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 的 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)
        
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+link2
    print(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 FirefoxBinary

caps = 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 网络爬虫:从入门到实践》

 

python开发爬虫之beautifulsoup解析网页篇:爬取安居客网站上北京二手房数据

目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称、价格、几室几厅、大小、建造年份、联系人、地址、标签等。网址为:https://beijing.anjuke.com/sale/BeautifulSoup官网:https://www.crummy.com/software/BeautifulSoup/直接上... 查看详情

爬虫--1

Python非常适合用来开发网页爬虫,理由如下:1、抓取网页本身的接口相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁;相比其他动态脚本语言,如perl,shell,python的urllib包提供了较为完整的访问网页... 查看详情

python爬虫-27-python之selenium入门,动态网页抓取

之前我们操作的对象都是静态网页,直接查看网页源代码即可,那么近几年动态网页的占有率越来越多,通过之前的方式不是那么方便的获取动态网页的内容,所以我们这里使用​​selenium​​,他是干啥的呢,简单的你可以理... 查看详情

如何入门爬虫(基础篇)

一、爬虫入门Python爬虫入门一之综述Python爬虫入门二之爬虫基础了解Python爬虫入门三之Urllib库的基本使用Python爬虫入门四之Urllib库的高级用法Python爬虫入门五之URLError异常处理Python爬虫入门六之Cookie的使用Python爬虫入门七之正则... 查看详情

python爬虫能干啥

python爬虫就是模拟浏览器打开网页,获取网页中想要的那部分数据。利用爬虫我们可以抓取商品信息、评论及销量数据;可以抓取房产买卖及租售python爬虫就是模拟浏览器打开网页,获取网页中想要的那部分数据。利用爬虫我们... 查看详情

python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)

上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为这一卷的案例,不用想有图,有字第一步:创建... 查看详情

scrapy初探之爬取武sir首页博客(代码片段)

一、爬虫网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或... 查看详情

值!一篇博客,容纳11个python爬虫案例总结,《爬虫100例》专栏第6篇复盘文章(代码片段)

文章目录案例29:手机APP数据采集案例30:高考派大学数据采集案例31:36氪(36kr)数据抓取scrapy案例32:B站博人传评论数据抓取scrapy案例33:《海王》评论数据抓取scrapy案例34:掘金网全站用户爬虫scrapy案例35~... 查看详情

值!一篇博客,容纳11个python爬虫案例总结,《爬虫100例》专栏第6篇复盘文章(代码片段)

文章目录案例29:手机APP数据采集案例30:高考派大学数据采集案例31:36氪(36kr)数据抓取scrapy案例32:B站博人传评论数据抓取scrapy案例33:《海王》评论数据抓取scrapy案例34:掘金网全站用户爬虫scrapy案例35~... 查看详情

python爬虫能做啥

Python是一门非常适合开发网络爬虫的编程语言,相比于其他静态编程语言,Python抓取网页文档的接口更简洁;相比于其他动态脚本语言,Python的urllib2包提供了较为完整的访问网页文档的API。此外,python中有优秀的第三方包可以高... 查看详情

『python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析csdn与博客园博客阅读数据(代码片段)

...计博客园博客阅读量0x03:后记推荐补充阅读:『Python开发实战菜鸟教程』工具篇:手把手教学使用VSCode开发Python0x01:引子这是一个网络爬虫快速入门实战教程,笔者希望读者能跟着这个博客进行实操,从... 查看详情

我的第二十三篇博客---爬虫简介

网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(主要指浏览器)发送网络请求,接收请求响应,按照一定的规则,自动地抓取互联网信息的程序。原则上,只要是客户端(主要指浏览器)能做的事情,爬虫都能够... 查看详情

『python开发实战菜鸟教程』实战篇:爬虫快速入门——统计分析csdn与博客园博客阅读数据(代码片段)

文章目录0x01:引子首先介绍一下网络爬虫是什么,可以用来做什么?这里简单探讨一下网络爬虫的合法性正式进入爬虫实战前,需要我们了解下网页结构HTMLCSSJScript写一个简单的HTML0x02:实操安装依赖爬虫的基... 查看详情

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容:全部过程采取自动识别与抓取,抓取结果是将一个博主的所有文章存放在以其名字命名的文件内,代码如下 #coding:utf-8importurllib2frombs4importBeautifulSoupimportosimportre#importsys#reload(s... 查看详情

python进阶篇五python爬虫的抓取网页(代码片段)

目录五、Python爬虫的抓取网页5.1导入所需模块5.2获取目标URL地址5.3向目标URL发送请求5.4保存为本地文件5.5优化程序五、Python爬虫的抓取网页Python爬虫应用案例:爬取目标的网页,并将其保存到本地。对要编写的爬虫程序... 查看详情

第四章爬虫进阶之动态网页数据抓取(代码片段)

动态网页数据抓取什么是AJAX:AJAX(AsynchronouseJavaScriptAndXML)异步JavaScript和XML。过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统... 查看详情

python爬虫深造篇——多线程网页爬取(代码片段)

一、前情提要相信来看这篇深造爬虫文章的同学,大部分已经对爬虫有不错的了解了,也在之前已经写过不少爬虫了,但我猜爬取的数据量都较小,因此没有过多的关注爬虫的爬取效率。这里我想问问当我们要爬... 查看详情

一篇博客,拿下7个爬虫案例,够几天的学习量啦,《爬虫100例》第4篇复盘文章

文章目录案例13:斗图啦表情包爬取案例14:PDF电子书下载案例15:政民互动数据采集案例16:500px摄影师社区案例17:CSDN博客抓取数据案例18:煎蛋网XXOO案例19:51CTO学堂课程数据抓取今日复盘结论收藏时间案例13:斗图啦表情包... 查看详情