爬虫高级应用(13. 抓取异步数据)

el/2024/5/23 1:47:05

抓取异步数据

    • 主要内容:
    • 关于异步传输AJAX
      • 什么是AJAX?
      • AJAX基本原理
    • AJAX服务端请求数据案例
    • 实战案例:抓取某东图书评价

主要内容:

  1. 什么是异步数据加载
  2. AJAX的基本概念
  3. 如何获取异步数据使用的URL
  4. 抓取异步数据
  5. 项目实战:分析某东商城图书评论数据,并抓取这些数据

关于异步传输AJAX

什么是AJAX?

1、异步,请求和下载异步,不占用主线程,即使加载数据缓慢,不会出现页面卡顿
2、传输数据的格式,XML->JSON

AJAX基本原理

  1. 发送请求,Web端页面中实现业务逻辑与页面交互的JavaScript语言, IE7+、FireFox,Chrome,Safari浏览器等,需使用XMLHttpRequest对象发送请求,而IE7版本以下的浏览器需要使用下面的代码串讲Microsoft.XMLHTTP对象xmlhttp = new ActiveXObject(“Microsoft.XMLHTTP”)
  2. 解析响应,响应主要是指JSON格式的数据。使用JSON.parse(result)得到JavaScript的JSON的数据
  3. 渲染页面

AJAX服务端请求数据案例

  1. 使用Flask框架模拟实现一个异步加载的页面。页面使用模板显示,通过jQuery想服务端发送请求,获取数据后将数据显示在页面上
  2. 知道了异步传输的URl,就可以通过requests等网络去通过URL进行抓取,不过返回的数据格式不是HTML,也不是XML,而是JSON。
  3. 所以不能使用XPath和CSS选择器处理,而是使用json模块中的loads函数将字符串形式的JSON转换为Python字典

服务器端

from flask import Flask,render_template
from flask import make_response
import json
app = Flask(__name__)@app.route('/')
def index():return render_template('index.html')
@app.route('/data')
def data():data = [{'id':1,'name':'PyQt5(Python)实战视频课程'},{'id':2,'name':'Electron实战'},{'id':3, 'name': '征服C++ 11'},{'id':4, 'name': '征服Flask'},]response = make_response(json.dumps(data))return responseif __name__ == '__main__':app.run(host = '0.0.0.0', port='1234')

html页面内容

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>异步加载页面</title><script src="/static/jquery.js"></script>
</head>
<body onload="onLoad()">
<h1>视频课程</h1><ul id="video_list"><li>人工智能-机器学习实战视频课程</li><li>用C++和Go开发Node.js本地模块</li><li>Go Web实战视频教程</li><li>Python科学计算与图形渲染库视频教程</li>
</ul>
<script>function onLoad(){$.get("/data", function(result){data = JSON.parse(result)for(var i = 0; i < data.length;i++) {$('#video_list').append('<li>' + data[i].name + '</li>')}});}
</script>
</body>
</html>

jquery.js文件内容
可以自行到网上下载,博主用的是jquery1.7.2版本

请求客户端

import requests
import json
from lxml import etree
result = requests.get('http://localhost:1234/data')
# 由于返回的数据包含中文(unicode编码),所以需要将其转码
print(result.text)
text = result.text.encode('utf-8').decode('unicode-escape')
print(text)
# 将字符串形式的JSON转换为Python字典
data = json.loads(text)
print('个数:',len(data))
# 输出返回的所有视频课程名称
for value in data:print(value['name'])

通过url的形式可以请求到数据,不过数据是以json的形式存放
在这里插入图片描述

抓取的异步数据后,进行解析,在控制台输出数据:
在这里插入图片描述

实战案例:抓取某东图书评价

  1. 首先进入某东图书的官网,选取一本图书
    https://item.jd.com/12715627.html
    在这里插入图片描述

  2. F12进入开发者模式,找到异步传输的评论内容URL
    这里将一个小技巧,打开F12审查元素后,会看到很多眼花缭乱的条目,一下子找不出哪一个是评论的异步传输url,先清除一下当前的条目,再点击页面上评论的按钮,再传输过来的就是关于评论的条目了,数量上也会少很多。
    在这里插入图片描述
    双击可以查看异步页面传输的是什么
    异步数据的URL: https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=12715627&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

在这里插入图片描述

  1. 对其进行请求,注意要加Cookie
    注意:这里Cookie的获取,需要用自己的账号登录网页后再获取某东上自己的Cookie,如果没有登录,请求网页仍然会被拦截,所以在爬虫无法解析页面的时候,最好打印一下页面的内容,大多是因为请求头设置的不够完全导致无法请求到页面的代码。
    复习:如果忘记了如何获取自己的Cookie,请复习查看requests网络库内容: 如何获取及设置Cookie.

  2. 实操代码:
    这里的代码需要替换url,Cookie,再解析JSON的数据

import requests
import re
import json
import csv
import os
# 设置请求头(User-Agent)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 ','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.9','Accept-Encoding': 'gzip, deflate, br','Referer': 'https://item.jd.com/','Connection': 'keep-alive','Cookie': '替换成自己的Cookie','Host': 'club.jd.com'
}
# 限定抓取的评论数
fetch_comment_count = 15
# 设置代理
proxies = {"https":"https://27.220.121.173:49508"
}
index = 0
page_index = 0
flag = True # 用于控制循环的退出
while flag:url = '''https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=12417265&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&fold=1'''.format(page_index)print(url)page_index += 1# html = reqests.get(url,headers=header,proxies=proxies# 抓取评论页面html = requests.get(url,headers)# 获取抓取的内容,这里需要先按照iso-8859-1格式编码text = str(html.content, encoding='iso-8859-1')# 下面的代码替换返回数据的部分内容,因为返回的数据并不是标准的JSON格式leftIndex = text.find('{')rightIndex = text.rfind('}')json_str = text.replace('fetchJSON_comment98(', '')json_str = json_str.replace(")", '')json_str = json_str.replace("null", '"null"')json_str = json_str.replace(";", '')print(json_str)json_obj = json.loads(json_str)# 循环输出评论数据for i in range(0,len(json_obj['comments'])):try:# 这里要进行iso-8859-1编码,然后在解码,否则会出现乱码# 按iso-8859-1编码是指按原样将字符转换为字节流# 获取评论内容comment = json_obj['comments'][i]['content'].encode(encoding='iso-8859-1').decode('GB18030')# 删除评论内容是用户 没有填写评论内容if comment != '此用户未填写评价内容':print('<',index + 1,'>',comment)# 获取评论时间creationTime = json_obj['comments'][i]['creationTime']# 获取昵称nickname = json_obj['comments'][i]['nikename'].encode(encoding='iso-8859-1').decode('GB18030')print(creationTime)print(nickname)      print('__________________________________________________________')index += 1except:passif index == fetch_comment_count:flag = Falsebreak

http://www.ngui.cc/el/5281658.html

相关文章

数据结构 第3章 栈和队列

第三章 栈和队列 数据结构—栈思维导图强化练习 数据结构—队列思维导图强化练习 栈和队列的应用思维导图强化练习 特殊矩阵的压缩存储思维导图强化练习 数据结构—栈 思维导图 强化练习 3.1.4 8.向一个栈顶指针为top的链栈&#xff08;不带头结点&#xff09;中插入一个x结点…

爬虫高级应用(14. 可见即可爬Selenium)

本章主要内容 1、安装Selenium和WebDriver 2、Selenium的基本使用方法 3、查找节点 4、节点交互 5、管理Cookie 6、执行JavaScript代码 7、改变节点属性值Selenium的主要功能&#xff1a; 1、打开浏览器 2、获取浏览器页面的特定内容 3、控制浏览器页面上的空间&#xff0c;如…

基于javacc设计Cb编译器《自制编译器》

目录 1.引言2.cbc编译器的环境配置3.代码分析3.1 词法分析3.1.1正则表达式的扫描器3.1.2 TOKEN命令 4.JavaCC制作解析器4.1 JavaCC的语法描述4.2 JavaCC的EBNF表示法 5.语法分析6.抽象语法树6.1 抽象语法树的构成 7.语义分析7.1变量引用的消解7.2类型名称的消解7.3 类型定义检查…

Python每日笔记合集

目录 >> Python每日笔记—目录 << >> Python每日笔记—Day01 数据类型 << >> Python每日笔记—Day02 运算符 << >> Python每日笔记—Day03 循环字符串 << >> Python每日笔记—Day04 字符串补充 << >&…

软件测试 | 知识理论大纲

什么是软件测试 在规定的条件下,对程序进行操作,从而发现错误,对软件质量进行评估的过程。 软件测试的目的 以最少的人力、物力、时间找到软件的缺陷,并修改从而规避商业风险。 软件测试的定义 使用人工和自动手段来运行和测试某个系统的过程,目的在于检验是否满足了…

为什么要使用href=”javascript:void(0);”

href”javascript:void(0);” 这个的含义是&#xff0c;让超链接去执行一个js函数&#xff0c;而不是去跳转到一个地址&#xff0c; 而void(0)表示一个空的方法&#xff0c;也就是不执行js函数。 为什么要使用href”javascript:void(0);” javascript:是伪协议&#xff0c;表示…

记录用vue-seamless-scroll实现列表无缝滚动

1.安装&#xff1a;npm install vue-seamless-scroll --save 2.导入 import vueSeamlessScroll from vue-seamless-scroll // 无缝滚动组件 components: {vueSeamlessScroll},3.配置初始值 computed: {// 监听属性 类似于data概念defaultOption () {return {step: 0.4, // 数值…

记录解决echarts文字显示不清晰问题

最近在用echarts时&#xff0c;遇见文字及图例失真、不清晰问题&#xff0c;特此记录 // 方法一&#xff1a; this.chart this.$echarts.init(document.getElementById(supplierContentChart), null, {renderer: svg}) // 采用svg渲染&#xff0c;比canvans清晰度高// 方法二…

记录Git每次进入都需要输入用户名和密码的问题解决

方法一&#xff1a; .gitconfig 文件中添加[credential] helper store方法二&#xff1a; 设置记住密码&#xff08;默认15分钟&#xff09;&#xff1a; git config –global credential.helper cache 如果想自己设置时间&#xff0c;可以这样做&#xff1a; git config cr…

记录解决tinymce富文本,第二次点击不显示焦点问题

1.此方法解决了我的问题 在用tinymce富文本的时候&#xff0c;由于是用在弹框上的&#xff0c;在第二次打开弹框的时候始终无法获取焦点。 后来才发现问题出在tinymce在弹框创建前创建了&#xff0c;所以导致这个问题&#xff0c;解决方案就是用 v-if“visibile”&#xff0c;…