Python爬虫-按给定关键词-爬取京东商品信息

Python爬⾍-按给定关键词-爬取京东商品信息
⽬的:按给定关键词爬取京东商品信息,并保存⾄mongodb。
字段:title、url、store、store_url、item_id、price、comments_count、comments
⼯具:requests、lxml、pymongo、concurrent
分析:
1.  ,这是京东搜索⽿机的跳转url,其中关键参数为:
 keyword:关键词
 enc:字符串编码
农夫山泉与京华时报 page:页码,需要注意的是,这⾥的数值均为奇数
 所以简化后的 url 为
2.  分析各字段的 xpath,发现在搜索页⾯只能匹配到 title、url、store、store_url、item_id、price。⾄于 comments_count、comments 需要单独发出请求。
3.  打开某⼀商品详情页,点击商品评价,打开开发者⼯具。点击评论区的下⼀页,发现在新的请求中,除去响应为媒体格式外,仅多出⼀个 js 响应,故猜测评论内容包含其中。
4.  分析上述请求的 url,简化后为 sclub.jd/comment/productPageComments.action?
productId=100004325476&score=0&sortType=5&page=0&pageSize=10,其中:
 productId:商品的Id,可简单的从详情页的 url 中获取
 page:评论页码
5.  由以上可以得出,我们需要先从搜索页⾯中获取的商品 id,通过 id 信息再去获取评论信息。爬取评论时需要注意,服务器会判断请求头中的 Referer,即只有通过商品详情页访问才能得到评论,所以我们每次都根据 item_id 构造请求头。
6.  先将基础信息插⼊⾄数据库,在得到评论信息后,根据索引 item_id 将其补充完整。
2012山东高考作文代码:
1import requests
2from lxml import etree
3import pymongo
4from concurrent import futures
5
6
7class CrawlDog:
8def__init__(self, keyword):
9"""
10初始化
11        :param keyword: 搜索的关键词
12"""
13        self.keyword = keyword
14        _client = pymongo.MongoClient(host='localhost')
15        _collection = _client['spiders']['jd']
16        _ate_index([('item_id', pymongo.ASCENDING)])
17
18def get_index(self, page):
19"""
20从搜索页获取相应信息并存⼊数据库
21        :param page: 搜索页的页码
22        :return: 商品的id
稳健经营23"""
24        url = 'search.jd/Search?keyword=%s&enc=utf-8&page=%d' % (self.keyword, page)
25        index_headers = {
26'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,'
27'application/signed-exchange;v=b3',
28'accept-encoding': 'gzip, deflate, br',
29'Accept-Charset': 'utf-8',
30'accept-language': 'zh,en-US;q=0.9,en;q=0.8,zh-TW;q=0.7,zh-CN;q=0.6',
31'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
32'Chrome/74.0.3729.169 Safari/537.36'
33        }
34        rsp = (url=url, headers=index_headers).content.decode()
35        rsp = etree.HTML(rsp)
36        items = rsp.xpath('//li[contains(@class, "gl-item")]')
37for item in items:
38try:
39                info = dict()
40                info['title'] = ''.join(item.xpath('.//div[@class="p-name p-name-type-2"]//em//text()'))
41                info['url'] = 'https:' + item.xpath('.//div[@class="p-name p-name-type-2"]/a/@href')[0]
42                info['store'] = item.xpath('.//div[@class="p-shop"]/span/a/text()')[0]
43                info['store_url'] = 'https' + item.xpath('.//div[@class="p-shop"]/span/a/@href')[0]
44                info['item_id'] = ('url').split('/')[-1][:-5]
45                info['price'] = item.xpath('.//div[@class="p-price"]//i/text()')[0]
46                info['comments'] = []
47                _collection.insert_one(info)
熏洗仪48yield info['item_id']
49# 实际爬取过程中有⼀些⼴告, 其中的⼀些上述字段为空
50except IndexError:
51print('item信息不全, drop!')
西南师范大学育才学院52continue
53
54def get_comment(self, params):
55"""
56获取对应商品id的评论
57        :param params: 字典形式, 其中item_id为商品id, page为评论页码
58        :return:
59"""
60        url = 'sclub.jd/comment/productPageComments.action?productId=%s&score=0&sortType=5&page=%d&' \
61'pageSize=10' % (params['item_id'], params['page'])
62        comment_headers = {
63'Referer': 'item.jd/%s.html' % params['item_id'],
64'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
65'Chrome/74.0.3729.169 Safari/537.36'
66        }
67        rsp = (url=url, headers=comment_headers).json()
68        comments_count = ('productCommentSummary').get('commentCountStr')
69        comments = ('comments')
70        comments = [('content') for comment in comments]
71        _collection.update_one(
72# 定位⾄相应数据
73            {'item_id': params['item_id']},
74            {
75'$set': {'comments_count': comments_count},  # 添加comments_count字段
76'$addToSet': {'comments': {'$each': comments}}  # 将comments中的每⼀项添加⾄comments字段中
77            }, True)
78
79def main(self, index_pn, comment_pn):
80"""
81实现爬取的函数
82        :param index_pn: 爬取搜索页的页码总数
83        :param comment_pn: 爬取评论页的页码总数
84        :return:
85"""
86# 爬取搜索页函数的参数列表
87        il = [i * 2 + 1 for i in range(index_pn)]
88# 创建⼀定数量的线程执⾏爬取
89        with futures.ThreadPoolExecutor(15) as executor:
90            res = executor._index, il)
91for item_ids in res:
92# 爬取评论页函数的参数列表
93            cl = [{'item_id': item_id, 'page': page} for item_id in item_ids for page in range(comment_pn)]
94            with futures.ThreadPoolExecutor(15) as executor:
割礼龙凤斗
95                executor._comment, cl)
96
97
98if__name__ == '__main__':
99# 测试, 只爬取两页搜索页与两页评论
100    test = CrawlDog('⽿机')
101    test.main(2, 2)
总结:爬取的过程中可能会被封 IP,测试时评论页⾯的获取被封锁,使⽤代理可以解决该问题,后⾯会来主要说⼀下代理的使⽤。

本文发布于:2024-09-20 15:38:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/648687.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:评论   爬取   搜索   商品   信息   获取   需要   页码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议