文章目录

  • 一、起因
  • 二、项目实现
    • 1. 分析实现方式
    • 2. 编码实现
    • 3. 完整代码
  • 三、思考与改进

一、起因

看到一篇文章,感觉自己可以动手试试
Python 不用selenium 带你高效爬取京东商品评论

文章中提出了一个直接利用request爬取数据的方式,那样会比selenium爬取快很多。

此外还用到了一些对这个项目有帮助的博客

  • 【爬虫军火库】如何优雅地复制请求头
  • python爬取淘宝评论(2019年8月更新)

二、项目实现

1. 分析实现方式

爬取的商品评论如下图所示:
为了爬取多页评论,可行的方式之一是通过selenium模拟浏览器访问网页的点击动作,但那样效率太慢,这里通过一个更快的方式实现。

我们需要对请求数据的格式进行分析,然后直接利用requests包模拟请求得到数据即可。

首先要知道,网页中的很多请求都是通过json格式返回文本的,我们可以在某淘宝商品页面进行查看,打开浏览器按F12打开开发者工具,选中Network选项,这一部分浏览器将记录访问该网页过程中产生的网络请求。

我们可以在左侧产生的各个数据包中逐个检查或直接按照文本搜索,这里直接通过搜索功能查找。

通过评论中的“好看”关键词找到这个json格式对应的请求,即list_detail_rate.htm,点击进行查看,得到的json数据格式如下图所示,可以看出其中包含的rateContent即为实际的评论内容,在rateDetail/rateList


我们可以利用这个请求头中的参数,加以修改实现爬取多页评论。

请求头中可以猜测参数代表的含义,这里可能有用的参数有:itemId为商品id,order可能为评论排序方式,currentPage为当前评论的页数,下面通过编程实现爬取功能。

2. 编码实现

首先导入各个库,准备所需参数,这里用到的参数都可以通过开发者工具获取。
其中Params为原url中的参数,不懂的看这篇,只用到了需要的参数,即itemId/sellerId/currentPage/callback

import re
import time
import csv
import os
import requests
import json
import htmlheaders = {"cookie": "dnk=%5Cu6Cu74DC3; t=e084d0ff3438e55e02b4bd0f3940a782; lid=%E6%9D%8E%E8%A5%BF%E7%93%9C3; _tb_token_=8fe5960b5; cookie2=1ed157aa4da72014b0401c225e7; enc=cLGI69iGuHhR5dHEyMC%2BaI%2F7fh2OwCuuzFJDOCsmgWXuNule0EHvOkbeTLW9DXv2LYJaLPOzBTvYO3iE4dPXCQ%3D%3D; cna=bCj3Fg9aQAQ5/eXqgUel2; tk_trace=1; hng=CN%7Czh-CN%7CCNY%7C156; uc1=cookie16=UtASsssmPlP%2Ff1IHDsDaPRu%2BPw%3D%3D&pas=0&existShop=false&cookie15=UtASsssmOIJ0bQ%3D%3D&lng=zh_CN&cookie14=UoTUPc3ljpL4zQ%3D%3D&tag=8&cookie21=W5iHLLyFeYZ1WM9hVnmS&cart_m=0; uc3=lg2=VFC%2FuZ9ayeYq2g%3D&vt3=F8dBxdGLa3WXMx5cj7I%3D&id2=UUkIHIKbWeXUiQ%3D%3D&nk2=o%2FMlsnK76A%3D%3D; tracknick=%5Cu674E%5Cu897F%5Cu74DC3; uc4=nk4=0%40oaXu7yh9pdCZTaRJY7qDotYR&id4=0%40U2uE9bgavzU7dxkYCPk4vP%2F1op69; lgc=%5Cu674E%5Cu897F%4DC3; sgcookie=EIrgPgb1qADYh9IUfx2JY; csg=883d7d47; _m_h5_tk=fef5252478fcdbbaeaa83cea3acf9_1587199947953; _m_h5_tk_enc=1f5dbcd059904d7035151f823874efe2; tfstk=c9DRBv_NpEYuLJiz_vd0deSXjokRZ8j8-gadpH6GIES9fvXdirHiBNk78HnC..; x5sec=7b22726174656d616e616765723b32223a2230626238323034653038376633656165366165303265386233834435057332f2f5146454e57796b3447497875716b7341453d227d; OZ_SI_2061=sTime=1587532108&sIndex=25; OZ_1U_2061=vid=ve9fd14cbef42e.0&ctime=1587535343&ltime=1587535336; OZ_1Y_2061=erefer=https%3A//kb-render.alicdn.com/html/61574/2020/04/17/5a47a178-0d8d80e8-120425885.html%3Frd%3Dhttps%253A%252F%252Fclick.mz.simba.taobao.com%252Fbrand%253Fe%253D6B%25252FcjhXDKa6jVNTaFT64%25252Bb9DF67xy%25252FmOtjveIVdRh6NfUUPlE8tgezaquuKfLDrni1SKmG9%25252FSppqtsZTksZxmREkdsuPsCamr8WVqNcfHdhVdOCq6IIdOCZMxKbtd687c86rR9eOOepHFbKvafqb0Q3zD0BqzDf03%25252B%25252FWxIR3%25252FcGPevfddmA99SKox2NHyAtuaoHKHdA%25253D%25253D%2526u%253D%2526k%253D507%2526eadt%253D42%26style%3D112%26q%3Duniqlo%26nq%3D%25E4%25BC%2598%25E8%25A1%25A3%25E5%25BA%2593%26enable_linkage%3Dtrue%26bucketids%3D182037%2C264350%2C182043%2C182047%2C182052%2C182055%2C2790058%2C3226910%2C3226907%26campaign_id%3D194366765%26adgroup_id%3D194731278%26creative_id%3D32265002390001%26session_id%3D14dd5c0b03fde7005e9fd1442df11cb6%26shop_id%3D57303596%26nickname%3D%25E6%259D%258E%25E8%25A5%25BF%25E7%2593%259C3&eurl=https%3A//uniqlo.tmall.com/%3Fali_trackid%3D42_b93e96abc9ee1fd7271dfba74bb2629f%23%21men&etime=1587532112&ctime=1587535343&ltime=1587535336&compid=2061; isg=BMbGq4Yu5E7RK7Mw6jD4gEaoF7xIJwrhenTaxrDv2OnFs2TNGLbv86kFi-9_GwL5; l=eBLFczcRqOzRYI6AKOfZFurza77ThIRVguPzaNbMiT5P9w595moAWZX3gyTpCnGVn6lHR3JMwUX8B58UmPathZXRFJXn9MptndLh.","referer": "https://detail.tmall.com/item.htm","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}params = {"itemId":"591469678950","sellerId": "196993935","currentPage":"1","callback": "jsonp723"
}

从网页源代码中可以知道这个网页用到的编码方式为utf-8

由此得到一个简单的请求函数request_commnets

def request_comment(url, page):params["currentPage"] = str(page)# 这里[11:-1]的原因是去掉callback信息req = requests.get(url, params, headers=headers).content.decode('utf-8')[11:-1]return req

接下来试图通过文件输出req时遇到了如图所示的Unicode编码问题:

参考这篇博客,发现原因是python默认打开文件时采用gbk编码,在打开文件时指定encoding即可,即

file = open("comments.txt", "w", encoding="utf-8")

得到改进后版本如下:

writer = open("comments.txt", "w", encoding="utf-8")
req = request_comment(url, page)
result = json.loads(req)
js = json.dumps(result, sort_keys=True, indent=4,separators=(',', ':'))
writer.write(js)
writer.close()

此时我们已经实现了一个基本的爬取函数,现在可以得到如下json格式的数据:

接下来对json文本进一步细化处理,得到最终的爬取函数

def comment_crawl(url, pages, writer):# 爬取的表格属性attris = ["displayUserNick", "auctionSku", "rateDate", "rateContent"]csv_writer = csv.writer(writer)csv_writer.writerow(attris)# 读取pages页评论for i in range(pages):page = i + 1print('当前正在下载第%d页评论' % (page))req = request_comment(url, page)result = json.loads(req)comments = result["rateDetail"]["rateList"]for comment in comments:tmp = []for attri in attris:tmp.append(comment[attri])csv_writer.writerow(tmp)

效果如下图所示,爬取了十页评论:

最后对代码进行美化处理,得到完整代码。

3. 完整代码

完整代码如下(cookie已做处理):

import time
import csv
import os
import requests
import json
import htmlheaders = {"cookie": "dnk=%5Cu674E%5Cu897F%5Cu74DC3; t=e084d0ff3438e55e02b4bd0f3940a782; lid=%E6%9D%8E%E8%A5%BF%E7%93%9C3; _tb_token_=8fe596b9e0b5; cookie2=1ed157aa4da72014b0401c2c468425e7; enc=cLGI69iGuHhR5dHEyCu674E%5Cu897F%5Cu74DC3; uc4=nk4=0%40oaXu7yh9pdCZTaRJY7qDotYR&id4=0%40U2uE9bgavzU7dxkYCPk4vP%2F1op69; lgc=%5Cu674E%5Cu897F%5Cu74DC3; sgcookie=EIrgPgb1qADYh9IUfx2JY; csg=883d7d47; _m_h5_tk=fef5251ec2478fcdbbaeaa83cea3acf9_1587199947953; _m_h5_tk_enc=1f5dbcd059904d7035151f823874efe2; tfstk=c9DRBv_NpEYuLJiz_vd0deSXjokRZ8j8-gadpH6GIES9fvXdirHiB5iBNk78HnC..; x5sec=7b22726174656d616e616765723b32223a223062623832303465303837663365616536616530326538623862653636323834435057332f2f5146454e57796b3447497875716b7341453d227d; OZ_SI_2061=sTime=1587532108&sIndex=25; OZ_1U_2061=vid=ve9fd14cbef42e.0&ctime=1587535343&ltime=1587535336; OZ_1Y_2061=erefer=https%3A//kb-render.alicdn.com/html/61574/2020/04/17/5a47a178-0d8d80e8-120425885.html%3Frd%3Dhttps%253A%252F%252Fclick.mz.simba.taobao.com%252Fbrand%253Fe%253D6B%25252FcjhXDKa6jVNTaFT64%25252Bb9DF67xy%252526NfUUPlE8tgezaquuKfLDrni1SKmG9%25252FSppqtsZTksZxmREkdsuPsCamr8WVqNcfHdhVdOCq6IIdOCZMxKbtd687c86rR9eOOepHFbKvafqb0Q3zD0BqzDf03%25252B%252593%587535343&ltime=1587535336&compid=2061; isg=BMbGq4Yu5E7RK7Mw6jD4gEaoF7xIhIRVguPzaNbMiT5P9w595moAWZX3gyTpCnGVn6lHR3JMwUX8B58UmPathZXRFJXn9MptndLh.",# "sec-fetch-dest": "script",# "sec-fetch-mode": "no-cors",# "sec-fetch-site": "same-site","referer": "https://detail.tmall.com/item.htm","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36"
}params = {"itemId":"591469678950","sellerId": "196993935","currentPage":"1","callback": "jsonp723"
}url = "https://rate.tmall.com/list_detail_rate.htm"def request_comment(params, page):params["currentPage"] = str(page)req = requests.get(url, params, headers=headers).content.decode('utf-8')[11:-1]return reqdef comment_crawl(itemId, pages, writer):params["itemId"] = str(itemId)# 爬取的表格属性attris = ["displayUserNick", "auctionSku", "rateDate", "rateContent"]csv_writer = csv.writer(writer)csv_writer.writerow(attris)# 读取pages页评论for i in range(pages):page = i + 1print('当前正在下载第%d页评论' % (page))req = request_comment(params, page)result = json.loads(req)comments = result["rateDetail"]["rateList"]for comment in comments:tmp = []for attri in attris:tmp.append(comment[attri])csv_writer.writerow(tmp)if __name__ == '__main__':writer = open("comments.csv", "w", newline='', encoding='utf-8-sig')itemId = 591469678950comment_crawl(itemId, 10, file)writer.close()

三、思考与改进

  • 可以将这个爬取器改成多线程版本,构造一个线程池,每次每个页面由一个线程负责,这样效率会更高

  • 还有一些需要注意的地方

    1. 打开文件的encoding格式修改为,参照这篇博客,这样excel打开这个文件不会产生乱码的错误。
    2. 打开文件还需要加入newline='',否则会csv.writerow将输出空行,参照这篇博客

利用python requests库爬取淘宝商品评论_python相关推荐

  1. python使用requests库爬取淘宝指定商品信息

    python使用requests库爬取淘宝指定商品信息 在搜索栏中输入商品 通过F12开发者工具抓包我们知道了商品信息的API,同时发现了商品数据都以json字符串的形式存储在返回的html内 解析u ...

  2. python淘宝爬虫基于requests抓取淘宝商品数据_python淘宝爬虫基于requests抓取淘宝商品数据...

    在学校蹭过python的课,觉得python异常强大,趁寒假有时间,瞎搞一下,希望能和大伙一起探讨学习.废话不多说了,直接正题. requests 是Python的http库,可以完成绝大部分与htt ...

  3. python爬豆瓣电视剧_python requests库爬取豆瓣电视剧数据并保存到本地详解

    首先要做的就是去豆瓣网找对应的接口,这里就不赘述了,谷歌浏览器抓包即可,然后要做的就是分析返回的json数据的结构: https://movie.douban.com/j/search_subject ...

  4. 用python爬取qq空间内容_利用Fiddler抓包和py的requests库爬取QQ空间说说内容并写入文件...

    [Python] 纯文本查看 复制代码#!C:\Program Files\Python36 python # -*- coding: UTF-8 -*- """ @au ...

  5. python爬虫学习(三):使用re库爬取淘宝商品,并把结果写进txt文件

    第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字"python",然后搜索,显示如下搜索结果 从url连接中可以得 ...

  6. python获取网页json返回空_Python用requests库爬取返回为空的解决办法

    首先介紹一下我們用360搜索派取城市排名前20. 我们爬取的网址:https://baike.so.com/doc/24368318-25185095.html 我们要爬取的内容: html字段: r ...

  7. python多线程爬取淘宝商家图片

    此次爬取淘宝商家图片是为了对相关行业(此处以激光雷达为例)的产品结构以及外观设计进行对比.而淘宝的反爬机制非常强大,能力有限只能有简单点的办法进行爬取.由于淘宝的每一页数据都是存放在js文件里面,所以 ...

  8. Python爬虫,抓取淘宝商品评论内容

    2019独角兽企业重金招聘Python工程师标准>>> 作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用pytho ...

  9. 爬取淘宝商家货物简单销售数据,双十一马上就到了,秒杀准备了吗

    前天接一个爬取淘宝商家(自行车)信息的请求,要求数据按照其销售量排行. 完成该请求后,爬取数据(李宁卫衣)如下: 接下来看如何实现的? 首先打开淘宝网:https://www.taobao.com/, ...

最新文章

  1. adsafe for linux,新闻|关于网站广告和过滤器的那些事
  2. 用程序算法做人生选择
  3. 2020倩女幽魂服务器正在维修,倩女幽魂手游2020年12月3日维护公告
  4. 【剑指offer】面试题32 - III:从上到下打印二叉树 III(Java)
  5. Hibernate 连接不同数据库的方言
  6. 一辆车撞到一位女孩的各种拍摄手法
  7. Win10+VS2015+CUDA9.0 环境搭建
  8. 整理python小爬虫
  9. 基于LSTM的【气象数据+发电数据】多步时序数据建模预测分析实战
  10. 如何使用代理服务器更新系统_iPhone如何屏蔽iOS系统更新支持iOS12 iOS13
  11. Annotation-specified bean name ‘mapper‘ for bean class [com.thoughtworks.xstream.mapper.Mapper] conf
  12. ITIL学习笔记——核心流程之:变更管理
  13. 2020博客之星结束了,感谢这些小伙伴们为我投票|博客之星TOP20的几位大佬
  14. 小米手机怎么用计算机,小米手机怎么连接电脑
  15. Android证书信任问题与大表哥
  16. 听华应龙的课我会用计算机吗体会,听华应龙老师课有感
  17. vgg16网络模型的学习理解
  18. 文本数据分析:文本挖掘还是自然语言处理?
  19. 百度云服务器Ubuntu18.04部署web项目
  20. GridView相关

热门文章

  1. ElementUI组件中el-upload上传图片不显示问题
  2. 【1 Vue基础 - 模板语法-绑定】
  3. Paint - 效果
  4. 注意!全国九大系列职称都已设专利要求!
  5. CNC加工中心操作经验汇集,这次总结全了!
  6. JAVA11_16学习总结(集合!)
  7. 历史文章之深思4 rockey5 rockey6 新一代加密狗乱弹
  8. 飞桨开源深度学习平台介绍
  9. Python表白代码:太秀了,用过的人都找到了对象...【满屏玫瑰盛开】
  10. Ubuntu无root权限安装miniconda到配置jupyter、GPU版本pytorch一条龙服务