Test_dada 发表于 2020-11-27 15:12

【爬虫】亚马逊畅销数据爬取Demo

本帖最后由 Test_dada 于 2021-1-20 10:06 编辑

前言:
本贴仅做学习交流,请勿用于商业牟利
如有侵权,联系处理
觉得有用的点赞下,谢谢


数据准备:
先创建表格,路径:C:\Users\Administrator\Desktop\亚马逊畅销数据爬取.xlsx
表格共有四个数据(商品名、图片、星级、销量)

该代码是单线程运行,数据量过多时,会有数据重复的情况
有时间再改造,有能力的小伙伴可改为多线性运行
import bs4
import requests
import time
import datetime
from random import random
import xlrd
import re
from xlutils.copy import copy
from pprint import pprint

class Amazon_Demo():
    '''畅销商品抓取Demo'''
    def __init__(self, data_path, num=10):
      self.num = num
      self.data_path = data_path

    def timestamp(self):
      '''当前时间转换为时间戳'''
      now = datetime.datetime.now()
      # print(now.timetuple(), type(now.timetuple()))# timetuple()返回 struct_time时间元组
      timestamp = time.mktime(now.timetuple())# mktime()接收时间元组转换为时间戳
      return int(timestamp)

    def urls(self):
      ''' 多页面url汇总
            num: 要爬取的页面数
      '''
      URL = []
      for n in range(1, self.num+1):
            Url = "https://www.amazon.com/s?i=specialty-aps&srs=17938598011&page={0}&language=zh&qid={1}&ref=sr_pg_{0}".format(n,self.timestamp())
            URL.append(Url)
      return URL


    def active_demand(self):
      '''亚马逊最畅销商品信息抓取'''
      n = 1
      srcObj_list = []# 存放商品信息
      pprint(self.urls())
      for url1 in self.urls():
            print("抓取第%d页中... ..."%n)
            
            # 修改头部信息
            kv ={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
            req = requests.get(url1,headers=kv)
            # print("当前头部信息:",req.request.headers)
            # print("响应状态码:",req.status_code)
            time.sleep(random() + 2)# random() 产生 0 到 1 之间的随机浮点数
            req.encoding="utf-8"
            bs = bs4.BeautifulSoup(req.text,features="lxml")

            obj = bs.find_all("div",{"class":"a-section aok-relative s-image-fixed-height"})    # 图片所在父级
            imgObj=[] # 用于存储img对象
            for s in obj:
                imgObj.append(s.find('img'))
            # pprint(imgObj)

            obj2 = bs.find_all("div",{"class":"a-row a-size-small"})    # 星级、评论数所在父级

            for i,o in zip(obj2,imgObj):
                num = re.findall(r'span aria-label="(.+?)">',str(i))    # 转换HTML格式为str后,正则截取评论数、星级
                srcObj_list.append(, num])
            n += 1
      print("抓取商品信息总数:%d条"%len(srcObj_list))
      return srcObj_list

    def Write(self):
      '''xlrd读取'''
      workbook = xlrd.open_workbook(self.data_path)
      sheetName = workbook.sheet_by_name("aaa")
      nrows = sheetName.nrows# 当前表格行数
      # print(nrows)

      '''xlrd写入'''
      new_workbook = copy(workbook)# 将xlrd对象拷贝转化为xlwt对象
      new_worksheet = new_workbook.get_sheet(0)# 获取转化后工作簿中的第一个表格

      datas = self.active_demand()
      for data in datas:
            new_worksheet.write(nrows, 0, data)    # 写入商品名
            new_worksheet.write(nrows, 1, data)    # 图片链接
            new_worksheet.write(nrows, 2, data)    # 评星
            new_worksheet.write(nrows, 3, data)    # 评论数
            nrows += 1
      new_workbook.save(self.data_path)# 保存工作簿
      print("数据写入成功!")

if __name__ == '__main__':
    file_path = r'C:\Users\Administrator\Desktop\亚马逊畅销数据爬取.xlsx'    # 保存路径
    Amazon_Demo(file_path).Write()
结果



第44行代码编辑时,自动添加了一些格式代码,不知道怎么去除,小伙伴复制后自行删除那些就可以了
然后就是,爬不出数据时,也是在44行修改成你自己的headers参数就可以了,具体在哪看


Test_dada 发表于 2021-1-20 10:08

前面还是会有爬不出数据的情况,所以后面在headers上又添加了一些参数,具体是在第44行替换的

kv = {'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}

Test_dada 发表于 2021-3-26 11:43

一只帅祖宗 发表于 2021-3-25 16:05
楼主帮我看看这是怎么回事???

1.菜单-运行-cmd 打开命令窗口
2.输入pip list
3.查看xlrd库的版本(我是旧版1.20)
4.如果不是1.20版本,卸载新版,再安装旧版pip install xlrd==1.2.0

原因:xlrd更新到了2.0.1版本,只支持.xls文件,不支持.xlsx。

invzw 发表于 2020-11-27 15:27

大神,能不能做个虾皮电商平台的畅销数据爬取

Test_dada 发表于 2020-11-27 15:29

invzw 发表于 2020-11-27 15:27
大神,能不能做个虾皮电商平台的畅销数据爬取

python号称是,只要能看到的就能操作

c77187326 发表于 2020-11-27 15:52

学习下,感谢分享

费路哥尼 发表于 2020-11-27 15:58

学习了谢谢分享

qw345tyu 发表于 2020-11-27 16:10

很实用,感谢楼主分享代码!

Doerchan 发表于 2020-11-27 16:47

axf 发表于 2020-11-27 17:45

最近在学py{:301_998:}

lccasp 发表于 2020-11-27 18:08

我看代码是自己手动定义爬取页数,可以稍微做个获取页码的操作就更好了

BlueZ0514 发表于 2020-11-27 18:33

学习学习,感谢分享
页: [1] 2 3 4 5 6
查看完整版本: 【爬虫】亚马逊畅销数据爬取Demo