当前位置:首页 > 技术分析 > 正文内容

小伙给同事爬取数据竟获取不到,竟要使用这种请求方式才能获取?

ruisui885个月前 (01-20)技术分析30

Http请求中Form Data 和 Request Payload两种参数的区别 ?

Ajax Post请求中常用的两种的形式:form data 和 request payload

一、默认的表单方式请求 Form Data


post请求的Content-Type为application/x-www-form-urlencoded(默认的),参数是在请求题中,即上面请求中的Form Data。

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

代码格式:

data = {
  'i': '\u903B\u8F91\n',
  'from': 'AUTO',
  'to': 'AUTO',
  'smartresult': 'dict',
  'client': 'fanyideskweb',
  'salt': '15752746021826',
  'sign': 'c62688ce2eab6fd7a95cac50c3e88752',
  'ts': '1575274602182',
  'bv': '5bc00aa7005fda30bbc3c3735a53d97d',
  'doctype': 'json',
  'version': '2.1',
  'keyfrom': 'fanyi.web',
  'action': 'FY_BY_REALTlME'
}

复制代码

二、经浏览器解析后的表单请求 Request Payload



PS: 请求的Content-Type是application/json;charset=UTF-8,而请求表单的参数在Request Payload中。

Content-Type: application/json (这里用的是json格式)

代码格式:


payload = '{"operationName":"","query":"","variables":{"ownerId":"5c3f3c415188252b7d0ea40c","size":20,"after":""},"extensions":{"query":{"id":"b158d18c7ce74f0d6d85e73f21e17df6"}}}'

复制代码

二者之间的区别 ?

post请求,如果表单参数是在请求体中,也是以key1=value1&key2=value2的形式在请求体中。

通过chrome的开发者工具可以看到,比如:

fanyi.youdao.com/translate_o…

1、如果一个请求的Content-Type设置为

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

那么这个Post请求会被认为是Http Post表单请求,请求主体也将以一个标准的键值对和&的str形式出现。这种方式是HTML表单默认的设置,对现如今的网络请求构造是很常见的。

2、Request payload形式的POST请求,网站为了方便阅读,使用了Json这样的数据格式,请求的方式为

Content-Type: application/json 或者指定charset=UTF-8。

- 实战

使用requests模块post payload请求

在抓取个人数据的时候发现get形式获取不到数据,通过分析网站结构发现需要Post请求的json格式数据;进而发现其使用的Post格式并不是Form Data 而是Request Payload



第一步:先请求拿到数据再说

import requests
import json

# 首页地址
url = "https://web-api.juejin.im/query"

# 伪装成浏览器
headers = {
    'X-Legacy-Device-Id': '1574318487465',
    'Origin': 'https://juejin.im',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
    'X-Legacy-Token': 'eyJhY2Nlc3NfdG9rZW4iOiJBNVNuRUNPb1Jad0doWm1wIiwicmVmcmVzaF90b2tlbiI6IkpuVkFoZFozdjNFdDZMOFMiLCJ0b2tlbl90eXBlIjoibWFjIiwiZXhwaXJlX2luIjoyNTkyMDAwfQ==',
    'Content-Type': 'application/json',
    'Referer': 'https://juejin.im/user/3650034335487975',
    'X-Legacy-Uid': '5dd631975188254e310b4cbb',
}

payload = '{"operationName":"","query":"","variables":{"ownerId":"5c3f3c415188252b7d0ea40c","size":20,"after":""},"extensions":{"query":{"id":"b158d18c7ce74f0d6d85e73f21e17df6"}}}'

# 发起网络请求,获取到返回的html
result = requests.post(url=url, headers=headers, data=payload).content.decode('utf-8')
print(result)

复制代码

这时候已经可以拿到payload表单形式的json数据了,因为考虑到是json格式的数据,不方便我们进行数据处理!接下来咱们先转换一下格式!这里转换成字典格式。

result=json.loads(result)
result_list=result['data']['ownActivityFeed']['items']['edges']
print(result_list)

复制代码

这个时候已经成功的将数据格式进行转换,之后并通过一直获取键值对的形式拿到网站所包含的数据;数据类型的格式为列表, 再次深入获取

for item in result_list:
    # # 用户名
    node_list=item['node']
    user_targets_content=node_list['targets']
    for item_name_list in user_targets_content:
        try:
            user=item_name_list['user']
            user_name=user['username']
            user_content=item_name_list['content']
        except:
            continue
        print('*' * 30, '\n', user_name, user_content, '\n', '*' * 30)
        with open('lg_Tony.txt','a') as file:
            file.write(user_name+'\t\t'+user_content+'\n\n')
            
复制代码

考虑到只是获取简单的界面内容,所以这里只用了txt文件进行保存。

最终显示数据内容



在这个浮躁的时代;竟然还有人能坚持篇篇原创;

如果本文对你学习有所帮助-可以点赞+ 关注!将持续更新更多新的文章。

支持原创。感谢!

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/391.html

分享给朋友:

“小伙给同事爬取数据竟获取不到,竟要使用这种请求方式才能获取?” 的相关文章

git的几种分支模式

编写代码,是软件开发交付过程的起点,发布上线,是开发工作完成的终点。代码分支模式贯穿了开发、集成和发布的整个过程,是工程师们最亲切的小伙伴。那如何根据自身的业务特点和团队规模来选择适合的分支模式呢?本文分享几种主流 Git 分支模式的流程及特点,并给出选择建议。分支的目的是隔离,但多一个分支也意味着...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

vue打开新窗口并且实现传参,有图有真相

我要实现的功能是打开一个新窗口用来展示新页面,而且需要传参数,并且参数不能显示在地址栏里面,而且当我刷新页面的时候,传过来的参数不能丢失,要一直存在,除非我手动关闭这个新窗口,即浏览器的标签页。通过面向百度编程,发现网上的根本达不到这个效果,而且还都是坑,明明实现不了,还若有其事的写出来,于是我在标...

深入理解vue-router原理

说到vue-router就表明他只适合于vue和vue是强绑定的关系;不适合其他框架;现在我们模仿实现一个VueRouter;1.要使页面刷新;借助vue本身的响应式原理;import Home from "./views/Home"; import About from "...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing 发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。早在2021年,腾讯的 TDesing 刚发布不久,我就写了一篇简短的文章来介绍,当时主要关注的是 TDesign 的 Vue 组件库和用来搭建 admin 后台系统的实用性。虽然当时看起来不错,但还处于测试版,...