本帖最后由 Test_dada 于 2021-1-20 10:06 编辑
前言:
本贴仅做学习交流,请勿用于商业牟利
如有侵权,联系处理
觉得有用的点赞下,谢谢
数据准备:
先创建表格,路径:C:\Users\Administrator\Desktop\亚马逊畅销数据爬取.xlsx
表格共有四个数据(商品名、图片、星级、销量)
该代码是单线程运行,数据量过多时,会有数据重复的情况
有时间再改造,有能力的小伙伴可改为多线性运行
[Python] 纯文本查看 复制代码 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 =[size=2]{'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}[/size]
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([o.get("alt"), o.get("src"), num[0], num[1]])
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[0]) # 写入商品名
new_worksheet.write(nrows, 1, data[1]) # 图片链接
new_worksheet.write(nrows, 2, data[2]) # 评星
new_worksheet.write(nrows, 3, data[3]) # 评论数
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行代码编辑时,自动添加了一些格式代码,不知道怎么去除,小伙伴复制后自行删除那些[size]就可以了
然后就是,爬不出数据时,也是在44行修改成你自己的headers参数就可以了,具体在哪看
|