
本文将承接笔者的上篇文章Python爬取京东商品数据,使用京东商品唯一id字段“sku”拼接url,得到真实的京东商品评论网址,进而解释数据并保存到文件中,所爬取到的数据将可以用于后续的统计分析或更深层次的挖掘分析。
二、爬取步骤详解1、找到真实的url
所有的爬虫都是要靠真实的url去获取并解析数据,京东商品评论数据网址是做了一定的反爬措施的。以“华为手机”为搜索关键字为例,点击任意一个华为手机,进入该手机的详情页面,继续点击“商品评价”,随便复制一句评论数据,右键查看网页源代码,Ctrl+F打开搜索框,粘贴刚才复制的评论数据,发现并没有找的该数据。
这时候就需要立刻打开浏览器调试工具了,右键点击“检查“”即可,打开调试工具之后,依次按下图点击。
然后继续找到“商品评论”并点击,好评、中评、差评。
点击完之后,经自己一个个网址查看,我们找到了https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100011762575&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1这个网址有我们需要的数据。
2、分析网址参数
找到真实的url后,我们还不能直接下结论其就是真实的url,复制该url,打开新链接,发现数据还是我们刚才调试时看到的额数据,证明了我们找到了真实的url。
开始分析url参数,很明显,“callback=fetchJSON_comment98”为回调函数,我们发现上图中也有该数据,对于这类参数,可以直接删除。
删除该参数之后,重新刷新网址,发现该数据在源数据已经消失了,说明该参数并不影响我们爬取数据。
继续分析,我们发现“score=0”,如果掌握基本英文知识,很容易猜到“score=”后的数字表示评论数据分类,经笔者分析,0表示全部评论,1、2、3分别表示差评、中评、好评的评论,由于全部评论中包含部分差中好评论,本文只爬取这差中好三类数据。
接着分析该url参数,显而易见,“productId=”后的一串数据即为商品的唯一id,对应商品列表页sku字段。至此,我们已经找到了构造真实url的参数,下面开始写代码爬取。
import requests import json import time import re import random import pandas as pd from faker import Faker from multiprocessing import Pool import os from openpyxl import Workbook, load_workbook from python爬虫.爬虫项目 import random_ip ip = random_ip.dailiips()
其中,json用于解析Json格式数据,faker用于生成随机浏览器请求头,multiprocessing为多进程相关模块,最终两行为笔者的的代理IP生成模块。免费的代理IP对京东来说作用不大,大家可以直接忽视该参数。
2、创建保存数据的文件
try:
wb = load_workbook(filename='京东双十一华为手机评论信息.xlsx')
sheet = wb.active
except:
wb = Workbook()
sheet = wb.active # 激活工作簿
sheet.title = '京东双十一华为手机评论信息' # 设置工作簿名称
# 设置表头
sheet['A1'] = 'title'
sheet['B1'] = 'user_id'
sheet['C1'] = 'creationTime'
sheet['D1'] = 'score'
sheet['E1'] = 'content'
以上代码的意思是若没有“京东双十一华为手机评论信息.xlsx”文件,就直接创建该文件,有则直接打开文件。
3、基本配置headers = {
'User-Agent': Faker().chrome(),
'Referer': 'https://item.jd.com/100011386554.html'
}
base_url = 'https://club.jd.com/comment/productPageComments.action?&productId=100011177233&score=1&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1'
主要是构造请求头和base网址,方便后续使用。
4、主体爬虫代码def get_comment_id(start, end):
'''
读取京东商品的商品标题和sku(sku暂不知晓,记为商品评论唯一id)
:param start: 开始的索引
:param end: 结束的索引
:return: 标题、skus列表
'''
df = pd.read_excel(r'C:UsersHTHDSDesktoppythonpython爬虫爬虫项目京东双十一华为手机信息.xlsx')
names = df['name'][start:end]
skus = df['sku'][start:end]
return names, skus
def get_maxpage(sku):
'''
获取每类评论(好评、中评和差评)的最大页数
:param sku: 商品评论唯一id
:return:
'''
global base_url
maxpagelist = []
for score in [1, 2, 3]:
url = base_url.replace('score=1', f'score={score}').replace('productId=100011177233', f'productId={sku}')
print(url)
response = requests.get(url, proxies=random_ip.dailiips(), headers=headers).text
html = response
json_data = json.loads(html)
maxpagelist.append(int(json_data['maxPage']))
return maxpagelist
def get_url(score, page, sku, title):
'''
获取每页评论的评论数据
:param score: 评论类别
:param page: 页码
:param sku: 商品唯一id
:param title: 标题
:return: 获取到的评论数据
'''
global base_url
print('正在爬取第{}页,id={}'.format(page, os.getpid()))
url = base_url.replace('page=1', f'page={page}').replace('score=1', f'score={score}').replace('productId=100011177233', f'productId={sku}')
data_list_list = get_comment(url, headers=headers, title=title) # 调用采集方法
return data_list_list
def get_comment(url=None, headers=None, title=''):
'''
采集评论数据
:param url: 评论链接
:param headers: 请求头
:param title: 标题
:return: 获取到的评论数据
'''
data_list_list = []
response = requests.get(url, proxies=random_ip.dailiips(), headers=headers).text
html = response
json_data = json.loads(html)
comment = json_data['comments']
for data in comment:
user_id = data['id'] # 评论用户id
creationTime = data['creationTime'] # 评论时间
content = data['content'].strip() # 评论文本
content = re.sub('n','',content)
score = data['score'] # 评分
data_item = [title, user_id, creationTime, score, content]
data_list_list.append(data_item)
print(data_item)
return data_list_list
def write_comment(data_list_list=None):
for data in data_list_list:
sheet.append(data)
以上即为主体的京东商品评论爬取代码,爬取逻辑是先获取商品标题和sku,然后获取每类评论的最大页数,接着拼接真实的url,解析数据后并添加到到Excel文件中,其中write_comment可以合并到解释数据中,笔者这样写只是让爬取过程更清晰,方便理解代码。
5、开启爬虫程序def main():
start = time.time()
# 创建10个进程
pool = Pool(10)
names, skus = get_comment_id(13, 14)
for name, sku in zip(names, skus):
print(name)
sp = get_maxpage(sku)
for s, v in enumerate(sp):
for p in range(int(v)):
pool.apply_async(get_url, args=(s+1, p, sku, name), callback=write_comment)
time.sleep(random.randint(5, 8))
time.sleep(random.randint(60, 80))
pool.close() # 无任务就关闭所有子进程
pool.join() # 子进程未结束阻止主进程执行下面程序
wb.save(filename='京东双十一华为手机评论信息.xlsx')
end = time.time()
print('此次爬完数据用时:', (end-start))
if __name__ == '__main__':
main()
main函数里主要是构建起整个爬虫的过程,若读者还未了解过Python多进程相关的知识,建议先把该方面的知识补全再来看代码的运行逻辑。但尽管本文用到了多进程的爬取方式,但并没有发挥多大作用,京东在访问的时间限制上做的比较严格,不如直接用单线程爬取。
6、结果爬取到的部分数据如下:
本文完成了京东商品评论数据的爬取全过程,其中有些细节笔者可能没有讲到,这需要大家自己动手实践,提升自己的爬虫能力与效率。申明:本文爬取京东商品仅为技术交流,建议不可过快过多爬取京东的网页数据,以免造成不必要的麻烦!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)