本文章仅供学习参考
爬取工具选择
由于淘宝页面使用动态ajax加载,所以本文则是通过访问ajax接口获取数据,然后进行数据的解析,并存入sqlite数据库中。
1、api接口的查找
1.首先打开淘宝网首页,然后点击F12,打开开发者工具,点击XHR选项。
2.搜索所需要的关键字。本文就以“python”为例。然后点击搜索按钮。
3.然后点击这个api,查看返回的数据,以及数据类型等。
4.可以得出此接口返回数据即为所需要的数据。然后查看该接口的访问方式,以及传递的参数。点击开发者工具中的Headers
5.此接口的请求方式为GET请求。每次返回12条数据。Query String Parameters为get请求时传递的参数。
_ksTS: 前边为时间戳*1000保留整数部分_接口的代码
callback:访问接口时的回调函数
q: 查询的关键字
s: 返回的第一条数据的id
2、构建GET请求参数
由于每次返回12条数据,故设置s=0,s=12,s=24,依次加12,即可返回所有数据。
import requests
api = "https://s.taobao.com/api"
#使用列表生成式生成5个参数。分别爬取0-11条。12-23条。24-35条。36-47条。48-59条数据
param_list = [{
"_ksTS": "1540389614948_238",
"callback": "jsonp239",
"ajax": "true",
"m": "customized",
"sourceId": "tb.index",
"q": 'python',
"spm": "a21bo.2017.201856-taobao-item.1",
"s": i * 12,
"imgfile": "",
"initiative_id": "tbindexz_20170306",
"bcoffset": -3,
"commend": "all",
"ie": "utf8",
"rn": "da98c7d373bd3730891cbdd5554f5d1a",
"ssid": "s5-e",
"search_type": "item",
} for i in range(5)]
3、发送GET请求。解析返回的数据,并存入数据库中
返回的数据格式如下
由于返回的数据不能使用json.loads直接解析出来。需要将返回数据的格式切割为json格式,再使用json.loads转为字典。然后将数据存入sqlite数据库中。
import re
import json
#连接sqlite数据库
conn = sqlite3.connect('taobao.db')
cursor = conn.cursor()
#创建taobaopy表
cursor.execute(
'create table taobaopy (id INTEGER PRIMARY KEY AUTOINCREMENT,title varchar(50),price varchar(20),loc varchar(20),sales varchar(20),comments varchar(20))')
for param in param_list:
response = requests.get(api, params=param)
response_str = response.text
res = re.findall(r'{"API.*', response_str)
s = res[0]
s1 = s.rsplit(');')
s2 = s1[0]
response_str_js = json.loads(s2)
detals = response_str_js["API.CustomizedApi"]['itemlist']['auctions']
for detal in detals:
# 标题
title = detal['raw_title']
# 价格
price = detal['view_price']
# 地址
loc = detal['item_loc']
# 付款人数
sales = detal['view_sales']
# 评论数
comments = detal['comment_count']
sql = '''insert into taobaopy (title,price,loc,sales,comments) values("{}","{}","{}","{}","{}")'''.format(title,price,loc,sales,comments)
#执行sql语句
cursor.execute(sql)
#提交事务
conn.commit()
4、完整代码
import requests
import sqlite3
import re
import json
conn = sqlite3.connect('taobao.db')
cursor = conn.cursor()
cursor.execute(
'create table taobaopy (id INTEGER PRIMARY KEY AUTOINCREMENT,title varchar(50),price varchar(20),loc varchar(20),sales varchar(20),comments varchar(20))')
api = 'https://s.taobao.com/api'
param_list = [{
"_ksTS": "1540203319668_825",
"callback": "jsonp826",
"ajax": "true",
"m": "customized",
"sourceId": "tb.index",
"q": 'python',
"spm": "a21bo.2017.201856-taobao-item.1",
"s": i * 12,
"imgfile": "",
"initiative_id": "tbindexz_20170306",
"bcoffset": -3,
"commend": "all",
"ie": "utf8",
"rn": "da98c7d373bd3730891cbdd5554f5d1a",
"ssid": "s5-e",
"search_type": "item",
} for i in range(5)]
for param in param_list:
response = requests.get(api, params=param)
response_str = response.text
res = re.findall(r'{"API.*', response_str)
s = res[0]
s1 = s.rsplit(');')
s2 = s1[0]
response_str_js = json.loads(s2)
detals = response_str_js["API.CustomizedApi"]['itemlist']['auctions']
for detal in detals:
# 标题
title = detal['raw_title']
# 价格
price = detal['view_price']
# 地址
loc = detal['item_loc']
# 付款人数
sales = detal['view_sales']
# 评论数
comments = detal['comment_count']
sql = '''insert into taobaopy (title,price,loc,sales,comments) values("{}","{}","{}","{}","{}")'''.format(title,price,loc,sales,comments)
cursor.execute(sql)
conn.commit()
5、抓取数据效果图
一共抓取60条数据。如果需要更多数据,可在列表生成式中生成多个参数即可。