前序: 

最近工作不是很忙,领导突然找我谈话,说是谈话,其实就是分配活呗。果不其然,很快进入正题, 给了我一个网址链接,然后说需要商品的信息。。。巴拉巴拉。好吧,去做吧。

我当时的内心是崩溃的,python爬虫压根没碰过,这下完蛋了,理了理思绪,决定先从网页来看。

好了,吐槽完毕,开始正题:

需求:

https://youpin.mi.com/ 需要这个电商网址里边的商品信息, 其中包括:【商品类目】【商品名称】【商品链接】【商品售价】【商品市场价】【评价星级】【评价满意度】【评价总数量】

由于需要类目信息,我决定从类目到商品再到评价这个路子去着手。

首先呢,打开地址,发现首页可以看到类目信息,所以开启网页调试模式,发现了一个请求,如图:

这个请求的返回,有我们需要的分类信息哇,心里一抖,再去看了看请求入参的信息,如下:

之后,我通过postman模拟,居然请求ok了。这可是决定性的一步啊。(ps:其实也不是一下子就试成功的,中间走了一些弯路,由于抓包看到的请求入参格式是application/x-www-form-urlencoded,但是在postman模拟请求的时候,却怎么也请求不到,结果用application/json 去请求的话就可以了,这块存在一部分的侥幸啊)postman请求如下:

这里入参用的是 application/json , 其中请求头的 Referer是必须的,抓包看请求就可以获取到。

接下来,我用类似的方法找到了从分类点进去的商品列表的接口,商详接口,商品评价接口,其中,商详接口请求到code=0,但是result为空,我猜可能是平台的商详接口有反爬虫的机制,就放弃了请求商详接口,如此一来,分析了下,分类点进去的商品列表里边有商品的信息,然后我根据商品的id 可以获取到评论信息,如此一来,我需要的数据都有了,开始动工。

我先说下大体思路哈:

1.  打开网页,分析自己需要的数据,查找对应的网页请求。

2. postman模拟网页请求,获取数据。

3. 用python 去请求对应的接口,获取数据,保存至excel。

下边上代码:

环境:windows7, Python 2.7.0,PyChram编辑器  ,其中有用到python的库:urllib2  json  xlwt (这些库具体的安装,用法大家可以自行百度,这里就不再赘述)

# -*- coding: UTF-8 -*-

import xlwt
import urllib2
import json # 设置编码格式为utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8') # 设置url
shop_url = "https://youpin.mi.com/app/shopv3/pipe" # 代理
user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
# 请求格式
con_type = 'application/json'
# 类目的referer
caty_referer = "https://youpin.mi.com/"
# 商品列表的referer
goods_referer = 'https://youpin.mi.com/detail?gid=101975' # 组建header
caty_headers = {'Referer': caty_referer, "Content-Type": con_type} # 分类入参
caty_data = {"result": {"model": "Homepage", "action": "GetGroup2ClassInfo", "parameters": {}}}
# 商品列表入参
list_data = {"uClassList": {"model": "Homepage", "action": "BuildHome", "parameters": {"id": 1}}}
# 评论入参
comment_data = {"overView": {"model": "Product", "action": "CommentIndexV2", "parameters": {"gid": 1}}} # 获取商品的评论信息
def get_good_comment(url, gid):
caty_headers["Referer"] = url
comment_data["overView"]["parameters"]["gid"] = gid
comment_param = json.dumps(comment_data) com_req = urllib2.Request(shop_url, headers=caty_headers, data=comment_param)
com_resp = urllib2.urlopen(com_req)
com_res = com_resp.read()
com_result = json.loads(com_res)
com_info = com_result['result']['overView']['data']
com_count = 0 if com_info['tags']:
com_count = com_info['tags'][0]['count']
else:
com_count = 0
# for com in com_info['tags']:
# com_count = com['count'] comment_info = {
"score": com_info['avg_score'],
"rate": com_info['positive_rate'],
"count": com_count
}
return comment_info # 获取商品列表,并获取到商品信息,保存到excel
def get_good_list(caty_id, caty_name):
# 1. 请求分类的商品列表
list_referer = "https://youpin.mi.com/goodsbycategory?firstId=%s&secondId=%s&title=%s"
list_referer_r = list_referer % (caty_id, caty_id, caty_name)
caty_headers["Referer"] = list_referer_r
list_data["uClassList"]["parameters"]["id"] = caty_id
list_param = json.dumps(list_data) list_req = urllib2.Request(shop_url, headers=caty_headers, data=list_param)
list_resp = urllib2.urlopen(list_req)
list_res = list_resp.read()
list_result = json.loads(list_res)
list_info = list_result['result']['uClassList']['data'] worksheet = workbook.add_sheet(caty_name)
worksheet.write(0, 0, '类目')
worksheet.write(0, 1, '链接')
worksheet.write(0, 2, '商品名称')
worksheet.write(0, 3, '价格')
worksheet.write(0, 4, '划线价')
worksheet.write(0, 5, '评论星级')
worksheet.write(0, 6, '评论满意度')
worksheet.write(0, 7, '评论条数') # 3. 获取商品url,从而获取商品信息
index = 1
for list_index in list_info:
if list_index['item_type'] == 5:
continue # 获取商品url,获取商品信息
child_caty_name = list_index['content']['name']
real_caty_name = caty_name+'/'+child_caty_name for goods in list_index['data']:
# 获取评论
comment = get_good_comment(goods['url'], goods['gid']) # 获取商品信息
goods_info = {
"caty": real_caty_name,
"url": goods['url'],
"name": goods['name'],
"price_min": goods['price_min'],
"market_price": goods['market_price'],
"score": comment['score'],
"rate": comment['rate'],
"count": comment['count']
}
print goods_info
worksheet.write(index, 0, goods_info['caty'])
worksheet.write(index, 1, goods_info['url'])
worksheet.write(index, 2, goods_info['name'])
worksheet.write(index, 3, goods_info['price_min'])
worksheet.write(index, 4, goods_info['market_price'])
worksheet.write(index, 5, goods_info['score'])
worksheet.write(index, 6, goods_info['rate'])
worksheet.write(index, 7, goods_info['count'])
index = index + 1 workbook.save(filename)
return # 入口 # 1. 类目入参处理,并请求获取类目信息列表
caty_param = json.dumps(caty_data)
req = urllib2.Request(shop_url, headers=caty_headers, data=caty_param)
response = urllib2.urlopen(req)
res = response.read()
caty_resp = json.loads(res)
caty_groups = caty_resp["result"]["result"]["data"]["groups"]
print len(caty_groups) # 2. excel表格初始化
filename = "小米优品.xls".decode(encoding="utf-8")
workbook = xlwt.Workbook(encoding='utf-8') # 3. 获取分类列表,以及id
for caty in caty_groups:
for caty_class in caty:
caty_info = {
'id': caty_class['class']['ucid'],
'name': caty_class['class']['name']
} list_data["uClassList"]["parameters"]["id"] = caty_info["id"]
# 获取该类目下的商品列表
get_good_list(caty_info['id'], caty_info['name'])

之后,获取到的数据如图:

我这里是按照大的类目去分的sheet 。

总结:

1. 我理解的爬虫其实就是模拟浏览器请求,去获取数据,之后将数据按照自己的要求去保存excel或者是数据库。

2. 数据获取可以通过访问接口 ( ps:也可以通过获取网页html,抓取html标签元素去获得数据 )

3. 注意编码:

  3.1: 代码中有中文的,Python文件的开头需要设置:

    # -*- coding: UTF-8 -*-

 3.2 :windows下,Python的默认编码是ASCII,但是为了开发方便,一般开发者都是设置的UTF-8。

     python操作Excel的时候,如果插入数据有中文,需要在创建workbook的时候,设置UTF-8:      

    workbook = xlwt.Workbook(encoding='utf-8')

        python操作Excel的时候,如果文件名有中文,也需要给文件名设置UTF-8:      

    filename = "爬取结果.xls".decode(encoding="utf-8")

以上,就是我这个python小白的初体验,希望可以帮助到python的初学者~

python小白的初步爬虫的更多相关文章

  1. 5个python爬虫教材,让小白也有爬虫可写,含视频教程!

    认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据. python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用python爬 ...

  2. 孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4

    孤荷凌寒自学python第七十四天开始写Python的第一个爬虫4 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  3. Python小白的数学建模课-A1.2021年数维杯C题(运动会优化比赛模式探索)探讨

    Python小白的数学建模课 A1-2021年数维杯C题(运动会优化比赛模式探索)探讨. 运动会优化比赛模式问题,是公平分配问题 『Python小白的数学建模课 @ Youcans』带你从数模小白成为 ...

  4. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  5. 【Python】:简单爬虫作业

    使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...

  6. 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道

    使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取

  7. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  8. 洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块

    feedparser模块 1.简介 feedparser是一个Python的Feed解析库,可以处理RSS ,CDF,Atom .使用它我们可从任何 RSS 或 Atom 订阅源得到标题.链接和文章的 ...

  9. 洗礼灵魂,修炼python(50)--爬虫篇—基础认识

    爬虫 1.什么是爬虫 爬虫就是昆虫一类的其中一个爬行物种,擅长爬行. 哈哈,开玩笑,在编程里,爬虫其实全名叫网络爬虫,网络爬虫,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者 ...

随机推荐

  1. C++数组怎么复制

    C++数组怎么复制: #include <string.h>main(){int a[10]={34,56,4,10,77,51,93,30,5,52};int b[10];memcpy( ...

  2. ubuntu安装最新版node和npm

    1.先在系统上安装好nodejs和npm           sudo apt-get install nodejs-legacy sudo apt-get install npm     2.升级n ...

  3. 正则去除html标签属性保留指定标签

    /// <summary> /// 去除标签里面的属性保留IMG标签属性 /// </summary> /// <param name="strText&quo ...

  4. docker commit 显示“invalid reference format”

    docker commit的时候一直显示invalid reference format,改了几次也不行,后来发现是因为docker镜像的名字中不能包含大写字母,改成小写后就行了

  5. GetDIBits 提示堆栈损坏的解决办法

    ...... BITMAPINFOHEADER bi; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bmpScreen.bmWidth; bi ...

  6. Python学习---深浅拷贝的学习

    浅拷贝copy(): 修改字符串,原来的不变: 更改列表,2个同时修改,以为列表里面还涉及一个指针的索引. 简单讲就是copy()只是简单地copy了第一层,第二层不被copy 深拷贝:  需要单独的 ...

  7. 使用c++11写个最简跨平台线程池

    为什么需要多线程? 最简单的多线程长啥样? 为什么需要线程池,有什么问题? 实现的主要原理是什么? 带着这几个问题,我们依次展开. 1.为什么需要多线程? 大部分程序毕竟都不是计算密集型的,简单的说, ...

  8. June 25th 2017 Week 26th Sunday

    There is always that one song that brings back old memories. 总有那么一首歌,让你想起那些旧的回忆. There are seveal so ...

  9. February 10 2017 Week 6 Friday

    Example is always more efficacious than precept. 身教胜于言教. Always match your words with your actions. ...

  10. PHP-----JSOM类型数据

    JS里的数据类型 JS里的一种数据类型,JSOM类型数据 JSOM这种数据类型,在使用JS和jquery时经常使用的到,比较重要.用起来比较简单. <title>无标题文档</tit ...