前言
大家早好、午好、晚好吖 ❤ ~
环境介绍:
- python 3.8 越稳定越好
- pycharm 2021专业版
一、考拉
模块使用:
- requests >>> pip install requests
- parsel >>> pip install parsel
代码展示
导入模块
# import 导入模块
import requests # 第三方模块 额外安装 内置: 不需要你额外安装
import parsel # 第三方模块 专门用来html标签数据
import csv # 表格 内置模块
with open('考拉海购.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(['title', 'price', 'comments', 'address', 'selfflag', 'img_url', 'href'])
# 字典
1. 发送请求
response = requests.get(url=url, headers=headers)
<Response [200]>: 请求成功
2. 获取数据
html_data = response.text
3. 解析数据
html css javascript(JS)
前端网页制作三剑客
html(html源代码):
展示数据内容的
css:
页面变得更加美观的
js:
页面设计的有动态效果的
数据, 提取
.goodswrap.promotion
select = parsel.Selector(html_data)
goods = select.css('.goodswrap.promotion')
for good in goods:
# 详情页链接
href = good.css('.title::attr(href)').get()
# 图片链接
img_url = good.css('.imgtag::attr(src)').get()
# 价格
price = good.css('.bigPrice::text').get()
# 标题
title = good.css('h2::text').get()
title = title.replace('\n', '')
# 评论数
comments = good.css('.comments::text').get()
# 地址
address = good.css('.proPlace.ellipsis::text').get()
# 商铺名称
selfflag = good.css('.selfflag span::text').get()
if selfflag == "" or selfflag == None:
selfflag = good.css('.selfflag a::text').get()
print(title, price, comments, address, selfflag, img_url, href)
# 文件名称
# 写入方式 追加写入
# 编码
with open('考拉海购.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow([title, price, comments, address, selfflag, img_url, href])
PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取
二、苏宁
模块使用:
- selenium >>> pip install selenium
3.141.0 Python当中的模块 操作 浏览器的驱动 - Chrome浏览器
- Chromedriver
浏览器驱动 操作浏览器 让 浏览器帮助我们去执行一些操作
思路:
日常如何打开浏览器查看商品的
代码就如何编写
- 用selenium打开一个谷歌浏览器
- 用谷歌浏览器 打开网站
- 提取商品信息 滚动
代码展示
导入模块
from selenium import webdriver # 第三方模块 3.141.0 pip install selenium==3.141.0 pip uninstall selenium
import time
import csv
mode='a':
追加写入数据
encoding='utf-8':
编码方式 excel打开可能会出现中文乱码 换个软件打开 wps 或者换一个编码方式 gbk
newline='':
数据空行
f = open('suning.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
写入表头
csv_writer.writerow(['title', 'price', 'comment', 'store', 'detail_url'])
执行页面滚动的操作
def drop_down():
for x in range(1, 12, 2):
time.sleep(1)
j = x / 9
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
driver.execute_script(js)
def get_next():
divs = driver.find_elements_by_css_selector('.product-box')
针对divs:
所有的商品信息, 进行二次提取
for div in divs:
# 针对每个商品==div
# 价格 + 名称 + 评论
# .text: 提取标签 文本内容
# .get_attribute('href'): 提取标签的属性内容
# <a class='' href='' sa-data=''>
price = div.find_element_by_css_selector('.def-price').text
title = div.find_element_by_css_selector('.title-selling-point').text
comment = div.find_element_by_css_selector('.info-evaluate').text
store = div.find_element_by_css_selector('.store-stock').text
detail_url = div.find_element_by_css_selector('.title-selling-point a').get_attribute('href')
print(title, price, comment, store, detail_url)
csv_writer.writerow([title, price, comment, store, detail_url])
chromedriver.exe
放到 python.exe
同级目录下
谷歌浏览器(正版的) + 谷歌驱动(操作浏览器的一个程序 版本号)
1.用selenium打开一个谷歌浏览器
driver = webdriver.Chrome()
for page in range(0, 50):
2.用谷歌浏览器 打开网站
3.下拉页面
drop_down()
4.提取数据 代码方式提取
get_next()
PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取
三、淘
模块使用:
- requests 模块
代码展示
导入模块
import requests # 发送请求 第三方模块
import re
import json
import csv
with open('淘宝.csv', encoding='utf-8', mode='a', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(['raw_title', 'view_price', 'item_loc', 'view_sales', 'comment_count', 'nick', 'detail_url'])
伪装
- 发送请求
response = requests.get(url=url, headers=headers)
- 获取数据
html_data = response.text
- 解析数据
g_page_config = ();
re.findall('g_page_config = (.*);', html_data):
匹配规则 匹配完数据之后 会把符合规则的所有内容全部返回 []
.*:
贪婪匹配模式 匹配到最后一个;结束
g_page_config = (.*?);
.*?:
非贪婪模式 匹配到第一;结束
json_str = re.findall('g_page_config = (.*);', html_data)[0]
json_dict = json.loads(json_str)
字典 键值对取值
auctions = json_dict['mods']['itemlist']['data']['auctions']
for auction in auctions:
# auction代表每一个商品
raw_title = auction['raw_title']
view_price = auction['view_price']
item_loc = auction['item_loc']
try:
view_sales = auction['view_sales'] # 销量
except:
view_sales = 0
comment_count = auction['comment_count']
nick = auction['nick']
detail_url = auction['detail_url']
print(raw_title, view_price, item_loc, view_sales, comment_count, nick, detail_url)
- 保存数据
with open('淘宝.csv', encoding='utf-8', mode='a', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow([raw_title, view_price, item_loc, view_sales, comment_count, nick, detail_url])
四、唯
模块使用:
- requests —> pip install requests
- csv 内置模块 不需要安装
基本流程思路: <通用/固定流程模板>
一. 数据来源分析:
- 明确需求: 明确采集数据内容是什么
- 采集口红商品数据
- 通过浏览器自带工具:
开发者工具, 进行抓包分析 <无论采集那个网站什么数据, 都要抓包分析一下数据来源>
- 打开开发者工具: F12 或者 鼠标右键点击检查选择 network <网络面板>
- 刷新网页: 让本网页数据内容, 重新加载一遍
- 通过搜索功能, 去查询找到, 商品所对应url地址<数据包>
唯品会商品数据结构:
整页商品一共是120条数据内容, 分成三组: 前50, 中50, 后20 —> 对应就有三个url地址
分析这三个url地址, 请求参数变化 —> 改变商品ID —> 分析商品ID在什么地方可以一次性获得到
想要获取商品数据信息 —> 请求三个链接, 把商品ID切片分成三组 —> 商品ID
二. 代码实现步骤:
I. 获取所有商品ID:
- 发送请求, 模拟浏览器对于 url地址<商品ID数据包> 发送请求
- 获取数据, 获取服务器返回响应数据内容
开发者工具当中所看到 --> response - 解析数据, 提取我们想要数据内容
- 商品ID 120个全部获取下来
II. 获取所有商品数据信息
- 发送请求, 模拟浏览器对于 url地址<商品信息数据包> 发送请求
- 获取数据, 获取服务器返回响应数据内容
开发者工具当中所看到 --> response - 解析数据, 提取我们想要数据内容
- 商品基本信息
- 保存数据, 把商品数据信息, 保存表格文件里面
代码展示
# 导入数据请求模块
import requests
# 导入格式化输出模块
from pprint import pprint
# 导入csv模块
import csv
f = open('口红_1.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'品牌',
'售价',
'原价',
'折扣',
'色系',
'妆感',
'类型',
'是否套装',
'商品属性',
'详情页',
])
csv_writer.writeheader()
def Shop(shop_id):
shop_data = {
'app_name': 'shop_pc',
'app_version': '4.0',
'warehouse': 'VIP_HZ',
'fdc_area_id': '104103101',
'client': 'pc',
'mobile_platform': '1',
'province_id': '104103',
'api_key': '70f71280d5d547b2a7bb370a529aeea1',
'user_id': '',
'mars_cid': '1655447722495_62c422a2b0d263186b2d64412108655f',
'wap_consumer': 'a',
'productIds': shop_id,
'scene': 'search',
'standby_id': 'nature',
'extParams': '{"stdSizeVids":"","preheatTipsVer":"3","couponVer":"v2","exclusivePrice":"1","iconSpec":"2x","ic2label":1,"superHot":1,"bigBrand":"1"}',
'context': '',
'_': '1669032748487',
}
json_data = requests.get(url=link, params=shop_data, headers=headers).json()
for index in json_data['data']['products']:
attrs = ','.join([attr['name'] + ':' + attr['value'] for attr in index['attrs']])
# 色系:红调,妆感:哑光,类型:唇釉,是否套装:是
colour = index['attrs'][0]['value'] # 色系
feel = index['attrs'][1]['value'] # 妆感
kid = index['attrs'][2]['value'] # 类型
Tao = index['attrs'][-1]['value'] # 是否套装
dit = {
'标题': index['title'],
'品牌': index['brandShowName'],
'售价': index['price']['salePrice'],
'原价': index['price']['marketPrice'],
'折扣': index['price']['mixPriceLabel'],
'色系': colour,
'妆感': feel,
'类型': kid,
'是否套装': Tao,
'商品属性': attrs,
'详情页': shop_url,
}
print(dit)
csv_writer.writerow(dit)
except:
pass
for page in range(0, 1200, 120):
data = {
# 'callback': 'getMerchandiseIds',
'app_name': 'shop_pc',
'app_version': '4.0',
'warehouse': 'VIP_HZ',
'fdc_area_id': '104103101',
'client': 'pc',
'mobile_platform': '1',
'province_id': '104103',
'api_key': '70f71280d5d547b2a7bb370a529aeea1',
'user_id': '',
'mars_cid': '1655447722495_62c422a2b0d263186b2d64412108655f',
'wap_consumer': 'a',
'standby_id': 'nature',
'keyword': '口红',
'lv3CatIds': '',
'lv2CatIds': '',
'lv1CatIds': '',
'brandStoreSns': '',
'props': '',
'priceMin': '',
'priceMax': '',
'vipService': '',
'sort': '0',
'pageOffset': '0',
'channelId': '1',
'gPlatform': 'PC',
'batchSize': '120',
'_': '1669032748485',
}
response = requests.get(url=url, params=data, headers=headers)
products = [i['pid'] for i in response.json()['data']['products']]
product_id_1 = ','.join(products[:50]) # 0-49 顾头不顾尾 把列表合并为字符串 str.join(list)
product_id_2 = ','.join(products[50:100]) # 50-99 顾头不顾尾
product_id_3 = ','.join(products[100:]) # 100-最后 顾头不顾尾
Shop(shop_id=product_id_1)
Shop(shop_id=product_id_2)
Shop(shop_id=product_id_3)
数据对比这个你们就自己去弄吧,博主累了~
尾语 💝
好了,今天的分享就差不多到这里了!