定制开发爬虫案例—京东数据爬取、数据处理及数据可视化(效果+代码)

一、数据获取

        使用PyCharm(引用requests库、lxml库、json库、time库、openpyxl库和pymysql库)定制开发爬取京东网页相关数据(品牌、标题、价格、店铺等)

数据展示(片段):

        定制开发京东网页有反爬措施,定制开发需要自己在网页登录后,获取cookie,定制开发加到请求的header中(定制开发必要时引入time库,定制开发设置爬取睡眠时间降低封号概率)

爬取代码(片段):

  1. ###定制开发获取每一页的商品数据
  2. def getlist(url,brand):
  3. global count #定制开发定义一个全局变量,定制开发主要是为了确定写入第几行
  4. # url="https://search.jd.com/search?keyword=笔记本&wq=笔记本&ev=exbrand_联想%5E&page=9&s=241&click=1"
  5. res = requests.get(url,headers=headers)
  6. res.encoding = 'utf-8'
  7. # text = (res.text).replace("")
  8. text = res.text
  9. selector = etree.HTML(text)
  10. list = selector.xpath('//*[@id="J_goodsList"]/ul/li')#定制开发获取数据所在
  11. for i in list:
  12. title = i.xpath('.//div[@class="p-name p-name-type-2"]/a/em/text()')[0].strip()#商品名称
  13. price = i.xpath('.//div[@class="p-price"]/strong/i/text()')[0]#商品价格
  14. shop = i.xpath('.//div[@class="p-shop"]/span/a/text()')[0] #定制开发获取店铺名称
  15. #获取评论数的id值
  16. # product_id = i.xpath('.//[@class="p-commit"]/strong/a/@id')[0].replace("J_comment_","")
  17. # comment_count = commentcount(product_id)
  18. # print("目前条数="+str(count))

爬取完后直接存入数据库:

  1. # 实现将数据写入到数据库中吗,提前将库和表创建好,创建表结构如下:
  2. """CREATE TABLE jd.shuju(
  3. id INT PRIMARY KEY AUTO_INCREMENT,
  4. brand VARCHAR(100) CHARACTER SET utf8,
  5. title VARCHAR(100) CHARACTER SET utf8,
  6. price VARCHAR(100) CHARACTER SET utf8,
  7. shop VARCHAR(100) CHARACTER SET utf8,
  8. comment_count VARCHAR(100) CHARACTER SET utf8);
  9. """
  10. conn = pymysql.connect(
  11. host='127.0.0.1',
  12. user='root',
  13. passwd='',
  14. port=3306,
  15. db='jd',
  16. charset='utf8',
  17. use_unicode=True
  18. )
  19. # print("连接成功")
  20. cursor = conn.cursor() # 执行完毕返回的结果集默认以元组显示
  21. # 向sql中插入数据
  22. try:
  23. sql = f"insert ignore into shuju111(brand,title,price,shop) values('{brand}','{title}','{price}','{shop}')"
  24. cursor.execute(sql) # 执行SQL语句
  25. # print("插入完一条语句")
  26. cursor.close() # 关闭光标对象
  27. conn.commit() # 提交
  28. conn.close() # 关闭数据库
  29. except:
  30. print("跳过1次插入")
  31. continue
  32. #向表中插入数据
  33. outws.cell(row=count, column=1, value=str(count - 1)) # 从第一行开始
  34. outws.cell(row=count, column=2, value=str(brand))
  35. outws.cell(row=count, column=3, value=str(title))
  36. outws.cell(row=count, column=4, value=str(price))
  37. outws.cell(row=count, column=5, value=str(shop))
  38. # outws.cell(row=count, column=6, value=str(CommentCount))
  39. count = count + 1 # 自动跳入下一行

二、数据处理

        对所爬取数据中无关数据进行清洗(符号的替换)

代码部分:

  1. # 调用函数模拟请求获取评论数
  2. def commentcount(product_id):
  3. url = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds="+str(product_id)+"&callback=jQuery8827474&_=1615298058081"
  4. res = requests.get(url, headers=headers)
  5. res.encoding = 'utf-8' #字符转换
  6. text = (res.text).replace("jQuery8827474(","").replace(");","") #替换掉前面出现的jQuery5597865
  7. text = json.loads(text) #将字符串转换为json格式
  8. comment_count = text['CommentsCount'][0]['CommentCountStr']
  9. comment_count = comment_count.replace("+", "")
  10. #对万进行操作,数据清洗
  11. if "万" in comment_count:
  12. comment_count = comment_count.replace("万","")
  13. comment_count = str(int(comment_count)*10000)
  14. return comment_count

三、

        调用数据库数据利用matplotlib.pyplot进行图像绘制(主要根据品牌、店铺、平均价格进行相关数据可视化)

品牌—数量可视化效果:

代码部分:

  1. #画品牌和数量的图表
  2. plt.title('品牌-数量')
  3. plt.xlabel('品牌')
  4. plt.ylabel('品牌数量')
  5. x = ['联想(lenovo)', 'Apple', '宏碁(acer)', '华为(HUAWEI)', 'ThinkPad', '戴尔(DELL)', '小米(MI)']
  6. y = [count_pp[item] for item in x]
  7. plt.bar(x, y)
  8. plt.show()

 店铺—数量可视化效果:

 

代码部分:

  1. #店铺及数量表
  2. count_dp = {'联想京东自营旗舰店':0,'联想京东自营官方旗舰店':0,'联想商用丽邦专卖店':0,
  3. '联想商用融合汇通专卖店':0,'联想扬天京东自营授权旗舰店':0}
  4. sql1 = "select * from shuju where brand = '联想(lenovo)' and id<24"#分析前二十个店铺
  5. cursor.execute(sql1)
  6. results1 = cursor.fetchall() # 以元组的形式返回
  7. for row in results1:
  8. count_dp[row['shop']] += 1
  9. plt.title('店铺-数量')
  10. plt.xlabel('店铺')#横坐标代表含义
  11. plt.ylabel('店铺数量')
  12. x = ['联想京东自营旗舰店','联想京东自营官方旗舰店','联想商用丽邦专卖店',
  13. '联想商用融合汇通专卖店','联想扬天京东自营授权旗舰店']
  14. y = [count_dp[item] for item in x]
  15. plt.bar(x, y)
  16. plt.show()

 品牌—价格可视化效果:

 代码部分:

  1. #根据平均价格分析
  2. plt.title('品牌-价格')
  3. plt.xlabel('品牌')
  4. plt.ylabel('品牌价格')
  5. x = ['联想(lenovo)', 'Apple', '宏碁(acer)', '华为(HUAWEI)',
  6. 'ThinkPad', '戴尔(DELL)', '小米(MI)']
  7. y = [price_total[item]/count_pp[item] for item in x]
  8. plt.bar(x, y)
  9. plt.show()

 品牌占比例可视化效果:

 代码部分:

  1. #饼图分析品牌占比
  2. explode = (0,0,0,0.1,0,0,0,0)
  3. candidate = [key for key in count_pp] #拿取品牌的键名
  4. votes = [value for value in count_pp.values()] #拿取品牌的键值
  5. plt.figure(figsize=(10, 10), dpi=100)
  6. plt.pie(votes, labels=candidate, explode=explode, autopct="%1.2f%%", shadow=False, startangle=90,
  7. textprops={'fontsize':15},labeldistance=1.05)
  8. #labels饼图外侧显示的说明文字,explode为突出某个值,autopct设置百分比小数位,shadow表示阴影,
  9. # startangle起始绘制角度,默认图是从x轴正方向逆时针画起,设定=90则从y轴正方向画起;
  10. # labeldistance:label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
  11. plt.legend(loc='upper right',fontsize=6) #设置图例位置和大小
  12. plt.title("各品牌占比")
  13. plt.axis('equal')
  14. plt.show()

 店铺占比例可视化效果:

 代码部分:

  1. #画环形饼图
  2. candidate1 = [key for key in count_dp] #拿取品牌的键名
  3. votes1 = [value for value in count_dp.values()] #拿取品牌的键值
  4. plt.figure(figsize=(10, 10), dpi=100)
  5. explode1=[0,0,0,0,0]
  6. plt.pie(votes1, labels=candidate1, explode=explode1, autopct="%1.2f%%", shadow=False, startangle=90,
  7. textprops={'fontsize':15},pctdistance=0.85,labeldistance=1.05)
  8. plt.pie([1],radius=0.7,colors='w') #在内部画一个白色的圆
  9. plt.legend(loc='upper left',fontsize=6)
  10. plt.title("各店铺占比")
  11. plt.axis('equal')
  12. plt.show()

四、说明

        代码仅提供主要部分,许多功能都可以优化改进,个人水平有限,仅供参考,勿喷谢谢

        遇到问题可以多百度!

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发