需求分析
Python网络爬虫基础1
第一篇说明了可以使用Beautiful Soup工具来获取网页内容,然后按照网页分析,选择想要内容的Xpath等地址信息进行提取。但京东网页需要用户登录,涉及的操作比较复杂。本篇使用requests和json库直接爬取京东评论。【前提是得到了json的链接】
需求说明:
1.我在京东找到了具体一款的连衣裙,想要看别人的评论来决定是否购买。
2.不仅仅要看评论内容,还要看上身效果图。
目标商品网页如下FANSILANEN范思蓝恩小黑裙
这个url 是https://item.jd.com/44523080700.html#none
44523080700表示商品的标识productId。
评论网址:
“https://club.jd.com/comment/productPageComments.action?&productId={}&score=0&sortType=5&page=0&pageSize={}&isShadowSku=0&fold=1”
- productId是商品的标识,如上图44523080700是这个连衣裙的标识
- score为评论的数据类型 如 0全部评价 1好评 2中评 3差评 5追加评价
- sortType是排序类型(通常使用5)
因此爬取前两页的商品评论的链接就是:
url = “https://club.jd.com/comment/productPageComments.action?&productId=44523080700&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1”
爬取评论代码实现
由了链接,我们打开发现是一个json,评论链接
我们想要的是红色文字部分,所有需要解析这个内容。
Python代码实现如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :XXXX
@File :JingDong.py
@IDE :PyCharm
@Author :菜菜2024
@Date :
'''
import requests
import json
import time
import pandas as pd
import os
def parseContent(data):
'''
从网页数据中解析评论信息
:param data:
:return:
'''
res=[]
items = data['comments']
for i in items:
try:
out=[]
id = i['id']
creationTime = i['creationTime']
content = i['content']
print(id)
out.append(id)
out.append(creationTime)
out.append(content)
res.append(out)
except:
print("没有content")
pass
return res
def JingDongComment(save_folder, url):
'''
从京东json网页中爬取评论数据
:param url:
:return:
'''
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
}
res =[]
print(url)
time.sleep(1)
try:
response = requests.get(url=url, headers=headers)
data = json.loads(response.text)
# 解析数据
parsed_data = parseContent(data)
res.extend(parsed_data)
except:
pass
# 数据写入
df = pd.DataFrame(res)
df.to_excel(save_folder, index=False)
print("------------------保存完成------------------")
if __name__=="__main__":
save_folder = "./JongDong.xlsx"
url = "https://club.jd.com/comment/productPageComments.action?&productId=44523080700&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1"
JingDongComment(save_folder, url)
爬取结果:
想要爬取别的商品和页数只需要替换productId和pageSize。这样也就可以实现批量爬取啦。当然前提是知道多个productId
productId = 44523080700
pageSize = 10
url = "https://club.jd.com/comment/productPageComments.action?&productId={}&score=0&sortType=5&page=0&pageSize={}&isShadowSku=0&fold=1".format(productId, pageSize)
爬取图片链接
由上面的分析,爬取图片链接也比较简单了,只需要解析json的时候取不同的字段就行,将调用parseContent函数改成调用parseImage函数即可,当然你也可以写到一起,同时得到评论和图片链接。
def parseImage(data):
'''
从网页数据中解析图片链接
:param data:
:return:
'''
res=[]
items = data['comments']
for i in items:
try:
images = i['images']
for image in images:
imgurl = image.get("imgUrl")
print(imgurl)
res.append(imgurl)
except:
print("没有i['images']")
pass
return res
结果如图:
复制链接到浏览器就可以打开看到图片了,试试可以发现图片很小,这是因为链接中的s128x96表示图片尺寸是128x96。
可以在excel表中直接替换为s760x500。一个一个太不方面看来,下载下来进行查看
链接下载图片
使用以下函数,注意excel表中的链接以"//“开头,下载的时候需要加上"https:”
def download_img_form_url(excel_path, save_path):
if not os.path.exists(save_path):
os.makedirs(save_path)
df = pd.read_excel(excel_path, sheet_name='Sheet1')
for index, row in df.iterrows():
row_data = list(row)
img_url = "https:"+ row_data[0]
# 下载图片
try:
response = requests.get(img_url, stream=True)
if response.status_code == 200:
img_filename = os.path.basename(img_url.rsplit('/', 1)[-1])
img_path = os.path.join(save_path, img_filename)
# 写入文件
with open(img_path, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
print(f"Downloaded {img_filename} to {save_path}")
else:
print(f"Failed to download {img_url}: {response.status_code}")
except requests.RequestException as e:
print(f"Error downloading {img_url}: {e}")
尺寸替换之后:
图片下载:
总结展望
从json中解析得到评论信息,这里有个前提就是知道json的评论链接。未来方向:
- 如果想要批量爬取多个商品评论,不想一个一个找productId,如何脚本获得一类的productId,比如连衣裙销量前十的productId。
- 可以看到图片是有水印的
- 更多更复杂的爬取需求,京东登录感觉是避免不了的