分享

爬虫实战:新发地菜价

 NeighborMrSun 2023-03-02 发布于湖南

1. 观察网页结构

图片

图片

图片


数据请求方式为post,提交的表单当中的有效信息为current,用来标记页码。观察表单请求之后直接返回的结果,可以看到请求了一个“getPriceData”的网页。在预览当中可以看到每次返回都是一个字典,包含了一个list,在list当中又通过字典的方式返回数据。

2. 爬取单页数据

import requests
#数据请求
url='http://www./getPriceData.html'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'}

dat = {'limit''20',
    'current':'1',
    'pubDateStartTime''',
    'pubDateEndTime':'' ,
    'prodPcatid''',
    'prodCatid':'' ,
    'prodName':'' }#表单提交获取第一页信息
resp = requests.post(url,headers=headers,data=dat)
#写入csv文件
import csv

header = ['id''prodName''prodCatid''prodCat''prodPcatid''prodPcat''lowPrice''highPrice''avgPrice''place''specInfo''unitInfo''pubDate''status''userIdCreate''userIdModified''userCreate''userModified''gmtCreate''gmtModified'#数据列名
# test.csv表示如果在当前目录下没有此文件的话,则创建一个csv文件
# “w”表示在写入之前会清空原文件中的数据
# newline是数据之间不加空行
# encoding='utf-8-sig'表示编码格式为utf-8-sig,防止打开csv文件出现中文乱码
with open('test.csv''w', newline='',encoding='utf-8-sig'as f: 
    writer = csv.DictWriter(f,fieldnames=header) # 提前预览列名,当下面代码写入数据时,会将其一一对应。
    writer.writeheader()  # 写入列名
    writer.writerows(resp.json()['list']) # 写入数据

检查test文件当中的内容,数据成功写入。

3. 爬取指定页面数据

前面只是爬取了一页的内容,后面我们将代码进行整合,用循环语句实现多页面的爬取与存储。

import requests
import csv

url='http://www./getPriceData.html'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27'}
dic =  list()#定义一个空列表
for page in range(1,10):
    dat = {'limit''20',
        'current':page,
        'pubDateStartTime''',
        'pubDateEndTime':'' ,
        'prodPcatid''',
        'prodCatid':'' ,
        'prodName':'' }
    resp = requests.post(url,headers=headers,data=dat)
    dic.extend(resp.json()['list'])#将新的内容添加到列表当中
print(f'page{page}数据获取完毕')

header = ['id''prodName''prodCatid''prodCat''prodPcatid''prodPcat''lowPrice''highPrice''avgPrice''place''specInfo''unitInfo''pubDate''status''userIdCreate''userIdModified''userCreate''userModified''gmtCreate''gmtModified'#数据列名

# test.csv表示如果在当前目录下没有此文件的话,则创建一个csv文件
# a表示以“追加”的形式写入,如果是“w”的话,表示在写入之前会清空原文件中的数据
# newline是数据之间不加空行
# encoding='utf-8'表示编码格式为utf-8,如果不希望在excel中打开csv文件出现中文乱码的话,将其去掉不写也行。
with open('test.csv''w', newline='',encoding='utf-8-sig'as f: 
    writer = csv.DictWriter(f,fieldnames=header) # 提前预览列名,当下面代码写入数据时,会将其一一对应。
    writer.writeheader()  # 写入列名
    writer.writerows(dic) # 写入数据

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多