一、前言
有粉丝反映我怎么都不采集大厂的数据,比如像京东、淘宝、1688、小红书等。其实主要是这些大厂数据还真难采集,基本都要逆向,有的时候好不容易逆向出来,没过多久人家又改算法了,性价比不高。。。今天就用playwright通过web自动化的方式采集京东的数据,就算不会逆向也不怕。唯一的缺点就是速度太慢,但个人觉得如果只是需要几万条数据,这种方法还是挺好的,性价比高!
二、爬取目标
-
此API目前支持以下基本接口:
- item_get 获得JD商品详情
- item_search 按关键字搜索商品
- item_search_img 按图搜索京东商品(拍立淘)
- item_search_shop 获得店铺的所有商品
- item_history_price 获取商品历史价格信息
- item_recommend 获取推荐商品列表
- buyer_order_list 获取购买到的商品订单列表
- buyer_order_datail 获取购买到的商品订单详情
- upload_img 上传图片到JD
- item_review 获得JD商品评论
- cat_get 获得jd商品分类
三、完整源码 from lxml import etree
import csv
from playwright.sync_api import sync_playwright
def getListData():
with sync_playwright() as p:
browser_type = p.chromium
browser = browser_type.launch(headless=False)
page = browser.new_page(ignore_https_errors=True)
print('请手动登录京东账号!')
page.goto("https://passport.jd.com/uc/login")
page.wait_for_load_state("load")
isLogin = input("是否已经登录?(Y/n): ")
if isLogin=='Y':
with open('京东商品列表(雨刷).csv', 'a', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
for i in range(200):
try:
url = "https://list.jd.com/list.html?cat=6728,6742,6766&isList=1&page={}".format(i+1)
page.goto(url)
page.wait_for_load_state("load")
page.wait_for_timeout(300000)
html = etree.HTML(page.content())
lis = html.xpath("//ul[@class='gl-warp clearfix']/li")
for li in lis:
data_sku = li.xpath("./@data-sku")[0]
title = li.xpath(".//div[@class='p-name p-name-type-3']/a/em/text()")[0]
price = li.xpath(".//div[@class='p-price']//i/text()")[0]
commit = li.xpath(".//div[@class='p-commit']//a/text()")[0]
shop = li.xpath(".//span[@class='J_im_icon']/a/text()")[0]
print('商品ID:',data_sku)
print('标题:',title)
print('价格:',price)
print('评论数:',commit)
print('商店:',shop)
print('========================================================\n')
writer.writerow([data_sku, title, price, commit, shop])
except Exception as e:
print('采集网址:', url)
print('异常:', e)
print('========================================================\n')
browser.close()
def main():
getListData()
if __name__== "__main__" :
main()
四、爬取结果