对北京新发地当时菜品三十天内价格分布式爬取(1)---(获取当时菜品数据并构建请求数据推入redis)

对北京新发地当时菜品三十天内价格分布式爬取(1)---(获取当时菜品数据并构建请求数据推入redis)

码农世界 2024-06-05 前端 93 次浏览 0个评论

本次项目网页url

北京新发地: http://www.xinfadi.com.cn/priceDetail.html

我们首先创建一个爬虫用于收集url与请求的data然后b,c,d使用RedisCrawlSpider来对数据进行分布式爬取

在此篇中我们仅介绍爬虫a

一.获取当天所有菜品数据

这是一条请求的负载我们只需要对pubDateStartTime和pubDateEndTime进行更改就能够获取指定日期的菜品数据

i = datetime.datetime.now()
endtime=str(i.year)+'/'+"{:02d}".format(i.month)+'/'+"{:02d}".format(i.day)

这两行代码将获取今日日期并将其格式化为我们需要的格式

我们已经搞定了data现在我们发送请求分析数据

data1={
'limit': '20',
'current': '1',
'pubDateStartTime': starttime,
'pubDateEndTime': endtime,
'prodPcatid': '',
'prodCatid': '',
'prodName': ''
}
category = requests.post("http://www.xinfadi.com.cn/getPriceData.html",data=data1).json()

我们将获取到这些数据我们看到只有20条因为我们data中的limit设置为20

在返回的数据中我们可以发现count: 487意味着所有数据为487条所以我们只需要将data中的limit修改为count即可一次请求获取全部数据

二.构建请求用的json数据包并推入redis

我们在上一步已经获取了当日所以菜品信息

这是我们对大白菜三十天内价格信息进去请求的data其中我们只需要更改limit,time及prodname就可获取我们想要的数据

urls='http://www.xinfadi.com.cn/getPriceData.html'
for i in result["list"]:
    print(i)
    form_data={
        "limit": "999",
        "current": "1",
        "pubDateStartTime":f"{histytime}",
        "pubDateEndTime":f"{endtime}",
    "prodPcatid":"",
    "prodCatid":"",
    "prodName":f"{i['prodName']}"
    }
    dict={"url":f"{urls}","form_data":f"{json.dumps(form_data)}","meta":""}
    v = r.lpush('xinfadi',json.dumps(dict) )

3.源码

import datetime
import json
import requests
import redis
# 建立Redis 链接
r = redis.Redis(host='localhost', port=6379, db=0)
i = datetime.datetime.now()
s=i+datetime.timedelta(days=-1)
h=i+datetime.timedelta(days=-30)
endtime=str(i.year)+'/'+"{:02d}".format(i.month)+'/'+"{:02d}".format(i.day)
starttime=str(s.year)+'/'+"{:02d}".format(s.month)+'/'+"{:02d}".format(s.day)
histytime=str(h.year)+'/'+"{:02d}".format(h.month)+'/'+"{:02d}".format(h.day)
print(starttime,endtime)
data1={
'limit': '20',
'current': '1',
'pubDateStartTime': starttime,
'pubDateEndTime': endtime,
'prodPcatid': '',
'prodCatid': '',
'prodName': ''
}
category = requests.post("http://www.xinfadi.com.cn/getPriceData.html",data=data1).json()
number=category["count"]
print(number)
data1["limit"]=number
result=requests.post("http://www.xinfadi.com.cn/getPriceData.html",data=data1).json()
#print(result)
urls='http://www.xinfadi.com.cn/getPriceData.html'
for i in result["list"]:
    print(i)
    form_data={
        "limit": "999",
        "current": "1",
        "pubDateStartTime":f"{histytime}",
        "pubDateEndTime":f"{endtime}",
    "prodPcatid":"",
    "prodCatid":"",
    "prodName":f"{i['prodName']}"
    }
    dict={"url":f"{urls}","form_data":f"{json.dumps(form_data)}","meta":""}
    v = r.lpush('xinfadi',json.dumps(dict) )

转载请注明来自码农世界,本文标题:《对北京新发地当时菜品三十天内价格分布式爬取(1)---(获取当时菜品数据并构建请求数据推入redis)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,93人围观)参与讨论

还没有评论,来说两句吧...

Top