本编博客是关于爬取天猫店铺中指定店铺的所有商品基础信息的爬虫,爬虫运行只需要输入相应店铺的域名名称即可,信息将以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 库是正则,主要用来提取信息

datetime 和 time 都是时间库,前者一般用来生成当前时间字符串,后者本爬虫使用设置延迟时间

爬虫思路

首先通过分析手机端天猫店铺所有商品的网页,可以发现每次下滑一页都有一个 js 被加载,这个 js 的规律可以总结一下;

通过分析可以发现每次请求 js 都可以得到一个关键信息,那就是 total_page 这个参数,这也一想就能猜到,就是当前店铺的总页码数,所以可以先取得这个数字,然后使用循环爬取全店商品;

每一页有24个商品,而请求得到的是一个类似于 json 格式的网页信息,但是并非是直接的 json,所以可以用正则表达式提取符合 json 格式的部分留用;

将每一页的信息保存到 csv 表格中,可以直接使用 csv 库的字典存储方式,非常方便;

得到了单页的信息,也得到了总页码数,只需要一个循环就可以爬取全店的商品了。

构造爬虫类

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爬虫爬商品库存_利用Python爬虫爬取指定天猫店铺全店商品信息相关推荐

  1. 利用Python爬虫爬取指定天猫店铺全店商品信息

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

  2. Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息

    Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息-Selenium 1. 本文目标 由于淘宝网站的不断更新,以前的爬取方法都无法重现,必须需要登录淘宝网站才可以进行搜索商品.所 ...

  3. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  4. python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  5. python爬虫新闻热点_利用Python网络爬虫技术追踪时事热点

    龙源期刊网 http://www.qikan.com.cn 利用 Python 网络爬虫技术追踪时事热点 作者:廖泽龙 王昊源 刘紫嫣

  6. python爬虫好友聊天记录_利用Python网络爬虫抓取微信好友的签名及其可视化展示...

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  7. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(二)

    今天继续新的专题.主要讲解[利用PYTHON制作桌面版爬虫软件]下的如何实现界面功能(一).该讲主要包括以下三个内容:掌握如何编写主函数,运行界面. 了解pywin32模块. 如何用python识别Q ...

  8. python爬虫好友图片_利用Python网络爬虫抓取微信好友的签名及其可视化展示

    前几天给大家分享了如何利用Python词云和wordart可视化工具对朋友圈数据进行可视化,利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例,以及利用Python网络爬虫抓取微信好友的所 ...

  9. python自动排课表_利用python爬取广西科技大学教务管理信息系统班级课表

    操作环境 python 3.6.1 pycharm 5.0.3 WampServer 3.0.6 windows 8(64位) 特点 1.中途退出程序或者断网之后重连再次运行不会抓取到重复的课程表 2 ...

最新文章

  1. 前端性能优化-HTTP添加Expires头和Cache-Control
  2. 程序员面试题精选100题(36)-在字符串中删除特定的字符[算法]
  3. 手机卫士09_应用程序四种查看_ListView小标题_进程管理
  4. 【Elasticsearch】elasticsearch 7.x 查看分片未分配 (UNASSIGNED) 的原因
  5. Bracket Sequences Concatenation Problem括号序列拼接问题(栈+map+思维)
  6. hbase jdbc相关
  7. Python安装时报缺少DLL的解决办法
  8. python时间格式转换format_【参考】Python日期时间转换与格式化
  9. 小米研发类Kindle电子阅读器
  10. CART决策树python实现
  11. CSS:border的属性
  12. 《百家讲坛》之战国七雄
  13. 转:时域错误隐藏个人理解_Phinex的博客_雅虎博客_雅虎空间
  14. 用Python做一个变态版的《超级玛丽》游戏
  15. global value supply chain白皮书
  16. 罗尔定理、拉格朗日中值定理和柯西中值定理和用他们证明不等式、
  17. vue中脚手架设置自动打开浏览器打开后地址为http://0.0.0.0:8080/
  18. (轉貼) 千頭萬緒 : 學習多執行緒程式設計的好書 (.NET) (Java)
  19. C51学习笔记 9.蜂鸣器
  20. macOS终端颜色的设定方法与说明:CLICOLOR与LSCOLORS

热门文章

  1. 12 种经典亿级流量架构之资源隔离思想与方法论
  2. Groovy的基础语法
  3. 数据结构拾遗(1) --红黑树的设计与实现(上)
  4. 一个文章表的 MySQL 索引怎么建立合理
  5. 浙江省2018年高等数学竞赛工科类试题
  6. codevs——1036 商务旅行
  7. Spring4.2+quartz2.2集群
  8. leetcode - Interleaving String
  9. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?...
  10. 创建ASM With Oracle 10g