本编博客是关于爬取天猫店铺中指定店铺的所有商品基础信息的爬虫,爬虫运行只需要输入相应店铺的域名名称即可,信息将以csv表格的形式保存,可以单店爬取也可以增加一个循环进行同时爬取。

源码展示

首先还是完整代码展示,后面会分解每个函数的意义。

# -*- coding: utf-8 -*-
import requests
import json
import csv
import random
import re
from datetime import datetime
import time class TM_producs(object):
def __init__(self,storename):
self.storename = storename
self.url = 'https://{}.m.tmall.com'.format(storename)
self.headers = {
"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 "
"(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
}
datenum = datetime.now().strftime('%Y%m%d%H%M')
self.filename = '{}_{}.csv'.format(self.storename, datenum)
self.get_file() def get_file(self):
'''创建一个含有标题的表格'''
title = ['item_id','price','quantity','sold','title','totalSoldQuantity','url','img']
with open(self.filename,'w',newline='') as f:
writer = csv.DictWriter(f,fieldnames=title)
writer.writeheader()
return def get_totalpage(self):
'''提取总页码数'''
num = random.randint(83739921,87739530)
endurl = '/shop/shop_auction_search.do?sort=s&p=1&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'
url = self.url + endurl.format(num)
html = requests.get(url,headers=self.headers).text
infos = re.findall('\(({.*})\)',html)[0]
infos = json.loads(infos)
totalpage = infos.get('total_page')
return int(totalpage) def get_products(self,page):
'''提取单页商品列表'''
num = random.randint(83739921, 87739530)
endurl = '/shop/shop_auction_search.do?sort=s&p={}&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'
url = self.url + endurl.format(page,num)
html = requests.get(url, headers=self.headers).text
infos = re.findall('\(({.*})\)', html)[0]
infos = json.loads(infos)
products = infos.get('items')
title = ['item_id', 'price', 'quantity', 'sold', 'title', 'totalSoldQuantity', 'url', 'img']
with open(self.filename, 'a', newline='') as f:
writer = csv.DictWriter(f, fieldnames=title)
writer.writerows(products) def main(self):
'''循环爬取所有页面宝贝'''
total_page = self.get_totalpage()
for i in range(1,total_page+1):
self.get_products(i)
print('总计{}页商品,已经提取第{}页'.format(total_page,i))
time.sleep(1+random.random()) if __name__ == '__main__':
storename = 'uniqlo'
tm = TM_producs(storename)
tm.main()

上面代码是选择了优衣库作为测试店铺,直接输入优衣库店铺的域名中关键词即可,最终表格会按照店铺名称和时间名词。

代码解读

导入库说明

  • requests 库不用多数,爬取网页的主要库
  • json 库是用来解析 json 格式的数据的,也就是 Python 中的字典格式
  • csv 库是用来创建 csv 表格和保存信息的
  • random 库是用来生成一个随机数的,这个代码中用到了两次,第一次是生成一个随机数据去获取最新的网页信息而不是缓存信息,第二次是随机一个时间,来减缓爬虫速度
  • re 库是正则,主要用来提取信息
  • datetimetime 都是时间库,前者一般用来生成当前时间字符串,后者本爬虫使用设置延迟时间

爬虫思路

  1. 首先通过分析手机端天猫店铺所有商品的网页,可以发现每次下滑一页都有一个 js 被加载,这个 js 的规律可以总结一下;
  2. 通过分析可以发现每次请求 js 都可以得到一个关键信息,那就是 total_page 这个参数,这也一想就能猜到,就是当前店铺的总页码数,所以可以先取得这个数字,然后使用循环爬取全店商品;
  3. 每一页有24个商品,而请求得到的是一个类似于 json 格式的网页信息,但是并非是直接的 json,所以可以用正则表达式提取符合 json 格式的部分留用;
  4. 将每一页的信息保存到 csv 表格中,可以直接使用 csv 库的字典存储方式,非常方便;
  5. 得到了单页的信息,也得到了总页码数,只需要一个循环就可以爬取全店的商品了。

构造爬虫类

def __init__(self,storename):
self.storename = storename
self.url = 'https://{}.m.tmall.com'.format(storename)
self.headers = {
"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 "
"(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"
}
datenum = datetime.now().strftime('%Y%m%d%H%M')
self.filename = '{}_{}.csv'.format(self.storename, datenum)
self.get_file()

上面代码依次完成以下操作:

  • 首先整个爬虫是写成了一个类,在初始化类的时候需要传递一个参数,这个参数就是店铺的名称。
  • 然后构造出店铺的所有商品页面的前半部分,这部分都是不会变的
  • 接着设置一个请求头
  • 按照当前时间生成一个以时间为依据的字符串,用来给文件命名,然后赋值给文件名称,确定保存文件的名称
  • 最后一句是在类生成的时候就运行这个函数,及生成一个带有标题的表格,后面会说道这个函数的具体含义

创建表格


def get_file(self):
'''创建一个含有标题的表格'''
title = ['item_id','price','quantity','sold','title','totalSoldQuantity','url','img']
with open(self.filename,'w',newline='') as f:
writer = csv.DictWriter(f,fieldnames=title)
writer.writeheader()
return

这个函数的用意是创建一个带有标题的表格,标题就是提取的网页信息中的 key,这个必须跟需要提取的参数保持一致。关于 csv 库按照字典格式保存信息的方式可以参考之前的一篇文章 Python 内置 csv 模块简介,使用三种方式写入 csv 表格

提取总页码数

def get_totalpage(self):
'''提取总页码数'''
num = random.randint(83739921,87739530)
endurl = '/shop/shop_auction_search.do?sort=s&p=1&page_size=12&from=h5&ajson=1&_tm_source=tmallsearch&callback=jsonp_{}'
url = self.url + endurl.format(num)
html = requests.get(url,headers=self.headers).text
infos = re.findall('\(({.*})\)',html)[0]
infos = json.loads(infos)
totalpage = infos.get('total_page')
return int(totalpage)

这个函数其实跟提取信息的函数是一样的,只不过需要提取的信息不一样而已,这个函数只需要提取总页码数。具体步骤是先构造出每页请求的URL,这个需要自己去总结一个最简约的链接形式,并且尽可能模仿人工浏览。

请求网页会得到一个类似于 json 的信息,但是不是纯 json ,因此需要使用正则来处理一下,然后需要用到 json 库来转换格式为真正的 json 格式。

提取单页的信息

def get_products(self,page) 的用法是跟提取总页码数一样的,只不过这个需要传入一个参数,也就是需要爬取的页码数,这样就可以改变 URL 从而爬取对应的页码的信息了。

最后提取每页的信息在 json 中是形成一个列表的形式,而每个列表又是一个字典,所以可以直接使用 csv 的多行写入的方法去保存信息。

循环爬取全店商品


def main(self):
'''循环爬取所有页面宝贝'''
total_page = self.get_totalpage()
for i in range(1,total_page+1):
self.get_products(i)
print('总计{}页商品,已经提取第{}页'.format(total_page,i))
time.sleep(1+random.random())

最后一个函数就是使用循环的方式去爬取所有页面的信息并保存了,同时可以在每次爬完一页之后打印一句话作为提示,并且为了尽可能的减少IP被封的可能性,可以适当的增加一下爬取延迟。

利用Python爬虫爬取指定天猫店铺全店商品信息的更多相关文章

  1. 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

    项目内容 本案例选择>> 商品类目:沙发: 数量:共100页  4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...

  2. 如何利用python爬虫爬取爱奇艺VIP电影?

    环境:windows    python3.7 思路: 1.先选取你要爬取的电影 2.用vip解析工具解析,获取地址 3.写好脚本,下载片断 4.将片断利用电脑合成 需要的python模块: ##第一 ...

  3. 一个简单的定向python爬虫爬取指定页面的jpg图片

    import requests as r import re resul=r.get("http://www.imooc.com/course/list") urlinfo=re. ...

  4. 利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移博文到Hexo等静态博客

    文章目录 功能 爬取的方式: 设置生成的md文件命名规则: 设置md文件的头部信息 是否显示csdn中的锚点"文章目录"字样,以及下面具体的锚点 默认false(因为csdn中是集 ...

  5. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  6. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  7. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  8. Python爬虫|爬取喜马拉雅音频

    "GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...

  9. python爬虫爬取内容中,-xa0,-u3000的含义

    python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310

随机推荐

  1. .NET之类型转换

    说起类型转换大家很容易的就会联想到将int类型转换成float类型或者是将double类型转转成int类型之类的转换.当然这可能是大多数人最先接触到的转换方式,也是最简单的转换方式.所谓转换就是从现有 ...

  2. synchoronized和lock区别

    synchoronized是JVM的内置锁,而lock是Java代码实现的.lock是sync对的扩展,完全可以替代后者.lock可以重入,允许同一个线程连续多次获得同一把锁.其次,lock独有的功能 ...

  3. 2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

    链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀 ...

  4. Bzoj2164 采矿(线段树+树链剖分)

    题面 Bzoj 题解 对于每个节点,我们可以用树链剖分和线段树维护以下信息: 单独在某个点分配\(i\)个人的最大收益(可以\(O(m)\)计算) 分配\(i\)的最大收益(可以\(O(m^2)\)计 ...

  5. Leaving Auction CF 749D

    题目:http://codeforces.com/problemset/problem/749/D 题目大意: 有n个人竞拍,也有n个叫牌,一个人可以有多个叫价牌,但也可能有一些人根本不叫价 每个叫牌 ...

  6. iOS Sprite Kit教程之编写程序以及Xcode的介绍

    iOS Sprite Kit教程之编写程序以及Xcode的介绍 Xcode界面介绍 一个Xcode项目由很多的文件组成,例如代码文件.资源文件等.Xcode会帮助开发者对这些文件进行管理.所以,Xco ...

  7. Python处理海量数据的实战研究

    最近看了July的一些关于Java处理海量数据的问题研究,深有感触,链接:http://blog.csdn.net/v_july_v/article/details/6685962 感谢July ^_ ...

  8. 【WIN10】文本圖標

    在Storyboard動畫板中,我使用文本顯示了一個“心”形.在這裡,我將介紹一下文本圖標. 1.Segoe MDL2 Assets 首先,它必須使用字體:Segoe MDL2 Assets 其次,它 ...

  9. BZOJ1597 USACO2008土地购买

    斜率优化DP. #include<bits/stdc++.h> using namespace std; ; long long f[N],n,cnt,q[N]; ; bool v[N]; ...

  10. 【SPFA】POJ1511-Invitation Cards

    [题目大意] 给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和. [思路] 毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态 ...