快排参数、浏览器UA以及源码
百度的机制有以下几点:
1. Headless Chrome功能检测:爬虫点击竞价是无效的点击。因为Headless Chrome本身就是一个chrome浏览器,它支持各种新的css渲染功能和js运行时语法。基于这种方法,爬虫可以绕过作为进攻方的几乎所有服务器端验证逻辑,但这些爬虫在客户端js运行时仍有一些缺陷。
2. 初级检测:如百度统计,根据浏览器UserAgent字段描述的浏览器品牌、版本、型号等信息,检测js运行时、DOM、BOM等各个原生对象的属性和方法,观察其特征是否符合要求 该版本的浏览器应具备的特征(浏览器指纹检测
3. 检测头文件的User-Agent,根据User-Agent来识别你的http头文件中的每个字段是否符合浏览器的特征
4. 设备指纹、Cookie的检测:设备指纹,服务器发送的认证设置到cookie中,cookie的访问频率可以有效解决用户识别问题(访客识别码是在此基础上计算出来的,而访客识别码是由百度计算的
5.IP检测:通过IP风险数据库和黑名单判断恶意IP
6. JS-Injection:这种方法在业界也被广泛使用。在第一次访问请求中,注入的js会被返回,js会执行一些计算逻辑并放在cookie中。请求验证再次启动。验证成功后,服务器向客户发出一个令牌,并将其放入cookie中,所有后续请求都需要携带cookie,以识别其已被验证为非机器人身份。
7. 轨迹模型:通过机器学习判断用户浏览网页时产生的轨迹是人还是机器,轨迹+CNN算法判断
8. ZoombieCookie:僵尸cookie是指那些不能被删除的cookie,如果被删除会自动重建。僵尸cookie依赖于其他本地存储方式,如flash共享对象、html5本地存储等。当用户删除cookie时,cookie的备份将自动从其他本地存储中读取并重新植入。zoombiecookie+设备指纹=唯一用户使用ZoombieCookie持久化存储cookie,增加用户伪造的难度,解决设备指纹不能完全识别用户的问题
9. 用户画像:通过用户的注册信息,结合用户的历史行为数据,得出用户画像。为了分析用户的异常行为,百度经常使用。
10. 画布指纹:Canvas是HTML5中一个用于动态绘画的标签。要想基于Canvas绘制特定内容的图片,可以使用canvas.toDataURL()方法,返回图片内容的base64编码字符串。对于PNG文件格式来说,它被分成几块,最后一块是32位的CRC检查。提取这个CRC校验码可以用于用户的唯一识别。
11. WebRTC保护:WebRTC(网络实时通信)是由万维网联盟(W3C)起草的一个API定义,它支持浏览器与浏览器之间的语音通话、视频聊天和P2P文件共享的应用,无需内部或外部插件。WebRTC网络限制器通过改变Chrome的隐私设置来配置WebRTC网络流量。
它的主要功能是:
- 这可以将WebRTC配置为不使用某些IP地址或协议
- 对公共互联网不可见的IP地址(例如192.168.1.2 等地址)
- 任何与网络接口相关的公共IP地址,该地址不用于网络流量(例如通过浏览时由ISP提供的地址)
- WebRTC流量需要通过Chrome中配置的代理服务器。由于大多数代理服务器不处理UDP,因此在Chrome中提供UDP代理支持之前,UDP实际上是关闭的,而且这种代理被广泛部署。
- 一旦安装了该扩展,WebRTC将只使用与用于网络流量的接口相关的公共IP地址,通常与浏览器的HTTP请求中提供给网站的地址相同。该扩展也可以禁用非代理UDP,但默认情况下不启用,必须使用该扩展的 "选项 "页面进行配置。
参数标签
colorDepth参数:window.screen.colorDepth ;通常为:16,24,32
PixelRatio参数:window.devicePixelRatio ;通常为:1-3随机数,可以浮点数
hardwareConcurrency参数:navigator.hardwareConcurrency ;通常:1-16随机整数
timezone参数:getTimezoneOffset() ; 通常是:-480
innerWidth参数:window.innerWidth
innerHeight参数:window.innerHeight
outerWidth参数:window.outerWidth
outerHeight参数:window.outerHeight
colorDepth参数:screen.colorDepth
pixelDepth参数:screen.pixelDepth
availWidth参数:screen.availWidth
availHeight参数:screen.availHeight
platform:参数:navigator.platform ;通常为:Linux armv8l/Linux armv7l/iPhone/Linux aarch64/Win32/Linux x86/Linux x64 除了iPhone其他都可以随机机型
plugins参数:navigator.plugins 可以随机加字体名字;例如为:Arial,Arial Black,Arial Narrow,Arial Unicode MS,Book Antiqua,Bookman Old Style,Calibri,Cambria,Cambria Math,Century,Century Gothic,Century Schoolbook,Comic Sans MS,Consolas,Courier,Courier New,Georgia,Helvetica,Impact,Lucida Bright,Lucida Calligraphy,Lucida Console,Lucida Fax,Lucida Handwriting,Lucida Sans,Lucida Sans Typewriter,Lucida Sans Unicode,Microsoft Sans Serif,Monotype Corsiva,MS Gothic,MS PGothic,MS Reference Sans Serif,MS Sans Serif,MS Serif,Palatino Linotype,Segoe Print,Segoe Script,Segoe UI,Segoe UI Light,Segoe UI Semibold,Segoe UI Symbol,Tahoma,Times,Times New Roman,Trebuchet MS,Verdana,Wingdings,Wingdings 2,Wingdings 3
appName浏览器名称参数:navigator.appName ;通常为:Netscape
appVersion浏览器版本参数:navigator.appVersion; 就是UA的前半部分
cookieEnabled返回用户浏览器是否启用了cookie参数:navigator.cookieEnabled
cpuClass 硬件cpu型号: navigator.cpuClass; //返回用户计算机的cpu的型号;通常intel芯片返回"x86"(火狐没有)
mimeTypes浏览器支持的所有MIME类型的数组参数:navigator.mimeTypes
userLanguage浏览器语言参数:navigator.userLanguage // 用户在自己的操作系统上设置的语言(火狐没有)
systemLanguage;系统默认语言:navigator.systemLanguage //火狐没有
enumerateDevices 获取设备列表:navigator.mediaDevices //大多数移动没有,可以不劫持
webdriver系统驱动参数:navigator.webdriver 或者是:window.navigator.webdriver //大多数移动没有,可以不劫持
webglVendorAndRenderer参数:navigator.webdriver //大多数移动没有,可以不劫持
canvas参数修改代码:通过js代码:
var canvas = document.createElement('canvas');
var ctx = canvas.getContext("2d");
ctx.font = "24px Arial";
ctx.fillText("Hello Panda",22,33);
ctx.moveTo(0,60);
ctx.lineTo(100,60);
ctx.stroke();
var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
canvas指纹参考网站: Canvas Fingerprinting
canvas修改网站教程: http://www. site-digger.com/html/we ibo/2019/1231/773.html
iphone 5系列是:320x568 pixelRatio:2
iphone 6,7,8系列:375x667 pixelRatio:2
iphone plus系列是:414x736 pixelRatio:3
iphone x分辨率是:375x812 pixelRatio:3
ipad 分辨率是:768x1024 pixelRatio:3
ipad pro:1024x1366 pixelRatio:3
以上随机就行,百度对苹果系列监控不严格
点击参数
参考百度url: www.百度.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=java&rsv_spt=1&oq=java&rsv_pq=9ae87b9e0000af9a&rsv_t=64a2xLPgOIqVeiuTYMJ2vghLIMU2amOkhpFAUsNeIXZ6aMAmwitsrebiPa%2BGy1E8WWZa&rqlang=cn&rsv_enter=0&rsv_sug3=1&rsv_sug1=1&rsv_sug7=100&rsv_sug4=1395
格式整理后:
https:安全套接字层传送的超文本传输协议// http://www. baidu.com/ :baidu的域名
s:这是通过一个没有扩展的方法实现的
ie=utf-8 ie:默认的关键词编码格式是GB2312简体中文
f=8 f:其值为1,3,8,可能还有其他,但暂时只找到这3个。指相关搜索,揭示了用户在搜索页面底部的 "相关搜索 "中选择了某个关键词。 下拉框搜索,揭示了在用户输入正词后出现了 "关联词",用户最后用鼠标选择了某个关键词;或者用键盘选择了某个关键词后直接按回车键。 用户自立搜索,揭示用户直接点击 "百度点击 "按钮(f=8仅在有bs变量时出现
rsv_bp=1 rsv_bp:使用哪个百度搜索框,0是主页输入;1是顶部搜索输入;2是底部搜索输入
rsv_idx=2 rsv idx:未知数
tn=baiduhome_pg tn:提交的搜索请求的来源 例如:tn=50000021_hao_pg是百度在hao123上搜索的
tn=baidulocal:意味着百度网站上的搜索结果非常干净,没有广告干扰。当tn=baiduerr时,意味着这是从错误页面搜索跳出来的
wd=java wd:查询关键字通常是一串字符,例如:%e4%bb%a5%e6%a2%a6%e4%b8%ba%e9%a9%ac%e8%af% 97%e9%85%92%e8%b6%81%e5%b9%b4%e5%8d%8e 如果用URL编码解码,可以看到真实内容
rsv_spt=1 rsv_spt:表示主页搜索浏览器的内核版本类型,1表示新版百度主页搜索(先登录百度账号)2表示百度实时热点搜索(先登录百度账号)3表示传统百度主页搜索
oq=java oq:最后的索引键 rsv_pq=9ae87b9e0000af9a rsv_pq:揭示用于记录关键词的性能和最后搜索的关键词(相关关键词)。
rsv_t=64a2xLPgOIqVeiuTYMJ2vghLIMU2amOkhpFAUsNeIXZ6aMAmwitsrebiPa%2BGy1E8WWZa rsv_t:衡量搜索效果的随机密码
rqlang=cn rqlang:与地区有关的cn代表中国的地区
rsv_enter=0 rsv_enter:未知 rsv_sug=1 意义 搜索框提示的搜索历史(Search history) 参数值:0 搜索框提示 、搜索历史 1 搜索框提示 1 搜索历史 2 搜索框提示 、搜索历史记录
inputT=2335 inputT:透露表现为相应的搜索时间,单位为毫秒。
rsv_sug3=1:未知
rsv_sug1=1 :搜索框中提示的数量
rsv_sug7=100 :未知
rsv_sug4=1395 :未知
rev_ers ers:rsv_ers xn*(*取0或1)表示在搜索词后,翻页后出现相应的连贯搜索,从0开始,如果在url中已经为0,则相应的连贯搜索从1开始(这个参数有很多秘密,这只是一个初步测试)
rn:每页的显示数量,默认为10,最大为50
pn:默认显示的结果页数为0,其他页面按rn递增。即:当rn为20时,第一页pn=0,第二页pn=20,第三页pn=40
cl:百度提交的搜索类型,cl=3是网页搜索,cl=2是百度信息
ct:语言限制。0-所有语言,1-简体中文网页,2-传统中文网页;其他不确定或无效或。默认值为0。
si:在限定的域名中搜索。例如,如果你想在这个网站上搜索,你可以使用参数si=www.百度.com。为了使这个参数有效,你必须把它和ct参数一起使用。
bs:(搜索前) 最后一次搜索的关键词。
lm=0 :(搜索结果的时间限制),单位是天。例如,当搜索最近一个月的网页时,lm=30。默认值为0,表示没有时间限制。
ft:搜索文档格式,pdf、doc、xls、ppt、rtf等。默认值为空。
q1:包含以下所有的关键词
q2:包含以下完整的关键词
q3:包含以下任何一个关键词
q4:不包括以下关键词
q5:搜索内容位置限制。0-所有内容;1-页面标题(相当于使用'title:'查询前缀);2-url(相当于使用'inurl:'查询前缀);其他值相当于0。 默认值0
q6:搜索内容网站的限制。例如,q6=www.百度.com,表示只搜索www.百度.com 的网页;相当于使用'site: prefix'。默认值为空
dq:不建议使用这个参数。查询内容受原始区域的限制。
常用浏览器UA
safari5.1–MAC:User-Agent:Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50
safari5.1–Windows:User-Agent:Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50
IE9.0:User-Agent:Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;
IE8.0:User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)
IE7.0:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)
IE6.0:User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)
Firefox4.0.1–MAC:User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1
Firefox4.0.1–Windows:User-Agent:Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1
Opera11.11–MAC:User-Agent:Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11
Opera11.11–Windows:User-Agent:Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11
Chrome17.0–MAC:User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11
国产浏览器
Maxthon:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)
TT:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)
TheWorld2.x:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)
TheWorld3.x:User-Agent:?Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)
搜狗浏览器1.x:User-Agent:?Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)
360SE:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)
Avant:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)
GreenBrowser:User-Agent:Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)
移动设备端
safariiOS4.33–iPhone:User-Agent:Mozilla/5.0(iPhone;U;CPUiPhoneOS4_3_3likeMacOSX;en-us)AppleWebKit/533.17.9(KHTML,likeGecko)Version/5.0.2Mobile/8J2Safari/6533.18.5
safariiOS4.33–iPodTouch:User-Agent:Mozilla/5.0(iPod;U;CPUiPhoneOS4_3_3likeMacOSX;en-us)AppleWebKit/533.17.9(KHTML,likeGecko)Version/5.0.2Mobile/8J2Safari/6533.18.5
safariiOS4.33–iPad:User-Agent:Mozilla/5.0(iPad;U;CPUOS4_3_3likeMacOSX;en-us)AppleWebKit/533.17.9(KHTML,likeGecko)Version/5.0.2Mobile/8J2Safari/6533.18.5
AndroidN1:User-Agent:Mozilla/5.0(Linux;U;Android2.3.7;en-us;NexusOneBuild/FRF91)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MobileSafari/533.1
AndroidQQForandroid:User-Agent:MQQBrowser/26Mozilla/5.0(Linux;U;Android2.3.7;zh-cn;MB200Build/GRJ22;CyanogenMod-7)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MobileSafari/533.1
AndroidOperaMobile:User-Agent:Opera/9.80(Android2.3.4;Linux;OperaMobi/build-1107180945;U;en-GB)Presto/2.8.149Version/11.10
AndroidPadMotoXoom:User-Agent:Mozilla/5.0(Linux;U;Android3.0;en-us;XoomBuild/HRI39)AppleWebKit/534.13(KHTML,likeGecko)Version/4.0Safari/534.13
BlackBerry:User-Agent:Mozilla/5.0(BlackBerry;U;BlackBerry9800;en)AppleWebKit/534.1+(KHTML,likeGecko)Version/6.0.0.337MobileSafari/534.1+
WebOSHPTouchpad:User-Agent:Mozilla/5.0(hp-tablet;Linux;hpwOS/3.0.0;U;en-US)AppleWebKit/534.6(KHTML,likeGecko)wOSBrowser/233.70Safari/534.6TouchPad/1.0
NokiaN97:User-Agent:Mozilla/5.0(SymbianOS/9.4;Series60/5.0NokiaN97-1/20.0.019;Profile/MIDP-2.1Configuration/CLDC-1.1)AppleWebKit/525(KHTML,likeGecko)BrowserNG/7.1.18124
WindowsPhoneMango:User-Agent:Mozilla/5.0(compatible;MSIE9.0;WindowsPhoneOS7.5;Trident/5.0;IEMobile/9.0;HTC;Titan)
使用python实现快排的源码:
#二开百度快排源码 ,修改ADSL为代理IP,增加随机滚动功能
#autor:wx:jin316021916
# -*- coding: utf-8 -*-
from selenium import webdriver
import time
import requests
import random
import os
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import traceback
import urllib.request
import pymysql
import socket
import win32api #pip install pypiwin3
from selenium.webdriver.common.action_chains import ActionChains
random_time=random.randint(1,5) #随机暂停时间
work_time=random.randint(300,600) #随机任务间隔时间
def proxy3():
url1 = "http://webapi.http.zhimacangku.com/getip?num=1&type=2&pro=&city=0&yys=0&port=1&pack=115173&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1®ions="
res=requests.get(url1).json()
ip=res['data'][0]['ip']
port=res['data'][0]['port']
proxies=ip+':'+str(port)
return proxies
#获取搜素出来的url
def get_search_url(driver):
urls = []
real = []
real_url = []
click_link = []
content = driver.find_element_by_css_selector("div[id=\"content_left\"]")
links = content.find_elements_by_tag_name("a")
for link in links:
if link.get_attribute('class') == "c-showurl c-color-gray":
real.append(link.text) #获取网站真是url带html,快照前面的链接
url = link.get_attribute('href')
print(url)
urls.append(url) #获取百度落地页跳转链接 百度跳转地址
#解密url
header = requests.head(url).headers
is_append = True
for out_url in out_urls: #屏蔽的链接地址
if out_url in header['location']:
is_append = False
break
if is_append == True:
real_url.append(header['location']) #网站真是链接,不带html
print(header)
#a标签对象
click_link.append(link) #链接点击部分
print(real_url)
print(click_link)
#return urls
return [real_url,click_link]
#function 目标地址是否在某个list中
def get_urlIndex(tagurl,urls): #要刷的链接是否在真是的链接列表里面
i = 0
has = -1
for url in urls:
if tagurl in url:
has = True
return i
i = i+1
return has #刷的链接在列表,如果是的,返回i并且递增,否则为-1
#点击百度搜索内容下面的下一页
def click_nextBtn(driver):
div = driver.find_element_by_css_selector("div[id=\"page\"]")
a = div.find_elements_by_tag_name("a")
for item in a:
print(item.text)
if item.text == "下一页 >":
item.click()
return driver
#随机点击
def click_search_url(driver,items):
urls = []
real = []
content = driver.find_element_by_css_selector("div[id=\"content_left\"]")
links = content.find_elements_by_tag_name("a")
'''获取当前窗口'''
nowhandle = driver.current_window_handle
#allhandles=driver.window_handles
#for handle in allhandles:
# print('....当前窗口....',handle.title)
#exit()
for link in links:
if link.get_attribute('class') == "c-showurl c-color-gray":
if i in items:
print("随机点击item:",i)
print(link.get_attribute('href'),link.text)
#exit()
link.click()
#停留在点击页面
time.sleep(random.randint(5,10))
'''获取所有窗口'''
allhandles=driver.window_handles
#for handle in allhandles:
# print('....当前窗口....',handle.title)
#exit()
'''循环判断窗口是否为当前窗口'''
for handle in allhandles:
if handle != nowhandle:
print("切换到当前窗口")
driver.switch_to_window(handle)
print("title:",driver.title)
'''关闭当前窗口'''
driver.close()
'''回到原先的窗口'''
print("切换到原来的窗口")
driver.switch_to_window(nowhandle)
print("title:",driver.title)
print("本次随机点击完毕!")
i=i+1
#获取随机点击的搜索页random.randint(0
def get_random_index(index,len):
if index >= 8:
random_index = [
random.randint(0,4),random.randint(5,8)
elif index>=4:
random_index = [
random.randint(0,3),random.randint(3,index)
elif index>=0:
random_index = [
index
elif index == -1:
if len <=5:
random_index = [
random.randint(0,5)
else:
random_index = [
#random.randint(0,4),random.randint(5,len)
random.randint(5,len)
return random_index
def getUA():
uaList = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
#chrome
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36",
#"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
#firefox
#"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
#"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0",
#ie11
#"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
#"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 4399Box.1357; 4399Box.1253; 4399Box.1357)",
#2345王牌
#"Chrome/39.0.2171.99 Safari/537.36 2345Explorer/6.5.0.11018",
#"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",
#opera
#"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"
headers = random.choice(uaList)
return headers
#屏幕浏览器窗口大小
def getWindowSize():
wind_size = [
[1920,1080],
[1600,900],
[1280,720]
headers = random.choice(wind_size)
return headers
#屏幕分辨率设置
def setDisplay():
display_size = [
[1920,1080],
[1680,1050],
[1600,900],
[1440,900],
[1400,1050]
d_size = random.choice(display_size)
dm = win32api.EnumDisplaySettings(None, 0)
dm.PelsWidth = d_size[0]
dm.PelsHeight = d_size[1]
dm.BitsPerPel = 32
dm.DisplayFixedOutput = 0
win32api.ChangeDisplaySettings(dm, 0)
#随机点击页面
def click():
for i in range(3):
time.sleep(1)
for i in range(1, 3):
driver.execute_script("window.scrollTo(%s,%s)" % (random.randint(1, 800), random.randint(1, 500)))
time.sleep(random.randint(1, 3))
driver.execute_script("window.scrollTo(%s,%s)" % (random.randint(1, 800), random.randint(1, 500)))
for j in range(30):
time.sleep(0.5)
x = random.randint(1, 960)
y = random.randint(1, 1040)
action = ActionChains(driver)
action.move_by_offset(x, y).click()
action.perform()
#随机上下滚动
def rand():
time.sleep(random.randint(2, 5)) # 随机停留1-5秒
for i in range(random.randint(2, 6)):
driver.execute_script("window.scrollTo(%s,%s)" % (random.randint(1, 300), random.randint(1, 300)))
time.sleep(random.randint(1, 3))
driver.execute_script("window.scrollTo(%s,%s)" % (random.randint(1, 300), random.randint(1, 300)))
#屏蔽点击的地址(竞争对手)
out_urls = [
'www.ef43.com.cn/zhuanti/2257/',
'www.ef43.com.cn/brands/mdm/',
'http://money.163.com/15/0416/11/ANANRECC00253B0H.html'
##内页词
targetURL = [
['http://v.viptuijian.com/','超好看的手机锁屏壁纸','好看的手机壁纸'],
['http://v.viptuijian.com/','好看的手机锁屏壁纸','手机壁纸'],
['http://v.viptuijian.com/','手机锁屏壁纸图片大全','好看的手机壁纸图片'],
for targetInfo in targetURL: #targetInfo 对应一个网址和关键列表;
#随机切换本地电脑的分辨率
#setDisplay()
#启动浏览器
#driver = webdriver.Ie()
#driver = webdriver.Chrome()
#driver = webdriver.Firefox()
user_agent = getUA()
#谷歌浏览器
options = webdriver.ChromeOptions()
options.add_argument(f'user-agent={user_agent}')
options.add_argument('--ignore-ssl-errors=true')
options.add_argument('--load-images=no')
#options.add_argument('--headless') #无浏览器模式
options.add_argument('--ignore-ssl-errors=true')
options.add_argument('--ssl-protocol=TLSv1')
options.add_argument('--proxy-type=http')
options.add_argument('--proxy-server=%s' % proxy3())
driver = webdriver.Chrome(options=options)
# UA = getUA()
# print(UA)
# webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.User-Agent'] = UA
# driver = webdriver.PhantomJS()
driver.implicitly_wait(30) #静默等待30秒
#清cookie
driver.delete_all_cookies() #清除浏览器cookie
#driver.maximize_window() # 浏览器全屏显示
#打开百度
driver.get("https://www.baidu.com/") #打开百度页面
#driver.get("http://mch.weiba01.com/2.php")
#设置浏览器窗口大小
window_size = getWindowSize() #设置浏览器窗口
driver.set_window_size(window_size[0], window_size[1])
#搜索某个关键词
print('打开百度成功',driver.title)
target = targetInfo[0] #要刷的网址
keyword = targetInfo[1] #要刷的关键词
if len(targetInfo)>2:
error_keyword = targetInfo[random.randint(2,len(targetInfo)-1)]
print(">>>>>>>>>>>>>>>点击的关键词:",keyword,"--->目标地址:",target,">>>>>>>>>>>>>>>>>>>>")
if len(targetInfo)>2:
#模拟错误关键词
print("点击错误关键词:",error_keyword);
driver.find_element_by_id("kw").send_keys(error_keyword) #搜索框输入混淆关键词
time.sleep(2)
driver.find_element_by_id("su").click() #点击搜索
time.sleep(5)
driver.find_element_by_id("kw").clear()
time.sleep(5)
print("错误关键词点击完毕")
driver.find_element_by_id("kw").send_keys(keyword)
time.sleep(random_time)
#time.sleep(2)
#点击搜索按钮
print("...开始点击搜索按钮..")
driver.find_element_by_id("su").click()
#exit()
print("...点击完毕..")
time.sleep(random_time)
rand()
#click()
#获取搜索结果页 0:着陆页 1:对应的链接对象
urls_res = get_search_url(driver)
real_urls = urls_res[0] #real_urls其实就是real_url列表
#get_search_url(driver)[1][2].click()
#real_urls = get_real_url(urls)
print("搜索出来的可点击着陆页个数:",len(real_urls))
print(real_urls)
index = get_urlIndex(target,real_urls) #index 是0~无限或者-1
print("目标index:",index) #随机点击次数
page = 1
while index == -1 and page <= 4:
if page == 1:
#点击前面的几个着陆页,模拟用户真实行为
items = get_random_index(index,len(real_urls))
#items = [4]
print(items)
click_search_url(driver,items)
driver = click_nextBtn(driver)
time.sleep(3)
urls_res = get_search_url(driver)
real_urls = urls_res[0]
#real_urls = get_real_url(urls)
print(real_urls)
index = get_urlIndex(target,real_urls)
page = page+1
if index > 4 and page == 1:
#第一页,随机点击两个或一个
int = random.randint(1,2)
if int == 2:
items = get_random_index(index,len(real_urls))
else:
items = [1]
print(items)
click_search_url(driver,items)
if page >=6:
print("没有找到目标地址,放弃搜索...")
print("关闭浏览器")
driver.quit()
time.sleep(5)
continue
print("目标在page",page,"当前排名:",index,real_urls[index])
print("反问最后的目标页...")
#driver.get(real_urls[index])
urls_res[1][index].click()
time.sleep(5)
nowhandle = driver.current_window_handle
allhandles = driver.window_handles
#目标页和搜索栏目页切换下
for handle in allhandles:
if handle != nowhandle:
print("切换到当前窗口")
driver.switch_to_window(handle)
stime = random.randint(15,40)
#stime = 5;
print("目标页title:",driver.title,"停留-->",stime)
#click()
time.sleep(stime)
'''关闭当前窗口'''
driver.close()
'''回到原先的窗口'''
print("切换到原来的窗口")
driver.switch_to_window(nowhandle)
print("title:",driver.title)
#time.sleep(random.randint(40,60))
#time.sleep(5)
#清除所有cookie
print("打印cookie")
cookie= driver.get_cookies()
print(cookie)
print("清除cookie")
driver.delete_all_cookies()
print("打印cookie:")
cookie= driver.get_cookies()
print(cookie)
#关闭浏览器
print("关闭浏览器")
time.sleep(5)
#driver.close()
driver.quit()
#time.sleep(5)