python 简单实现淘宝关键字商品爬取
本文有2个文件
1:taobao_re_xpath
2:taobao_re_xpath_setting
#
1:taobao_re_xpath
# -*- coding:utf-8 -*-
# author : yesehngbao
# time:2018/3/20 import os
import requests
import re
import json
import pymongo
import hashlib from taobao_re_xpath_setting import *
from multiprocessing import Pool
from lxml import etree dirname = DIRNAME
if not os.path.exists(dirname):
os.mkdir(dirname) dirname1 = DIRNAME1
if not os.path.exists(dirname+'/'+dirname1):
os.mkdir(dirname+'/'+dirname1) dirname2 = DIRNAME2
if not os.path.exists(dirname+'/'+dirname2):
os.mkdir(dirname+'/'+dirname2) dirname3 = DIRNAME3
if not os.path.exists(dirname+'/'+dirname3):
os.mkdir(dirname+'/'+dirname3) url = 'https://s.taobao.com/search' headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/64.0.3282.186 Safari/537.36"} def md5(strs):
strs = strs + '12sdwz..'
strs = hashlib.md5(strs.encode('utf-8'))
key = strs.hexdigest()
return key def get_html(page):
"""
获取('首页')
:param page: 获取的页数, q: 想获取的宝贝
:return:
"""
parmas = {
'q': '%s' % GOODS,
's': page,
}
respons = requests.get(url, headers=headers, params=parmas)
if respons.status_code == 200:
return respons.text
else:
return None def get_ajax_html():
"""
解析可能出现的ajax网页 """
ajax_url = 'https://s.taobao.com/api'
parmas = {
'_ksTS': 1521612082036_312,
'callback': 'jsonp267',
'ajax': 'true',
'm': 'customized',
'q': '%s' % GOODS,
's': 36,
'bcoffset': 0,
'rn': '4e1dc906143376f8d2e735536fd3ee0c'
}
respons = requests.get(ajax_url, headers=headers, params=parmas).text
comp = re.compile('jsonp\d+\((.*?)\)', re.S)
strs = re.findall(comp, respons)
if strs:
strs = json.loads(strs[0])
commdity_list = strs.get('API.CustomizedApi').get('itemlist').get('auctions')
if commdity_list:
for commdity in commdity_list:
addr = commdity.get('item_loc')
nick = commdity.get('nick')
sales = commdity.get('view_sales')
detail = 'http:' + commdity.get('detail_url')
yield {
'addr': addr,
'nick': nick,
'sales': sales,
'detail': detail,
} def analysis(html):
"""
解析列表页的数据
html:列表页源码
content : js中的数据和ajax数据 的列表 """
content = []
comp = re.compile('g_page_config = (.*?)g_srp_loadCss', re.S)
if comp:
strs = re.findall(comp, html)[0]
strs = strs.replace(';', '')
strs = json.loads(strs)
data = strs.get('mods').get('itemlist').get('data').get('auctions')
if data:
for i in data:
detail = i.get('detail_url')
if re.match('http', detail):
pass
else:
detail = 'http:'+detail
addr = i.get('item_loc')
nick = i.get('nick')
sales = i.get('view_sales')
item = {
'addr': addr,
'nick': nick,
'sales': sales,
'detail': detail,
}
content.append(item)
if len(data) < 44:
cont = get_ajax_html()
for i in cont:
content.append(i)
return content
else:
print(len(data))
return content
else:
return None
else:
return None def save_img(img_new, page):
"""
主图的下载
img_new : 主图地址 """ if img_new:
img_name = img_new[30:].replace('/', '-')
respons = requests.get(img_new, headers=headers).content
with open(dirname+'/'+dirname1+'/'+md5(img_name)+'.jpg', 'wb')as fp:
fp.write(respons)
return print('第%s页————' % page + '主图片保存完成: ', img_name) def save_color_img(color_url, page): """
颜色图的下载
color_url : 颜色图地址 """
if color_url:
img_name = color_url[30:].replace('/', '-')
respons = requests.get(color_url, headers=headers).content
with open(dirname + '/' + dirname2 + '/' + md5(img_name)+'.jpg', 'wb')as fp:
fp.write(respons)
return print('第%s页————' % page + 'color图片保存完成: ', img_name) def save_video(detail_url, title, page):
"""
视频的下载
url : 视频地址
title : 视频名字 """ if detail_url:
respons = requests.get(detail_url, headers=headers).content
with open(dirname+'/'+dirname3+'/' + md5(title)+'.mp4', 'wb') as fp:
fp.write(respons)
print('第%s页————' % page + '视频下载完成 :('+title+')')
return 'download_ok' def alaysis_detail(respons, page):
"""
获取详情页的图片, 颜色(类别)图, 视频
respons : 详情页源码
doc : xpath解析对象
img_new : 图片地址
color_url : 颜色图地址
video_new : 视频地址
""" # 主图 if page == 0:
page = 1
else:
page = page // 44 + 1
doc = etree.HTML(respons)
li_list = doc.xpath('.//ul[@class="tb-clearfix" or @id="J_UlThumb"]/li')
for li in li_list:
img_old = li.xpath('./a/img/@src')
if img_old:
img_old = img_old[0]
img_new = img_old[-15:].replace('', '')
img_new = 'http:'+img_old[:-15]+img_new
save_img(img_new, page) else:
pass # 颜色(类别)图 compi = re.compile('style="background:url\((.*?)\)')
color_img = re.findall(compi, respons)
for color in color_img:
if color:
color_url = color[-15:].replace('', '').replace('', '')
color_url = 'http:'+color[:-15]+color_url
save_color_img(color_url, page) # 获取视频 comp = re.compile('TShop.Setup\(\s(.*?)\s\)', re.S)
strs = re.findall(comp, respons)
if strs:
strs = json.loads(strs[0])
video_lod = strs.get('itemDO').get('imgVedioUrl')
if video_lod:
video_new = video_lod.replace('e/1', 'e/6').replace('t/8', 't/1')
title = strs.get('itemDO').get('title')
save_video('http:'+video_new, title, page) else:
return '无视频'
else:
return '无视频(或有加密)'
return '下载完成' def get_detail(content, page):
"""
获取详情页信息
content: 列表页数据
detail_url : 详情页入口 """
if content:
for cont in content:
detail_url = cont.get('detail')
respons = requests.get(detail_url, headers=headers)
if respons.status_code == 200:
alaysis_detail(respons.text, page)
else:
print(respons.status_code)
return '详情页爬取完成' def save_mongo(content):
"""
实现保存列表页的数据
content: 列表页数据
"""
mongo_client = pymongo.MongoClient(host=MONGO_HOST, port=MONGO_PORT)
db = mongo_client[MONGO_DB]
coll = db[MONGO_COLL]
coll.insert(content)
print('数据保存成功: ', content, len(content))
return None def main(page): """
此程序为了爬取淘宝宝贝而生,可以获得宝贝图片,店面,地址,信息,视频等。。
page :获取列表页的数量
html :获取列表页的源码
content : 列表页宝贝的详细信息和地址
""" html = get_html(page)
content = analysis(html)
save_mongo(content)
get_detail(content, page) if __name__ == '__main__':
pool = Pool()
pool.map(main, [page*44 for page in range(NUM)])
print('程序结束')
#
2:taobao_re_xpath_setting
# -*- coding:utf-8 -*-
# author : yesehngbao
# time:2018/3/21 # 需要爬取得宝贝 GOODS = '皮鞋' # 需要爬取的页数(不大于100) NUM = 100 # 配置mongodb MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_DB = 'test'
MONGO_COLL = 'shoe' # 目录包
DIRNAME = 'taobao' # 主图片包
DIRNAME1 = 'shoe_park_img' # 颜色(类别)图片包
DIRNAME2 = 'shoe_color_img' # 视频包
DIRNAME3 = 'shoe_video'
python 简单实现淘宝关键字商品爬取的更多相关文章
- selenium实现淘宝的商品爬取
一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...
- 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)
Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...
- python就业班-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...
- 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...
- python基础班-淘宝-目录.txt
卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python基础班-淘宝-目录.txt│ ├─1-1 Linux基础│ ├─01-课程简介│ │ 01-课程 ...
- iOS 集成阿里百川最新版(3.1.1.96) 实现淘宝授权登录以及调用淘宝客户端商品详情页
公司最近要做第三方登录,由于是做导购项目,必不可少的有淘宝的授权登录.本来就是一个授权登录,没什么大不了的.但淘宝的无线开放业务——阿里百川更新的最新版本3.1.1.96,开发文档不是不详细,是很 ...
- selenium+PhantomJS 抓取淘宝搜索商品
最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多.直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成. #-*- coding:utf-8 -*-__author__ =''i ...
- Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享 支付宝十年账单上的数字有点吓人,但它统计的项目太多,只是想看看到底单纯在淘宝上支出了多少,于是写了段脚本,统计任意时间段淘宝订单的消费情况,看 ...
- python爬虫-京东商品爬取
京东商品爬取 仅供学习 一.使用selenium from selenium import webdriver from selenium.webdriver.common.keys import K ...
随机推荐
- Android开发之漫漫长途 XVI——ListView与RecyclerView项目实战
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 十分钟释疑Oracle中“小表超慢”之谜(SQL调优/SQL优化)
前几天,一个用户找到我,说查一个小表的时候非常慢,我问有多慢,他说最快也得半个小时才能出结果,有时干脆不出结果,我说小表多大,他说就几十兆,有点疑惑,让他帮忙获取了相关信息,一看就明白了,原来所谓的小 ...
- Java基础学习笔记二十三 Java核心语法之反射
类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...
- beta冲刺3-咸鱼
一,昨天的问题: 页面整理还没做 我的社团这边的后台数据库未完成,前端代码修改未完成. 二,今天已完成 页面整理基本完成,把登陆独立出来了,然后基本处理掉了多余页面(反正也没几个--) 我的社团这边试 ...
- 学号:201621123032 《Java程序设计》第10周学习总结
1:本周学习总结 1.1.:以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2:书面作业 2.1.:常用异常--结合题集题目7-1回答 2.1.1:自己以前编写的代码中经常出现什么异常.需要捕 ...
- C语言--期末总结
一. 1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 答:当初报志愿的时候,没有具体的想法,只凭借着 ...
- Dijkstra算法课后补分博客
题目名称:Dijkstra算法 题目要求:课上给出相关附图,求解附图顶点A的单源最短路径. 附图: 做题过程 1.了解Dijkstra算法的相关知识,包括定义以及使用方法. 定义:Dijkstra算法 ...
- python学习笔记-问题
1.字典按照值进行排序输出 2.返回函数-闭包的使用
- Beta冲刺Day1
项目进展 李明皇 今天解决的进度 点击首页list相应条目将信息传到详情页 明天安排 优化信息详情页布局 林翔 今天解决的进度 前后端连接成功 明天安排 开始微信前端+数据库写入 孙敏铭 今天解决的进 ...
- IOS webview iframe 宽度超出屏幕解决方案
IOS 真机webview中,iframe 却不能很好地适应屏幕大小,总是超出屏幕尺寸,需要左右滚动才能看到完整页面. <div style="overflow: auto;-webk ...