首页 > 其他分享 >使用爬虫利器 Playwright,轻松爬取抖查查数据

使用爬虫利器 Playwright,轻松爬取抖查查数据

时间:2023-04-29 22:22:48浏览次数:39  
标签:Playwright E5% 22% 爬虫 goods 取抖 new total page

使用爬虫利器 Playwright,轻松爬取抖查查数据

我们先分析登录的接口,其中 url 有一些非业务参数:ts、he、sign、secret。

然后根据这些参数作为关键词,定位到相关的 js 代码。

最后,逐步进行代码的跟踪,发现大部分的代码被混淆加密了。

花费了大半天,来还原这些混淆加密的代码,但是也没有逆向出来。
走到这里就是个坑了,那没有其他的方法了吗?

我们换个思路,换道超车,使用自动化的方式,通过启动浏览器的方式,模拟用户的行为。
监听相关的网络请求,来拦截数据;虽然这种方式比较的蹩脚,但是也能达到数据爬取的目的。

使用 playwright 库实现自动化模拟登录

打开抖查查首页

# 打开抖查查首页
page.goto("https://www.douchacha.com/")

点击登录

# 点击 登录按钮
page.wait_for_timeout(random.randint(2, 5) * 1000)
page.click("xpath=//p[@class=\"login_txt\"]//span[@class=\"login\"]")

切换到手机号登录模式

page.wait_for_timeout(random.randint(2, 5) * 1000)
page.click("xpath=//a[@class=\"login_dialog_switch\"]")

填写手机号、密码、点击登录

# 填写 账号、密码
page.wait_for_timeout(random.randint(2, 5) * 1000)
page.fill("xpath=//input[@placeholder=\"请输入手机号\"]", "xxxxxx")
page.fill("xpath=//input[@placeholder=\"请输入密码\"]", "xxxxx")

# 点击 登录
page.wait_for_timeout(random.randint(2, 5) * 1000)
page.click("xpath=//div[@class=\"login_warp\"]//div[@class=\"login_input_warp\"]//button//span[contains(text(), \"登录\")]")

登录成功之后的 Cookie 数据,这里只展示部分数据。

[{
	"name": "HMACCOUNT_BFESS",
	"value": "4E58BF464182BB65",
	"domain": ".hm.baidu.com",
	"path": "/",
	"expires": 1716691140.784459,
	"httpOnly": false,
	"secure": true,
	"sameSite": "None"
}, {
	"name": "Hm_lvt_5e3b865d73ba569c052e9fb5792de511",
	"value": "1682131141",
	"domain": ".douchacha.com",
	"path": "/",
	"expires": 1713667155,
	"httpOnly": false,
	"secure": false,
	"sameSite": "Lax"
}]

爬取抖音的商品列表数据

将上面保存下来的 Cookie 数据,应用到其他的页面。

context = browser.new_context()
# 设置 cookie
with open("./cookies.txt", "r") as f:
    cookies = json.loads(f.read())
    context.add_cookies(cookies)
page = context.new_page()

打开搜索商品页面

# 打开抖查查商品搜索页面
page.goto("https://www.douchacha.com/searchshopdetail")

# 设置回调函数
page.on('response', response_callback)

数据回调函数,其实本质就是监听也 network 网络请求,然后进行过滤。

def response_callback(response):
    # 过滤出商品列表接口数据
    if '/api/tiktok/search/goods' in response.url and response.status == 200:
        print(response.json())

爬取到的商品数据,这里只展示部分数据。

{
	'code': 200,
	'msg': '',
	'data': {
		'result': [{
			'range_business_total_sales7_new': '200w+',
			'range_business_total_sales30_new': '200w+',
			'range_platform_sales': '0',
			'range_sales': '1000w+',
			'goods_id': '83419cd43abb55e4b6bab118c5ba75a10e25ada76a6e9530dabc307aab72869d',
			'title': '【9.99元150包】宣美乐小麻花香酥可口休闲解馋零食六种口味混合',
			'big_title': '【9.9元150包】宣美乐小麻花香酥可口休闲解馋零食六种口味混合装',
			'image': 'https://p26-item.ecombdimg.com/img/ecom-shop-material/v1_MIjPNXI_71166834225882893150966_fe71d81300602fd5d766f1b1ff74671c_sx_205628_www1022-1022~tplv-5mmsx3fupr-resize:1080:1080.jpeg',
			'sales': '15987150',
			'platform_sales': '0',
			'price': '999',
			'last_update_time': '1682125751327',
			'promotion_id': '3609573447434420470',
			'brand': 'XUANMEILE/宣美樂',
			'business_total_pv': '0',
			'business_total_user': '0',
			'view_count': '36208',
			'coupon_price': 0.0,
			'cos_fee': '150',
			'cos_fee_scale': 0.1505,
			'goods_source': '小店',
			'goods_source_type': 2,
			'market_price': '999',
			'detail_url': 'https://haohuo.jinritemai.com/ecommerce/trade/detail/index.html?id=3609573286356382944&origin_type=2002170010&origin_id=99514375927_3609573447434420470&alkey=1128_99514375927_0_3609573447434420470_011&sec_author_id=MS4wLjABAAAA2I9NdgAKZrz9e0tLm1csyDMNqLESPDm34TdYYqXe8-I&from_link=1&c_biz_combo=2&use_link_command=1&goods_detail=%7B%22title%22%3A%22%E3%80%909.99%E5%85%83150%E5%8C%85%E3%80%91%E5%AE%A3%E7%BE%8E%E4%B9%90%E5%B0%8F%E9%BA%BB%E8%8A%B1%E9%A6%99%E9%85%A5%E5%8F%AF%E5%8F%A3%E4%BC%91%E9%97%B2%E8%A7%A3%E9%A6%8B%E9%9B%B6%E9%A3%9F%E5%85%AD%E7%A7%8D%E5%8F%A3%E5%91%B3%E6%B7%B7%E5%90%88%22%2C%22sales%22%3A15987150%2C%22img%22%3A%7B%22uri%22%3A%22ecom-shop-material%2Fv1_MIjPNXI_71166834225882893150966_fe71d81300602fd5d766f1b1ff74671c_sx_205628_www1022-1022%22%2C%22url_list%22%3A%5B%22https%3A%2F%2Fp3-item.ecombdimg.com%2Fimg%2Fecom-shop-material%2Fv1_MIjPNXI_71166834225882893150966_fe71d81300602fd5d766f1b1ff74671c_sx_205628_www1022-1022~tplv-5mmsx3fupr-image.png%22%2C%22https%3A%2F%2Fp26-item.ecombdimg.com%2Fimg%2Fecom-shop-material%2Fv1_MIjPNXI_71166834225882893150966_fe71d81300602fd5d766f1b1ff74671c_sx_205628_www1022-1022~tplv-5mmsx3fupr-image.png%22%5D%2C%22width%22%3A100%2C%22height%22%3A100%7D%2C%22min_price%22%3A999%2C%22max_price%22%3A999%7D&detail_schema=sslocal%3A%2F%2Fec_goods_detail%3Fpromotion_id%3D3609573447434420470%26product_id%3D3609573286356382944%26item_id%3D0%26kol_id%3D99514375927%26enter_from%3Dcopy%26source_page%3Dcopy%26meta_params%3D%26request_additions%3D%257B%2522from_internal_feed%2522%253A%2522false%2522%252C%2522cps_track%2522%253A%2522%2522%252C%2522marketing_channel%2522%253A%2522%2522%257D&h5_origin_type=detail_share',
			'video_exceptlive': 0.12,
			'live_except_video': 0.88,
			'video_count30': '1183',
			'user_count30': '2187',
			'live_count30': '3880',
			'conversion_rate30': 1.0,
			'video_count7': '1103',
			'user_count7': '2091',
			'live_count7': '3633',
			'video_count_y': '103',
			'user_count_y': '640',
			'live_count_y': '741',
			'business_total_sales7_new': '2288800',
			'live_sales_grow30': '0',
			'video_sales_grow30': '0',
			'goods_video_rate': 0.0,
			'goods_live_rate': 0.0,
			'business_total_sales30_new': '2740500',
			'first_cid': '8',
			'second_cid': '20018',
			'thrid_cid': '20312',
			'shop_id': 'd5e2b4885996eff784d18feca4291b3f',
			'brand_id': '3943caf2696213efef6d630cfe883ce3b4b3a448335aa2b1a75b9ada4f557da2',
			'status': 1,
			'up_status': 1,
			'percent': 89.5306,
			'good_rate': 0.8953068592057761,
			'has_speci': True,
			'range_business_total_sales_y_new': '46w+',
			'business_total_sales_y_new': '466200'
		}],
		'page_no': '1',
		'page_size': '10',
		'total_page': '1564721',
		'total_record': '15647209',
		'show_original_data': False,
		'user_grade': 'FREE',
		'data_max': 10
	}
}

小结

  • 抖查查所有的接口都进行了签名校验,及 js 代码混淆加密,逆向难度高。
  • 变换思路,使用 playwright 自动化的方式模拟登录,及接口数据拦截。
  • 最终,达到数据爬取的目的;当然,最好的方式是能够反混淆逆向 js 代码。
  • 最后,声明本篇文章仅供学习参考,网络不是法外之地,切勿进行非法用途。
  • 源代码 Github 地址:https://github.com/yxhsea/mock_login/tree/master/douchacha

标签:Playwright,E5%,22%,爬虫,goods,取抖,new,total,page
From: https://www.cnblogs.com/yxhblogs/p/17364568.html

相关文章

  • python+playwright 学习-59 grant_permissions 设置默认允许麦克风和摄像头等权限
    前言有些场景在使用的时候,会弹出一些权限框,比如麦克风和摄像头等,通过监听alert是没法捕获的。正确做法是给浏览器设置默认允许麦克风和摄像头等权限,不让弹窗出来。使用context的grant_permissions方法加权限。权限框弹窗示例这种弹窗是权限窗,不是alert解决办法context有个gr......
  • python+playwright 学习-58 Jenkins上使用 Pipeline 运行 playwright 自动化脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。jenkins环境准备需安装2个跟docke......
  • python+playwright 学习-57 svg 元素拖拽
    前言SVG英文全称为ScalablevectorGraphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过name()函数来进行定位。本篇讲下关于svg元素的拖拽相关操作。拖拽svg元素如图所示,svg下的circle元素是可以拖动的比如往右拖动100个像素,那么cx的值由原来的cx="100"变成cx="200"通......
  • python+playwright 学习-56 svg 元素定位
    前言SVG英文全称为ScalablevectorGraphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过name()函数来进行定位。svg元素定位如下看到的svg标签,就是svg元素用普通的标签定位,是无法定位的,如xpath的//svg只能通过name()函数来定位//*[name()="svg"]页面上用多个svg元素如果......
  • python+playwright 学习-55 在docker 容器中运行playwright脚本
    前言Dockerfile.focal可用于在Docker环境中运行Playwright脚本。这些镜像包括在Docker容器中运行浏览器所需的所有依赖项,还包括浏览器本身。playwright在linux系统上目前只支持Ubuntu系统的部分版本,centos和debian系统上是没法运行的。镜像查看所有可用的图像标签https:......
  • Python之路【第十九篇】:爬虫
    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.RequestsPython标准库中提供了:urllib、urllib2、httplib等模块......
  • 异步爬虫例子之asyncio
    异步爬虫例子:importtimeimportaiohttpimportasyncioimportreimportosos.environ['NO_PROXY']='www.baidu.com'classAsyn():def__init__(self):self.__headers={'authority':......
  • Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫
    Selenium和PhantomJS结合在一起,就可以运行一个非常强大的网络爬虫   测试人员的最佳11种开源自动化Selenium1)RobotFrameworkRobotFramework是一个开源自动化系统,它使用关键字驱动的方法进行验收测试驱动开发(ATDD)和验收测试。该工具组织了各种测试自动化要求......
  • Playwright复杂定位
    select下拉框先定位到下拉框,然后通过select_option选择值#下拉框通过值单选page.get_by_label('a').select_option('x')#下拉框通过label单选page.get_by_label('a').select_option(label='p')#下拉框通过值多选page.get_by_label('a').select_option([......
  • Playwright基本定位
    css定位如在css定位为#kw的位置输入内容,如下写法均可:page.locator('#kw').fill("输入的内容")page.locator('css=#kw').fill("输入的内容")page.fill('#kw','输入的内容')#可以不写css=或xpath=,会自动判断是cssg还是xpath如在css定位为#su的位置点击,如下写法均可:......