python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中

时间:2024-04-13 11:46:52

本文章仅供学习参考

爬取工具选择

由于淘宝页面使用动态ajax加载,所以本文则是通过访问ajax接口获取数据,然后进行数据的解析,并存入sqlite数据库中。

1、api接口的查找

1.首先打开淘宝网首页,然后点击F12,打开开发者工具,点击XHR选项。
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中

2.搜索所需要的关键字。本文就以“python”为例。然后点击搜索按钮。
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中
3.然后点击这个api,查看返回的数据,以及数据类型等。
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中
4.可以得出此接口返回数据即为所需要的数据。然后查看该接口的访问方式,以及传递的参数。点击开发者工具中的Headers
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中
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请求。解析返回的数据,并存入数据库中

返回的数据格式如下
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中
由于返回的数据不能使用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条数据。如果需要更多数据,可在列表生成式中生成多个参数即可。
python爬取淘宝指定商品价格及其他相关信息,并将其存入sqlite数据库中