一、抓取商品id

分析网页源码,发现所有id都是在class=“gl-item”的标签里,可以利用bs4的select方法查找标签,获取id:

获取id后,分析商品页面可知道每个商品页面就是id号不同,可构造url:

将获取的id和构造的url保存在列表里,如下源码:

 def get_product_url(url):
global pid
global links
req = urllib.request.Request(url)
req.add_header("User-Agent",
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36')
req.add_header("GET", url)
content = urllib.request.urlopen(req).read()
soup = bs4.BeautifulSoup(content, "lxml")
product_id = soup.select('.gl-item')
for i in range(len(product_id)):
lin = "https://item.jd.com/" + str(product_id[i].get('data-sku')) + ".html"
# 获取链接
links.append(lin)
# 获取id
pid.append(product_id[i].get('data-sku'))

二、获取商品信息

通过商品页面获取商品的基本信息(商品名,店名,价格等):

         product_url = links[i]
req = urllib.request.Request(product_url)
req.add_header("User-Agent",
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0')
req.add_header("GET", product_url)
content = urllib.request.urlopen(req).read()
# 获取商品页面源码
soup = bs4.BeautifulSoup(content, "lxml")
# 获取商品名
sku_name = soup.select_one('.sku-name').getText().strip()
# 获取商店名
try:
shop_name = soup.find(clstag="shangpin|keycount|product|dianpuname1").get('title')
except:
shop_name = soup.find(clstag="shangpin|keycount|product|zcdpmc_oversea").get('title')
# 获取商品ID
sku_id = str(pid[i]).ljust(20)
# 获取商品价格

通过抓取评论的json页面获取商品热评、好评率、评论:

获取热评源码:

 def get_product_comment(product_id):
comment_url = 'https://club.jd.com/comment/productPageComments.action?' \
'callback=fetchJSON_comment98vv16496&' \
'productId={}&' \
'score=0&' \
'sortType=6&' \
'page=0&' \
'pageSize=10' \
'&isShadowSku=0'.format(str(product_id))
response = urllib.request.urlopen(comment_url).read().decode('gbk', 'ignore')
response = re.search(r'(?<=fetchJSON_comment98vv16496\().*(?=\);)', response).group(0)
response_json = json.loads(response)
# 获取商品热评
hot_comments = []
hot_comment = response_json['hotCommentTagStatistics']
for h_comment in hot_comment:
hot = str(h_comment['name'])
count = str(h_comment['count'])
hot_comments.append(hot + '(' + count + ')')
return ','.join(hot_comments)

获取好评率源码:

 def get_good_percent(product_id):
comment_url = 'https://club.jd.com/comment/productPageComments.action?' \
'callback=fetchJSON_comment98vv16496&' \
'productId={}&' \
'score=0&' \
'sortType=6&' \
'page=0&' \
'pageSize=10' \
'&isShadowSku=0'.format(str(product_id))
response = requests.get(comment_url).text
response = re.search(r'(?<=fetchJSON_comment98vv16496\().*(?=\);)', response).group(0)
response_json = json.loads(response)
# 获取好评率
percent = response_json['productCommentSummary']['goodRateShow']
percent = str(percent) + '%'
return percent

获取评论源码:

 def get_comment(product_id, page):
global word
comment_url = 'https://club.jd.com/comment/productPageComments.action?' \
'callback=fetchJSON_comment98vv16496&' \
'productId={}&' \
'score=0&' \
'sortType=6&' \
'page={}&' \
'pageSize=10' \
'&isShadowSku=0'.format(str(product_id), str(page))
response = urllib.request.urlopen(comment_url).read().decode('gbk', 'ignore')
response = re.search(r'(?<=fetchJSON_comment98vv16496\().*(?=\);)', response).group(0)
response_json = json.loads(response)
# 写入评论.csv
comment_file = open('{0}\\评论.csv'.format(path), 'a', newline='', encoding='utf-8', errors='ignore')
write = csv.writer(comment_file)
# 获取用户评论
comment_summary = response_json['comments']
for content in comment_summary:
# 评论时间
creation_time = str(content['creationTime'])
# 商品颜色
product_color = str(content['productColor'])
# 商品名称
reference_name = str(content['referenceName'])
# 客户评分
score = str(content['score'])
# 客户评论
content = str(content['content']).strip()
# 记录评论
word.append(content)
write.writerow([product_id, reference_name, product_color, creation_time, score, content])
comment_file.close()

整体获取商品信息源码:

 def get_product_info():
global pid
global links
global word
# 创建评论.csv
comment_file = open('{0}\\评论.csv'.format(path), 'w', newline='')
write = csv.writer(comment_file)
write.writerow(['商品id', '商品', '颜色', '评论时间', '客户评分', '客户评论'])
comment_file.close()
# 创建商品.csv
product_file = open('{0}\\商品.csv'.format(path), 'w', newline='')
product_write = csv.writer(product_file)
product_write.writerow(['商品id', '所属商店', '商品', '价格', '商品好评率', '商品评价'])
product_file.close() for i in range(len(pid)):
print('[*]正在收集数据。。。')
product_url = links[i]
req = urllib.request.Request(product_url)
req.add_header("User-Agent",
'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0')
req.add_header("GET", product_url)
content = urllib.request.urlopen(req).read()
# 获取商品页面源码
soup = bs4.BeautifulSoup(content, "lxml")
# 获取商品名
sku_name = soup.select_one('.sku-name').getText().strip()
# 获取商店名
try:
shop_name = soup.find(clstag="shangpin|keycount|product|dianpuname1").get('title')
except:
shop_name = soup.find(clstag="shangpin|keycount|product|zcdpmc_oversea").get('title')
# 获取商品ID
sku_id = str(pid[i]).ljust(20)
# 获取商品价格
price_url = 'https://p.3.cn/prices/mgets?pduid=1580197051&skuIds=J_{}'.format(pid[i])
response = requests.get(price_url).content
price = json.loads(response)
price = price[0]['p']
# 写入商品.csv
product_file = open('{0}\\商品.csv'.format(path), 'a', newline='', encoding='utf-8', errors='ignore')
product_write = csv.writer(product_file)
product_write.writerow(
[sku_id, shop_name, sku_name, price, get_good_percent(pid[i]), get_product_comment(pid[i])])
product_file.close()
pages = int(get_comment_count(pid[i]))
word = []
try:
for j in range(pages):
get_comment(pid[i], j)
except Exception as e:
print("[!!!]{}商品评论加载失败!".format(pid[i]))
print("[!!!]Error:{}".format(e)) print('[*]第{}件商品{}收集完毕!'.format(i + 1, pid[i])) # 的生成词云
word = " ".join(word)
my_wordcloud = WordCloud(font_path='C:\Windows\Fonts\STZHONGS.TTF', background_color='white').generate(word)
my_wordcloud.to_file("{}.jpg".format(pid[i]))

将商品信息和评论写入表格,生成评论词云:

三、总结

在爬取的过程中遇到最多的问题就是编码问题,获取页面的内容requset到的都是bytes类型的要decode(”gbk”),后来还是存在编码问题,最后找到一些文章说明,在后面加“ignore”可以解决,由于爬取的量太大,会有一些数据丢失,不过数据量够大也不影响对商品分析。

京东口红top 30分析的更多相关文章

  1. Oracle SQL篇(三)Oracle ROWNUM 与TOP N分析

        首先我们来看一下ROWNUM: 含义解释: 1.rownum是oracle为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推.这是一个伪列,可以用于限制查询返回的总行数. 2 ...

  2. Learn golang: Top 30 Go Tutorials for Programmers Of All Levels

    https://stackify.com/learn-go-tutorials/ What is Go Programming Language? Go, developed by Google in ...

  3. 值得收藏!国外最佳互联网安全博客TOP 30

    如果你是网络安全从业人员,其中重要的工作便是了解安全行业的最新资讯以及技术趋势,那么浏览各大安全博客网站或许是信息来源最好的方法之一.最近有国外网站对50多个互联网安全博客做了相关排名,小编整理其中排 ...

  4. Top 30 Nmap Command Examples For Sys/Network Admins

    Nmap is short for Network Mapper. It is an open source security tool for network exploration, securi ...

  5. linux中的调试知识---基础gdb和strace查看系统调用信息,top性能分析,ps进程查看,内存分析工具

    1 调试一般分为两种,可以通过在程序中插入打印语句.有点能够显示程序的动态过程,比较容易的检查出源程序中的有关信息.缺点就是效率比较低了,而且需要输入大量无关的数据. 2 借助相关的调试工具. 3 有 ...

  6. SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析

    最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...

  7. HTML JS文字闪烁实现(项目top.htm分析)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from ur ...

  8. 移动开发day4_京东移动页面

    复习 父项身上有哪些属性 可以设置 主轴方向 fd flex-direction : row; column; 主轴子项的排列方式 j justify-content: flex-start;flex ...

  9. 转:XBMC源代码分析

    1:整体结构以及编译方法 XBMC(全称是XBOX Media Center)是一个开源的媒体中心软件.XBMC最初为Xbox而开发,可以运行在Linux.OSX.Windows.Android4.0 ...

随机推荐

  1. BlockingQueue<> 队列的作用

    BlockingQueue<> 队列的作用 BlockingQueue 实现主要用于生产者-使用者队列 BlockingQueue 实现主要用于生产者-使用者队列,BlockingQueu ...

  2. GCD之信号量机制一

    在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它 ...

  3. SoapUI简介和入门实例解析

    SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Ecl ...

  4. TCP/IP笔记

    TCP/IP 连接 三次握手 TCP/IP 四次分手 @TODO TIME_WAIT 状态 有三种状态可以进入此状态 1.由FIN-WAIT-2,双方不同时发起FIN,主动关闭的一方在完成自身发起的关 ...

  5. 让MessageBox对话框总在最前面

    调用MessageBox的时候,如果最后一个参数用上MB_SYSTEMMODAL的话,可以让对话框在最前面

  6. 【Kafka】操作命令

    生产者 ./kafka-console-producer.sh --broker-list --topic norm 消费者 ./kafka-console-consumer.sh --zookeep ...

  7. 配置和启动Kubernetes服务

    安装etcd服务 下载安装包 wget https://github.com/coreos/etcd/releases/download/v3.1.3/etcd-v3.1.3-linux-amd64. ...

  8. Python3常用学习网站总结(随时更新)

    Python资源大全 http://python.jobbole.com/84464/ https://github.com/jobbole/awesome-python-cn   scrapy: h ...

  9. 【转】 Python subprocess模块学习总结

    从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.comman ...

  10. ASP.NET没有魔法——ASP.NET与数据库

    在之前的文章中介绍了使用ASP.NET MVC来开发一个博客系统,并且已将初具雏形,可以查看文章列表页面,也可以点击文章列表的其中一篇文章查看详情,这已经完成了最开始需求分析的读者的查看列表和查看文章 ...