一、前言
专注app软件定制开发本文将承接笔者的上篇文章,专注app软件定制开发使用京东商品唯一id字段“sku”拼接url,专注app软件定制开发得到真实的京东商品评论网址,专注app软件定制开发进而解释数据并保存到文件中,专注app软件定制开发所爬取到的数据将可以专注app软件定制开发用于后续的统计分析或专注app软件定制开发更深层次的挖掘分析。
二、爬取步骤详解
1. 找到真实的url
所有的爬虫都是要靠真实的url去获取并解析数据,京东商品评论数据网址是做了一定的反爬措施的。以“华为手机”为搜索关键字为例,点击任意一个华为手机,进入该手机的详情页面,继续点击“商品评价”,随便复制一句评论数据,右键查看网页源代码,Ctrl+F打开搜索框,粘贴刚才复制的评论数据,发现并没有找的该数据。
这时候就需要立刻打开浏览器调试工具了,右键点击“检查“”即可,打开调试工具之后,依次按下图点击。
然后继续找到“商品评论”并点击,好评、中评、差评。
点击完之后,经自己一个个网址查看,我们找到了这个网址有我们需要的数据。
2. 分析网址参数
找到真实的url后,我们还不能直接下结论其就是真实的url,复制该url,打开新链接,发现数据还是我们刚才调试时看到的额数据,证明了我们找到了真实的url。
开始分析url参数,很明显,“callback=fetchJSON_comment98”为回调函数,我们发现上图中也有该数据,对于这类参数,可以直接删除。
删除该参数之后,重新刷新网址,发现该数据在源数据已经消失了,说明该参数并不影响我们爬取数据。
继续分析,我们发现“score=0”,如果掌握基本英文知识,很容易猜到“score=”后的数字表示评论数据分类,经笔者分析,0表示全部评论,1、2、3分别表示差评、中评、好评的评论,由于全部评论中包含部分差中好评论,本文只爬取这差中好三类数据。
接着分析该url参数,显而易见,“productId=”后的一串数据即为商品的唯一id,对应商品列表页sku字段。至此,我们已经找到了构造真实url的参数,下面开始写代码爬取。
三、完整代码
1. 导入所需包
import requestsimport jsonimport timeimport reimport randomimport pandas as pdfrom faker import Fakerfrom multiprocessing import Poolimport osfrom openpyxl import Workbook, load_workbookfrom python爬虫.爬虫项目 import random_ipip = random_ip.dailiips()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
其中,json用于解析Json格式数据,faker用于生成随机浏览器请求头,multiprocessing为多进程相关模块,最终两行为笔者的的代理IP生成模块。免费的代理IP对京东来说作用不大,大家可以直接忽视该参数。
2. 创建保存数据的文件
try: wb = load_workbook(filename='京东双十一华为手机评论信息.xlsx') sheet = wb.activeexcept: wb = Workbook() sheet = wb.active # 激活工作簿 sheet.title = '京东双十一华为手机评论信息' # 设置工作簿名称 # 设置表头 sheet['A1'] = 'title' sheet['B1'] = 'user_id' sheet['C1'] = 'creationTime' sheet['D1'] = 'score' sheet['E1'] = 'content'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
以上代码的意思是若没有“京东双十一华为手机评论信息.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'
- 1
- 2
- 3
- 4
- 5
- 6
主要是构造请求头和base网址,方便后续使用。
4. 主体爬虫代码
def get_comment_id(start, end): ''' 读取京东商品的商品标题和sku(sku暂不知晓,记为商品评论唯一id) :param start: 开始的索引 :param end: 结束的索引 :return: 标题、skus列表 ''' df = pd.read_excel(r'C:\Users\HTHDS\Desktop\python\python爬虫\爬虫项目\京东双十一华为手机信息.xlsx') names = df['name'][start:end] skus = df['sku'][start:end] return names, skusdef 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 maxpagelistdef 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_listdef 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('','',content) score = data['score'] # 评分 data_item = [title, user_id, creationTime, score, content] data_list_list.append(data_item) print(data_item) return data_list_listdef write_comment(data_list_list=None): for data in data_list_list: sheet.append(data)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
以上即为主体的京东商品评论爬取代码,爬取逻辑是先获取商品标题和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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
main函数里主要是构建起整个爬虫的过程,若读者还未了解过多进程相关的知识,建议先把该方面的知识补全再来看代码的运行逻辑。但尽管本文用到了多进程的爬取方式,但并没有发挥多大作用,京东在访问的时间限制上做的比较严格,不如直接用单线程爬取。
6. 结果
爬取到的部分数据如下:
本文完成了京东商品评论数据的爬取全过程,其中有些细节笔者可能没有讲到,这需要大家自己动手实践,提升自己的爬虫能力与效率。申明:本文爬取京东商品仅为技术交流,建议不可过快过多爬取京东的网页数据,以免造成不必要的麻烦!