继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

爬爬更健康

KenNaNa
关注TA
已关注
手记 63
粉丝 23
获赞 130

爬虫的定义

是一种按照一定规范自动获取网络信息的程序或脚本。
简单来说,网络爬虫就是根据一定的算法实现编程开发,
主要通过URL实现数据的抓取和发掘。

我们先来解决一下前置知识,本爬虫会用到以下库

  1. requests 是一个很实用Python的一个很实用的HTTP客户端,可以满足如今爬虫的需要
  2. json 用于数据的处理
  3. csv 用于数据的储存

分析说明

爬取淘宝商品的信息,数据主要用于分析市场趋势,从而制定一系列营销方案。实现功能如下:

  1. 使用者提供关键字,利用淘宝搜索功能获取搜索后的数据
  2. 获取商品信息:标题,价格,销量,店铺所在区域
  3. 数据以文件格式存储

功能实现依次体现了爬虫的开发流程:爬虫规则->数据清洗->数据存储。

使用谷歌浏览器进入淘宝网站,利用搜索的功能输入‘四件套’关键字,
使用浏览器的调试功能捕捉信息,如果在响应的HTML中找不到数据,
那么可能数据是通过Ajax请求后台的,再通过前端渲染到页面上去的,
单击XHR,发送一个请求,查看数据请求信息

接下来,我们单击Preview查看该URL的响应数据格式,
发现数据是JSON格式的,商品的标题,价格,销量,店铺名称和店铺所在地点
分别对应的数据为raw_title,view_price,view_sales,nick,item_loc

我们把它的请求链接拿出来研究一下

https://s.taobao.com/api?_ksTS=1540176287763_226&callback=jsonp227&ajax=true&m=customized&sourceId=tb.index&_input_charset=utf-8&bcoffset=-1&commend=all&suggest=history_1&source=suggest&search_type=item&ssid=s5-e&suggest_query=&spm=a21bo.2017.201856-taobao-item.2&q=四件套&s=36&initiative_id=tbindexz_20170306&imgfile=&wq=&ie=utf8&rn=9e6055e3af9ce03b743aa131279aacfd

我们可以把这个长长的链接简化一下

https://s.taobao.com/api?callback=jsonp227&m=customized&q=%E5%9B%9B%E4%BB%B6%E5%A5%97&s=36

从简化后的URL看出,有两个参数可以动态设置来获取不同的商品

  1. q = 四件套 这个是搜索的关键字
  2. s = 36 这个是页数设置,

功能实现

根据对网站的分析获取单个关键字搜索的单页商品信息,
代码如下:

import requests
import json
url = "https://s.taobao.com/api?callback=jsonp227&m=customized&q=四件套&s=36"
r = requests.get(url)
response = r.text
# 截取成标准的JSON格式
# 由于Ajax返回的数据是字符串格式的饿,在返回的值jsonp227(XXX)中
# XXX部分是JSON格式数据,因此先用字符串split()截取XXX部分,
#然后将XXX部分由字符串格式转成JSON格式的数据读取
response = response.split('(')[1].split(')')[0]
# 读取JSON
response_dict = json.loads(response)
# 定位到商品信息列表
response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

如果想要获取多页数据,可以在上述的代码中加入一个循环,实现代码如下:

for p in range(88):
	url = "https://s.taobao.com/api?callback=jsonp227&m=customized&q=四件套&s=%s" % (p)
	r = requests.get(url)
	# 获取响应信息字符串
	response = r.text
	# 转换成JSON格式
	response = response.split('(')[1].split(')')[0]
	# 加载数据
	response_dict = json.loads(response)
	# 商品信息
	response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

上述代码只能获取单个关键字搜索的商品信息,
如果要实现多个关键字的功能呢,就可以在上述代码中在多加一个循环,代码如下:

for k in ['四件套','手机壳']:
    for p in range(88):
		url = "https://s.taobao.com/api?callback=jsonp227&m=customized&q=%s&s=%s" % (k,p)
		r = requests.get(url)
    	response = r.text
		response = response.split('(')[1].split(')')[0]
		response_dict = json.loads(response)
		# 商品信息
		response_auctions_info = response_dict['API.CustomizedApi']['itemlist']['auctions']

数据存储

我们以CSV文件的格式存储数据,我们来定义一个函数,传入参数
分别为response_auctions_info数据集合信息,
file_name保存的文件名:

def get_auctions_info(response_auctions_info,file_name):
	with open(file_name,'a',newline='') as csvfile:
		# 生成CSV对象,用于写入CSV文件
		writer = csv.writer(csvfile)
		for i in response_auctions_info:
			# 判断是否数据已经记录
			if str(i['raw_title']) not in auctions_distinct:
				# 写入数据
				# 分别是商品信息列表和CSV文件路径。
				# 但该文件并没有对CSV设置表头,所以在开始获取数据之前。
				# 应该生成对应CSV文件,并设定其表头
				writer.writerrow([i['raw_title'],i['view_price'],i['view_sales'],i['nick'],i['item_loc']])

				auctions_distinct.append(str(i['raw_title']))
		csvfile.close()

总结

  1. 去除无用的链接的参数,简化链接
  2. 分析URL的请求参数含义以及响应内容的数据规律
  3. 数据储存的去重判断
  4. 获取完整代码请扫码回复 “四件套”
  5. 扫码回复 加群
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP