Python爬虫系列1-通过requests Payload方式抓取掘金数据

简介: 在给同事抓取个人文章数据的时候发现get形式获取不到数据,通过分析网站结构发现需要Post请求的json格式数据;进而发现其使用的Post格式并不是Form Data 而是Request Payload ,再解决之际,顺手写成博客供大家学习使用,如有帮助-还请点赞👍关注!将持续更新更多新的文章。

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

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

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

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

image.png

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的开发者工具可以看到,比如:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

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

image.png

image.png

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

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文件进行保存。

最终显示数据内容

image.png

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

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

支持原创。感谢!

相关文章
|
3天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by='A', ascending=False)`。`rank()`函数用于计算排名,如`df['A'].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`和分别对'A'、'B'列排名。
13 2
|
2天前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
24 1
|
1天前
|
机器学习/深度学习 算法 Python
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
20 4
|
2天前
|
机器学习/深度学习 算法 算法框架/工具
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
数据分享|PYTHON用KERAS的LSTM神经网络进行时间序列预测天然气价格例子
21 0
|
2天前
|
机器学习/深度学习 数据挖掘 网络架构
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
12 0
|
2天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
10 0
|
3天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
13 0
|
4天前
|
Python
如何使用Python的Pandas库进行数据缺失值处理?
Pandas在Python中提供多种处理缺失值的方法:1) 使用`isnull()`检查;2) `dropna()`删除含缺失值的行或列;3) `fillna()`用常数、前后值填充;4) `interpolate()`进行插值填充。根据需求选择合适的方法处理数据缺失。
38 9
|
5天前
|
数据挖掘 API 数据安全/隐私保护
python请求模块requests如何添加代理ip
python请求模块requests如何添加代理ip
|
6天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。