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)
相关推荐
小小张说故事6 分钟前
Python 中 __new__ 和 __init__ 到底谁才是构造函数?一文讲透区别与 5 个坑
后端·python
言乐614 分钟前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
伞伞悦读15 分钟前
从零打通 Hermes Agent:Windows + WSL2 + Clash 全链路安装、认证与首次实战
python·语言模型
事圆则缓20 分钟前
Android 开启线程的几种方式:Thread、线程池、HandlerThread 与协程
android
happylifetree33 分钟前
Python17:核心语法-数据存储与运算-输入与输出
python
梅雅达编程笔记43 分钟前
04-Python CSV数据保存与翻页抓取
开发语言·爬虫·python·pandas·数据采集·csv
估值探索者1 小时前
【Python量化策略实战 #04】Donchian 通道假突破太多?用 ATR 阈值过滤跑通真实突破信号
开发语言·python·接口·api接口·数据api接口·股票数据api接口
oooost1 小时前
Jupyter Notebook 常用快捷键速查
ide·python·jupyter
阿钱真强道2 小时前
30 嵌入式操作系统 | 上位机界面:Flask 网页显示 + 控制闭环
后端·python·flask
ysu_03142 小时前
Docker-Desktop-WSL2实战指南-Windows从安装配置到项目容器化
windows·python·docker·容器·composer·dockerfile·wsl2