Python爬取网页数据保存到csv文件中

一、数据来源分析

1、明确需求

明确采集网站已经数据内容

2、抓包分析

通过浏览器开发者工具分析对应的数据位置

  • 打开开发者工具 option+command+I 或者 右键在网页点击检查-选择network(网络)
  • 刷新网页 更新网页数据
  • 通过关键字搜索找到对应的数据位置 需要什么数据就搜索什么数据,具体参考如下截图

数据包地址h5api.m.taobao.com/h5/mtop.rel...

Sign加密参数-逆向分析

开发者工具关键字搜索

null

image-20241020234321875

markdown 复制代码
位置-index.js 分析sign参数
1. 标准md5,可以用python代码直接复现即可
2. 魔改MD5,扣js代码c函数方法扣出来

具体加密分析请查看这篇文章:- 【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程

二、代码实现步骤

1、发送请求

模拟浏览器对于url地址发送请求

针对于需要登陆账号才能看到数据网站:
    -携带登陆账号之后cookie进行访问请求
模拟登陆:需要逆向账号/密码加密参数/ 需要进行验证识别(逆向)
    针对某些网站数据采集:多准备账号

模拟浏览器

bash 复制代码
使用开发者工具 ->网络->点击对应数据包 -> 标头->请求标头
常用伪装参数:cookie/referer/ua/...
需要注意代码格式:字典形式

请求网址

ini 复制代码
# 抓包分析到的请求链接地址
url = 'https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0'

发送请求

python 复制代码
"""发送请求"""
# 模拟浏览器
headers = {
    # cookie 用户信息,常用于检测是否有登陆账号
    'cookie': 't=7be5e01a91d917d153ef1d4e5ea24791',
    # 用户代理,浏览器的基本信息
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
}

# 请求网站
url = 'https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0'

# 请求参数
data = {
    'jsv': '2.7.4',
    'v': ' 2.0',
    'timeout': ' 10000',
    'type': ' jsonp',
    'dataType': ' jsonp',
}

# 发送请求
response = requests.get(url=url, params=data, headers=headers)

2、获取数据

response.text

获取响应的文本数据
*

response.json()

获取响应的json数据-字典数据或者列表数据 必须是完整的/标准的json数据格式 {'A':'B','info':{'c':'D'}} 〔{'A':'B'}, 'c': "D'}] 如果响应数据 Xxx({'A':'B',"info':{'c':'D'}})不是标准json数据格式 如果你获取json数据报错了 1. 先获取文本数据内容
*

response.content

获取响应的二进制数据-例如图片-音视频文件或者其他文件

反扒基本情况

当我们获取数据时候: 1.返回了数据,但是数据不是我们想要的 2.没有返回数据,返回空白面板 解决方法: 1. 考虑请求头伪装是否不够 -添加多个请求头参数字段 2. 是否采集频率过快 过高,导致有IP异常/账号异常/验证码 -刷新网页,看是否可以正常访问 3.是否存在加密参数(请求头参数加密/请求参数加密) -加密参数逆向分析

3、解析数据

python 复制代码
"""解析数据"""
data = response.json()
default_data = data['page_params']['products_info']['cart_by_delivery_type']['default']
# key 字段名不是固定的,先过去动态字段名列表
keyList = default_data.keys()
print(keyList)
# 需要的列表数据
itemArray = []
# 根据字段名获取数据添加到集合中
for keyItem in keyList:
    itemArray.extend(default_data[keyItem])

4、保存数据

ruby 复制代码
# 遍历列表数据,保存数据到csv中
for item in itemArray:
    line_main = item['line_main']
    dit = {
        'mrg-btm-xs href':line_main['link'],
        'card-v2-badge-cmp':line_main['special_discount_badge'],
        'average-rating':'4.75',
        'product-new-price':line_main['reduced_price_info']['initial_price'],
        'name':line_main['name'],
        'max_quantity':line_main['max_quantity'],
        'delivery_vendor_id':line_main['delivery_vendor_id']
    }
    # 数据保存到 csv 中
    csv_writer.writerow(dit)
    pprint.pprint(dit)

生成文档对应的数据

null

image-20241021152036249

完整代码:

python 复制代码
import json
import re

import requests
import hashlib
import csv
import pprint
import datetime
file_name =  datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
# 创建文件夹
f = open(f"data_{file_name}.csv", mode='w', encoding='utf-8', newline='')

# 字典写入方法
csv_writer = csv.DictWriter(f, fieldnames=['mrg-btm-xs href',
                                           'card-v2-badge-cmp',
                                           'average-rating',
                                           'product-new-price',
                                           'name',
                                           'max_quantity',
                                           'delivery_vendor_id',
                                           ])
# 写入表头
csv_writer.writeheader()

"""模拟浏览器"""
headers = {
    'Cookie':'ltuid=2429402282588876002; EMAGUUID=1729471081-2659022946-55620.868',
    'User-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)',
    'Referer':'https://www.emag.ro/cart/products?ref=cart',
}
"""请求地址"""
url = 'https://www.emag.ro/cart/products?source=front'

"""发送请求"""
response = requests.get(url=url,headers=headers)

"""解析数据"""
data = response.json()
default_data = data['page_params']['products_info']['cart_by_delivery_type']['default']
# key 字段名不是固定的,先过去动态字段名列表
keyList = default_data.keys()
print(keyList)
# 需要的列表数据
itemArray = []
# 根据字段名获取数据添加到集合中
for keyItem in keyList:
    itemArray.extend(default_data[keyItem])

"""提取数据"""
for item in itemArray:
    line_main = item['line_main']
    dit = {
        'mrg-btm-xs href':line_main['link'],
        'card-v2-badge-cmp':line_main['special_discount_badge'],
        'average-rating':'4.75',
        'product-new-price':line_main['reduced_price_info']['initial_price'],
        'name':line_main['name'],
        'max_quantity':line_main['max_quantity'],
        'delivery_vendor_id':line_main['delivery_vendor_id']
    }
    # 数据保存到 csv 中
    csv_writer.writerow(dit)
    pprint.pprint(dit)
相关推荐
MessiGo15 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
肥猪猪爸39 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
大白要努力!40 分钟前
Android opencv使用Core.hconcat 进行图像拼接
android·opencv
LZXCyrus1 小时前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
Enougme1 小时前
Appium常用的使用方法(一)
python·appium
懷淰メ1 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm2 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
天空中的野鸟2 小时前
Android音频采集
android·音视频
hummhumm2 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
每天吃饭的羊2 小时前
python里的数据结构
开发语言·python