第一次对scrapy做了简单的了解并且使用scrapy实战爬取了B站单页小姐姐视频信息。详情如下:
第二次使用scrapy翻页爬取了糗事百科13页的段子信息
目标获取
今天我们使用scrapy爬取北京瓜果蔬菜单价并将其存入数据库MongoDB
网站首页如下图:
我们要获取的目标有瓜果蔬菜的
名称、最低价、最高价、均价、产地还有价格发布时间等
spider爬虫
首先我们建立scrapy项目
建立完毕结构图如下:
网页分析
F12打开网页源码,如下这是一个POST请求的网页,
分页参数由limit控制,页面显示由current控制
并且每页链接都是相同的,变化的只有分页参数limit。
所以我们可以构造一个请求url:
forpageinrange(1,50+1):
url =f'http://www.xinfadi.com.cn/getPriceData.html?limit=20¤t={page}'
并且我们请求的数据是json结构,如下:
所有的内容都在如下list列表中
发送请求
我们先来打印浏览器响应数据
ic(response.text)
结果如下,成功打印出了json结构的全部信息
但是我们需要的数据都在json结构的list列表中,所以还需要对请求到的数据进一步处理,获取list
# 获取蔬菜列表
veg_list = response.json()['list']
ic(veg_list)
list结构数据打印如下:
分析至此所有的信息都以获取到,接下来我们要做的就是提取我们要获取的数据
名称、最低价、最高价、均价、产地还有价格发布时间等
forveginveg_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格式
# 保存文件到本地
withopen('./北京菜价.json','a+', encoding='utf-8')asf:
lines = json.dumps(dict(item), ensure_ascii=False) +'\n'
f.write(lines)
每页20条数据,50页攻击1000条数据如下:
存入MongoDB
MongoDB的安装之前专门拉出来一节单独讲的,需要的小伙伴可以看一下
这里我们在setting中引入MongoDB。名称如下:
mongo_host ='127.0.0.1'
mongo_port =27017
mongo_db_name ='beijing'
mongo_db_collection ='beijing_price'
数据查询如下:
网友评论