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)
相关推荐
Java陈序员4 分钟前
直播录制神器!一款多平台直播流自动录制客户端!
python·docker·ffmpeg
c8i5 分钟前
drf 在django中的配置
python·django
用户0917 分钟前
深入了解 Android 16KB内存页面
android·kotlin
火车叼位1 小时前
Android Studio与命令行Gradle表现不一致问题分析
android
这里有鱼汤2 小时前
【花姐小课堂】新手也能秒懂!用「风险平价」打造扛造的投资组合
后端·python
前行的小黑炭3 小时前
【Android】 Context使用不当,存在内存泄漏,语言不生效等等
android·kotlin·app
前行的小黑炭4 小时前
【Android】CoordinatorLayout详解;实现一个交互动画的效果(上滑隐藏,下滑出现);附例子
android·kotlin·app
databook16 小时前
Manim实现闪光轨迹特效
后端·python·动效
用户20187928316716 小时前
Android黑夜白天模式切换原理分析
android
芦半山16 小时前
「幽灵调用」背后的真相:一个隐藏多年的Android原生Bug
android