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)
相关推荐
黄林晴2 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我2 小时前
flutter 之真手势冲突处理
android·flutter
法的空间3 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止3 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭3 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
用户8356290780513 小时前
从手动编辑到代码生成:Python 助你高效创建 Word 文档
后端·python
jctech3 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831673 小时前
为何Handler的postDelayed不适合精准定时任务?
android
c8i3 小时前
python中类的基本结构、特殊属性于MRO理解
python
叽哥3 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin