京东商品评论爬取
一,页面分析
1.首先,在爬取页面之前,我们需要对这个页面进行一个分析,通过爬取到的源码发现,这些评论信息不存在于源码当中
并且通过源代码中发现评论信息只存在于第一个id=“comment-0”当中
因此,我接着分析这个页面,发现这些评论信息在json字符串中
二,代码解释
2.1 首先导入包模块
import json # 导入json模块,用于处理JSON数据
from urllib.parse import urlencode # 导入urlencode函数,用于将字典类型的参数转换为URL编码格式
import requests # 导入requests模块,用于发送HTTP请求
2.2 json这个包模块案例讲解
import json
是Python中导入json模块的语句。json模块提供了一种很简单的方式来编码和解码JSON数据。
- 编码:将Python对象转换为JSON字符串,可以使用
json.dumps()
函数。例如:
import json
data = {
"name": "John",
"age": 30,
"city": "New York"
}
json_data = json.dumps(data)
print(json_data)
输出结果为:{"name": "John", "age": 30, "city": "New York"}
- 解码:将JSON字符串转换为Python对象,可以使用
json.loads()
函数。例如:
import json
json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)
print(data)
输出结果为:{'name': 'John', 'age': 30, 'city': 'New York'}
三,实战
在了解这些后,接下来,让我们看看爬取实战,代码如下:
import json
from urllib.parse import urlencode
import requests
import time
class JingDon(object):
def __init__(self):
self.url = "https://api.m.jd.com/?"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}
self.num = 1
def data_get_index(self, num):
parmas = {
'appid': 'item-v3',
'functionId': 'pc_club_productPageComments',
'client': 'pc',
'clientVersion': '1.0.0',
't': '1700442878294',
'loginType': '3',
'uuid': '122270672.1422075459.1700439487.1700439489.1700442671.2',
'productId': '12959834',
'score': '0',
'sortType': '5',
'page': num,
'pageSize': '10',
'isShadowSku': '0',
'fold': '1',
'bbtf': '',
'shield': '',
}
URL = self.url + urlencode(parmas)
# print(URL)
resp = requests.get(url=URL, headers=self.headers)
if resp.status_code == 200:
return resp.text
else:
return None
def parse_data_index(self, response):
dict = json.loads(response)
comments = dict['comments']
# print(comments)
for data in comments:
comment = data['content']
# print(comment)
self.save_data_comment(comment)
def save_data_comment(self, comment):
a = f"第{self.num}条评论打印完毕!"
with open('./comment' + '.txt', "a", encoding="utf-8") as f:
f.write(comment + '\n')
print(a)
self.num += 1
def run(self):
for num in range(30):
response = self.data_get_index(num)
self.parse_data_index(response)
if __name__ == '__main__':
comment = JingDon()
comment.run()
结果展示: