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)
相关推荐
哲科软件3 小时前
跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议
android·flutter·kotlin
烛阴4 小时前
简单入门Python装饰器
前端·python
好开心啊没烦恼5 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
面朝大海,春不暖,花不开5 小时前
使用 Python 实现 ETL 流程:从文本文件提取到数据处理的全面指南
python·etl·原型模式
2301_805054566 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
万千思绪6 小时前
【PyCharm 2025.1.2配置debug】
ide·python·pycharm
微风粼粼8 小时前
程序员在线接单
java·jvm·后端·python·eclipse·tomcat·dubbo
云天徽上8 小时前
【PaddleOCR】OCR表格识别数据集介绍,包含PubTabNet、好未来表格识别、WTW中文场景表格等数据,持续更新中......
python·ocr·文字识别·表格识别·paddleocr·pp-ocrv5
你怎么知道我是队长8 小时前
python-input内置函数
开发语言·python
叹一曲当时只道是寻常9 小时前
Python实现优雅的目录结构打印工具
python