跳过selenium检测爬取淘宝直通车

2023-11-17

最近,有对阿里商家端进行一些数据爬取,这次爬取的是直通车人群溢价数据,发现对selenium的检测相当厉害,然而我的回答是,你强任你强,清风拂山岗。咱人工登录怕过谁,什么cokies,user-agent,selenium检测,token,统统与我无瓜,我们的宗旨就是,能用就行

核心就是,打开真实浏览器,用selenium接管,登录之后,再关闭提示框,立刻开始爬虫
os.system('cd "C:\\Program Files (x86)\\Google\\Chrome\\Application"&start chrome.exe --remote-debugging-port=9999 --user-data-dir="C:\selenum\AutomationProfile" https://subway.simba.taobao.com')
在这里插入图片描述
顺便用tkinter简单搞了个账号密码提示框,省的老去找

直接上代码

# -*- coding: utf-8 -*-
import os
import re
import time
from datetime import date, timedelta
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
from user_pass import time_count



def main():
	"""
	人群溢价爬取

	"""
	#打开本地chrome,同时打开直通车登录页面,需要提前配置环境变量path
	os.system('cd "C:\\Program Files (x86)\\Google\\Chrome\\Application"&start chrome.exe --remote-debugging-port=9999 --user-data-dir="C:\selenum\AutomationProfile" https://subway.simba.taobao.com')

	chrome_debug_port = 9999
	chrome_options = Options()
	# chrome_options.add_argument('--headless')
	chrome_options.add_experimental_option("debuggerAddress", f"127.0.0.1:{chrome_debug_port}")

	#selenium接管当前网页
	browser = webdriver.Chrome(options=chrome_options)
	wait = WebDriverWait(browser, 15)
	print(browser.title)

	# 当前句柄,以防有iframe,事实是我想多了
	current_handle = browser.current_window_handle
	print("准备好,爬虫开始:")

	# 账号密码提示:
	time_count()

	# 进入推广页面
	url = 'https://subway.simba.taobao.com/#!/manage/campaign/index'
	browser.get(url)
	time.sleep(3)

	# 获取cookies
	# cookies = browser.get_cookies()
	# jsonCookies = json.dumps(cookies)
	# # 把cookies保存在本地
	# with open('ffCookies.json', 'w') as f:
	# 	f.write(jsonCookies)
	# time.sleep(2)

	# 获取人群数据
	get_CrowdDetail(browser,wait)
	browser.close()

# 获取人群溢价数据
def get_CrowdDetail(browser,wait):
	# 计数器
	count = 0
	#设定开始与结束时间
	startDate = str((date.today() + timedelta(days=-7)).strftime("%Y-%m-%d"))
	endDate = str((date.today() + timedelta(days=-1)).strftime("%Y-%m-%d"))
	print('爬取日期:'+startDate+'至'+endDate)

	#保存好要爬取的人群溢价网址,如果能得到campaignId,adGroupId两个关键字段大可不必这样麻烦,可直接F12从xhr中获取
	CrowDetail = {
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1745413653&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1745413655&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1745413656&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1745413657&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1850331434&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281901&adGroupId=1877620378&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66173371&adGroupId=1733518315&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66173370&adGroupId=1734092022&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66173370&adGroupId=1734092023&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1732352485&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1732352486&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1732352487&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1732352489&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1855117081&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66157385&adGroupId=1881028817&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66281882&adGroupId=1732330386&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66145329&adGroupId=1739717496&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1',
		'https://subway.simba.taobao.com/#!/manage/adgroup/detail?productId=101001005&tab=crowd&campaignId=66145329&adGroupId=1739717497&start='+startDate+'&end='+endDate+'&rptType=realTime&adpage=1'
	}


	for i in CrowDetail:
		count=count+1
		header = []
		# 访问网址,准备获取数据
		browser.get(i)
		wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="manage-common-view-list"]//div[@class="freeze-table bp-table"]//div[@class="table-content osx custom-scrollbar"]//table[@class="bp-table"]/tbody/tr/td[3]')))
		print('当前访问网址:'+i)
		time.sleep(1.5)
		#解析page_source
		source = etree.HTML(browser.page_source)
		title = source.xpath('//*[@id="magix_vf_main"]/article/div[@class="grid-p clearfix"]//ul/li[5]/div/div/span[1]')[0].text
		product= source.xpath('//*[@id="magix_vf_main"]/article//div[@class="adgroup-detail"]/p//a')[0].text
		people_list = source.xpath('//div[@class="manage-common-view-list"]//div[@class="freeze-table bp-table"]//div[@class="freeze-col"]//table[@class="bp-table"]/tbody/tr')
		info_list = source.xpath('//div[@class="manage-common-view-list"]//div[@class="freeze-table bp-table"]//div[@class="table-content osx custom-scrollbar"]//table[@class="bp-table"]/tbody/tr')
		time.sleep(1.5)
		#获取标题等信息
		for people in people_list:
			t = {}
			if people.xpath('./td[2]/strong'):
				t['标题'] = title
				t['产品'] = product
				t['序号'] = people.xpath('./@index')[0]
				t['状态'] = people.xpath('./td[2]/strong')[0].text
				t['推广人群'] = people.xpath('./td[3]/div[1]/span')[0].text

				#获取详细信息
				for detail in info_list:
					if detail.xpath('./@index')[0]==t['序号'] and detail.xpath('./td[1]/div'):
						t['对应序号'] = detail.xpath('./@index')[0]
						t['人群分类'] = detail.xpath('./td[1]/div')[0].text
						t['溢价'] = detail.xpath('./td[2]/div/span/span')[0].text
						t['展现'] = detail.xpath('./td[3]')[0].text
						t['点击'] = detail.xpath('./td[4]')[0].text
						t['CTR'] = detail.xpath('./td[5]')[0].text
						t['花费'] = detail.xpath('./td[6]')[0].text
						t['CPC'] = detail.xpath('./td[7]')[0].text
						t['加购数'] = detail.xpath('./td[8]')[0].text
						t['转化率'] = detail.xpath('./td[9]')[0].text
						t['成交金额'] = detail.xpath('./td[10]')[0].text
						t['ROI'] = detail.xpath('./td[11]')[0].text
						t['成交订单'] = detail.xpath('./td[12]')[0].text
						header.append(t)
						print('已获取:' + t['标题'] + '-' + t['产品'] + '-' + t['推广人群'])
						#re.findall("[0-9\,\.]*",)

		#写入本地CSV文件
		df = pd.DataFrame(header)
		if count==1:
			df.to_csv('./dd.csv', index=None, encoding='utf-8-sig', mode='a')
		else:
			df.to_csv('./dd.csv', index=None, encoding='utf-8-sig', mode='a', header=None)
		time.sleep(1)
		print('已保存该数据到本地dd.csv文件夹')




if __name__ == '__main__':
	main()
	print("结束---------------------------------")

小提示框user_pass.py


import tkinter

def close():
	root.destroy()


def time_count():
	global  root
	#创建应用程序窗口,设置标题和大小
	root = tkinter.Tk()
	root.wm_attributes('-topmost',1)
	root.title('我只是一个提示框')
	root['width'] = 200
	root['height'] = 110
	#不允许改变窗口大小
	root.resizable(False, False)


	#创建Text组件,放置一些文字
	richText = tkinter.Text(root, width=50)
	richText.place(x=10, y=10, width=180, height=30)
	richText.insert('0.0', '你的账号')

	eeText = tkinter.Text(root, width=50)
	eeText.place(x=10, y=40, width=180, height=30)
	eeText.insert('0.0', '你的密码')



	#显示关闭按钮
	buff = tkinter.Button(root,text="关闭",command=close)
	buff.place(x=70, y=75, width=50, height=30)
	root.mainloop()

最终的结果是这样的(销售数据未展示)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跳过selenium检测爬取淘宝直通车 的相关文章

随机推荐

  • CFileDialog 多文件选择注意事项

    当选择文件数量比较多的时候 发现CFileDialog返回文件名并不完整 翻阅MSDN发现文件名长度是有限制的 解决思路 CFileDialog dlgOpen TRUE T txt NULL OFN HIDEREADONLY OFN RE
  • 【转】游戏汉化之Tile全格式解读 by 阿一

    最近在破解一些图片的格式 并想导出PNG 不过老是记不住bpp的格式 转载之 方便查看 做些锚记 标准1BPP NDS 1BPP 标准2BPP VB 2BPP NGP 2BPP NES 2BPP 1BPP 1BPP GB 2BPP 1BPP
  • SpringCloud2架构图

    先来个简洁版 1 外部或者内部的非Spring Cloud项目都统一通过API网关 Zuul 来访问内部服务 zuul是对外暴露的唯一接口相当于路由的是controller的请求 2 网关接收到请求后 从注册中心 Eureka 获取可用服务
  • Unity泛光效果消失问题

    关于Unity泛光效果消失问题解决过程 问题描述 第一次尝试解决 第二次尝试解决 第三次尝试解决 问题描述 之前一直在做的一个项目 在一次想要添加UI泛光效果失败后 发现项目中已有的泛光效果也消失了 第一次尝试解决 因为问题是在添加插件Po
  • linux服务器编译报错:DSO missing from command line原因及解决办法

    报错信息提示包含以下两行 undefined reference to symbol libfastrtps so 1 error adding symbols DSO missing from command line 原因 提示说符号没
  • SpringMVC异常处理

    为了统一处理代码运行过程中出现的异常 给用户一个更友好的异常界面 需要引入springMVC的异常处理功能 为了演示这个功能 本文实现一个比较常用的需求 将所有的异常归为两类 一类是程序员自己创建的异常类 另一类是系统或框架定义的异常类 程
  • junit如何测试没有返回值的方法

    方法里总有些操作 只要测试结果对就可以了 没有必要说非要有返回值 马士兵
  • 深入理解 SQL 中的 Grouping Sets 语句

    前言 SQL 中 Group By 语句大家都很熟悉 根据指定的规则对数据进行分组 常常和聚合函数一起使用 比如 考虑有表 dealer 表中数据如下 id Int city String car model String quantity
  • Linux系统下ping命令报错 name or service not know

    问题描述 CentOS 但是当执行ping命令的时候 提示name or service not known 解决方法 1 添加DNS服务器 1 vi etc resolv conf 进入编辑模式 增加如下两行内容 分别是首选DNS服务器和
  • logback--进阶--05--自定义Appenders

    logback 进阶 05 自定义Appenders 代码位置 https gitee com DanShenGuiZu learnDemo tree master logback learn 1 介绍 1 1 继承关系图 可以看到Appe
  • C++ 多态和虚函数

    一 先搞清override overload overwrite的区别 1 overload 重载 不是多态 在C 程序中 可以将语义 功能相似的几个函数用同一个名字表示 但参数不同 包括类型 顺序不同 即函数重载 1 相同的范围 在同一个
  • 药明康德成都研发中心投入运营;中国白酒行业净利润将迎来七年来首次下滑

    今日看点 药明康德成都研发中心正式投入运营 该研发中心将成为药明康德上海研发总部以外 又一个覆盖化学及生物学的新药发现整体研发平台 将为客户提供从小分子药物设计 合成 分析 体内体外生物学 肿瘤免疫学等全方位 一体化的新药研发服务 该研发中
  • 【编译原理】LR(1)分析方法(c++实现)

    前文回顾 编译原理 LR 0 分析方法 c 实现 编译原理 SLR 1 分析方法 c 实现 算法 来自龙书第二版 代码 和SLR的区别其实只是DFA中多了一个搜索符 构建分析表的时候规约项的列是相应的搜索符而已 代码基本上就在SLR的代码上
  • 拼多多anti_content算法

    最近拼多多的anti content算法更新了 闲着无聊就看了看 总思路如下 首先我们抓包 看到我们今天的目标 anti content 现在 我们通过堆栈入口随便下个断点 然后我们在CallStack中向下寻找 经过漫长的寻找 我们可以在
  • route命令的详细使用介绍

    1 命令格式 route f p Command Destination mask Netmask Gateway metric Metric if Interface 2 命令功能 Route命令是用于操作基于内核ip路由表 它的主要作用
  • es单机数据迁移到另一个es单机

    将一个Elasticsearch单机的数据迁移到另一个Elasticsearch单机主要可以分为两步 第一步 备份原有数据 将原有Elasticsearch单机中的数据备份到一个文件中 可以使用 Elasticsearch 提供的 snap
  • 第三十讲:神州路由器路由重分发配置

    RIP和OSPF协议是目前应用最广泛的路由协议 两种协议交接的场合也很多见 两种协议的重分布是比较常见的配置 主校区原来所采用的网络协议为OSPF 而分校区采用的路由协议是RIP 采用RIP和OSPF重分发技术可以解决此问题 实验拓扑图如下
  • PostgreSQL、Greenplum 日常监控 和 维护任务

    背景 Greenplum的日常监控点 评判标准 日常维护任务 展示图层 由于一台主机可能跑多个实例 建议分层展示 另外 即使是ON ECS虚拟机 一个虚拟机一个实例一对一的形态 的产品形态 实际上也建议分层展示 以示通用性 主机级图层 1
  • vue项目全局内引入外部CDN地址的js文件

    通过vue cli 构建的vue项目的根目录下 有一个index html文件 例如
  • 跳过selenium检测爬取淘宝直通车

    最近 有对阿里商家端进行一些数据爬取 这次爬取的是直通车人群溢价数据 发现对selenium的检测相当厉害 然而我的回答是 你强任你强 清风拂山岗 咱人工登录怕过谁 什么cokies user agent selenium检测 token