以北京大黄瓜为例,手把手教你使用scrapy抓取数据并存入MongoDB!

共 6765字,需浏览 14分钟

 ·

2021-09-15 14:51

↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包


目标获取



今天我们使用scrapy爬取北京瓜果蔬菜单价并将其存入数据库MongoDB
网站首页如下图:


我们要获取的目标有瓜果蔬菜的
名称、最低价、最高价、均价、产地还有价格发布时间等


spider爬虫


首先我们建立scrapy项目




建立完毕结构图如下:





网页分析


F12打开网页源码,如下这是一个POST请求的网页,

    分页参数由limit控制,页面显示由current控制


并且每页链接都是相同的,变化的只有分页参数limit。

所以我们可以构造一个请求url:

    for page in range(150+1):
        url = f'http://www.xinfadi.com.cn/getPriceData.html?limit=20&current={page}'



并且我们请求的数据是json结构,如下:

所有的内容都在如下list列表中





发送请求


我们先来打印浏览器响应数据

ic(response.text)


结果如下,成功打印出了json结构的全部信息




但是我们需要的数据都在json结构的list列表中,所以还需要对请求到的数据进一步处理,获取list


    # 获取蔬菜列表
    veg_list = response.json()['list']
    ic(veg_list)


list结构数据打印如下:




分析至此所有的信息都以获取到,接下来我们要做的就是提取我们要获取的数据

名称、最低价、最高价、均价、产地还有价格发布时间等


for veg in veg_list:
    # 实例化scrapy对象
    item = BjXinfaItem()

    # 蔬菜名称
    item['prodName'] = veg['prodName']

    # 最低价格
    item['lowPrice'] = veg['lowPrice']

    # 最高价格
    item['highPrice'] = veg['highPrice']

    # 平均价格
    item['avgPrice'] = veg['avgPrice']

    # 产地
    item['origin'] = veg['place']

    # 日期
    rlsDate = veg['pubDate']
    item['rlsDate'] = ''.join(rlsDate).split(' ')[0]
    
    '''
    ic| item: {'avgPrice': '0.43',
           'highPrice': '0.45',
           'lowPrice': '0.4',
           'origin': '冀',
           'prodName': '大白菜',
           'rlsDate': '2021-09-11'}
    ic| item: {'avgPrice': '0.7',
               'highPrice': '0.8',
               'lowPrice': '0.6',
               'origin': '冀',
               'prodName': '娃娃菜',
               'rlsDate': '2021-09-11'}
    ic| item: {'avgPrice': '1.0',
               'highPrice': '1.2',
               'lowPrice': '0.8',
               'origin': '',
               'prodName': '小白菜',
               'rlsDate': '2021-09-11'}
    ic| item: {'avgPrice': '0.8',
               'highPrice': '1.0',
               'lowPrice': '0.6',
               'origin': '冀',
               'prodName': '圆白菜',
               'rlsDate': '2021-09-11'}
    ic| item: {'avgPrice': '0.65',
               'highPrice': '0.7',
               'lowPrice': '0.6',
               'origin': '冀',
               'prodName': '紫甘蓝',
               'rlsDate': '2021-09-11'}
    ic| item: {'avgPrice': '1.2',
               'highPrice': '1.5',
               'lowPrice': '0.9',
               'origin': '冀',
               'prodName': '芹菜',
               'rlsDate': '2021-09-11'}
    '''



存入数据


当我们要把数据保存成文件的时候,不需要任何额外的代码,只要执行如下代码即可:


scrapy crawl spider爬虫名 -o xxx.json      #保存为JSON文件

scrapy crawl spider爬虫名 -o xxx.jl或jsonlines    #每个Item输出一行json

scrapy crawl spider爬虫名 -o xxx.csv          #保存为csv文件

scrapy crawl spider爬虫名 -o xxx.xml #保存为xml文件


想要保存为什么格式的文件,只要修改后缀就可以了,在这里我就不一一例举了。


我们在此将其保存为json格式

# 保存文件到本地
    with open('./北京菜价.json''a+', encoding='utf-8'as f:
        lines = json.dumps(dict(item), ensure_ascii=False) + '\n'
        f.write(lines)


每页20条数据,50页攻击1000条数据如下:





存入MongoDB


MongoDB的安装之前专门拉出来一节单独讲的,需要的小伙伴可以看一下

Python也能操作MongoDB数据库!


这里我们在setting中引入MongoDB。名称如下

mongo_host = '127.0.0.1'
mongo_port = 27017
mongo_db_name = 'beijing'
mongo_db_collection = 'beijing_price'


数据查询如下:



- END -

推荐阅读

  1. 个个年薪都五十万的数据分析师,是真的吗?

  2. 打架打出来的牛逼城市!

  3. 985高校的学生“夫妻宿舍”令人羡慕,网友:这福利心动了,我要去读博!

  4. 微软这个太强了


推荐一个公众号,帮助程序员自学与成长

觉得还不错就给我一个小小的鼓励吧!



浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报