务场景:作为全球最大的 B2C 电子商务平台之一,京东平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入 JD 平台,JD 平台提供了丰富的 API 接口,其中商品详情接口是非常重要的一部分。大家有探讨稳定采集 JD 整站实时商品详情数据接口,通过该接口开发者可以更好地了解商品的情况,商品详情详细信息查询,数据参数包括:获取商品列表主图、价格、标题,sku,商品评论日期,评论内容,评论图片,买家昵称,追评内容,商品属性,追评属性图片等页面上有的数据完整解决方案帮助买家更准确地进行商品选购。这个引起了我技术挑战的兴趣。目前,自己做了压测,QPS 高、出滑块概率极低,API 整体稳定,可满足业务场景的性能需求。
python 爬虫 —— 用 **selenium**爬取京东整站商品信息
- 先附上效果图(我偷懒只爬了 4 页)
2.我这里是不加载图片,加快爬取速度,也可以用 Headless 无弹窗模式
options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'profile.managed_default_content_settings.images': 2})
#不加载图片
browser = webdriver.Chrome(options=options)
wait =WebDriverWait (browser,50)# 设置等待时间
url = 'https://www.jd.com/'
data_list = []# 设置全局变量用来存储数据
keyword="python 爬虫"# 关键词 【复制 v:Taobaoapi2014 获取请求调用链接http://c0b.cc/nIAWD4】
3.进入了第一页,先写好翻页的函数,需要滑动到底部才能加载后 30 个商品,总共有 60 个商品
ef next_page(page_number):
try:
# 滑动到底部
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep (random.randint (1, 3))# 设置随机延迟
button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.pn-next > em'))
)# 翻页按钮
button.click ()# 翻页动作
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(30)"))
)# 等到 30 个商品都加载出来
# 滑动到底部,加载出后三十个货物信息
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, "#J_goodsList > ul > li:nth-child(60)"))
)# 等到 60 个商品都加载出来
wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, "#J_bottomPage > span.p-num > a.curr"), str(page_number))
)# 判断翻页成功,高亮的按钮数字与设置的页码一样
html = browser.page_source# 获取网页信息
prase_html (html)# 调用提取数据的函数
except TimeoutError:
return next_page(page_number)
4.能正常翻页就简单很多了,开始抽取需要的商品信息,搜索不同的关键词,页面的布局会有变化,需要重新写定位商品信息
5.存储方法
def save_html():
content = json.dumps(data_list, ensure_ascii=False, indent=2)
#把全局变量转化为 json 数据
with open("jingdong.json", "a+", encoding="utf-8") as f:
f.write(content)
print ("json 文件写入成功")
with open('jingdong.csv', 'w', encoding='utf-8', newline='') as f:
# 表头
title = data_list[0].keys()
# 声明 writer
writer = csv.DictWriter(f, title)
# 写入表头
writer.writeheader()
# 批量写入数据
writer.writerows(data_list)
print ('csv 文件写入完成 ')
6.接口封装方法: 6.1.请求方式:HTTP POST GET ;请求链接:c0b.cc/nIAWD4 6.2代码展示
coding:utf-8
""" Compatible for python2.x and python3.x requirement: pip install requests """ from future import print_function import requests
请求示例 url 默认请求参数已经做URL编码
url = "api-gw.onebound.cn/jd/item_get…<您自己的apiKey>&secret=<您自己的apiSecret>&num_iid=10335871600" headers = { "Accept-Encoding": "gzip", "Connection": "close" } if name == "main": r = requests.get(url, headers=headers) json_obj = r.json() print(json_obj)