本文将承接笔者的上篇文章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条)