爬虫2

import requestsjavascript

# 建立会话
s = requests.Session()php

# 登陆要请求的地址,
url = "http://www.jokeji.cn/user/c.asp"
# 登陆所须要的get参数
# 经过抓包的到须要传递的参数
data = {
'u': '17312345678', # 帐号
'p': '123456', # 密码
'sn': '1',
't': 'big'
}
# 经过抓包或chrome开发者工具分析获得登陆的请求头信息,
headers = {
'Referer': 'http://www.jokeji.cn/User/Login.asp',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
# 开始登陆
r = s.get(url=url, params=data, headers=headers)
print(r.text)html


# 请求一个登陆以后的页面
headers1 = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'http://www.jokeji.cn/User/MemberCenter.asp'
r = s.get(url=url, headers=headers1)
# 定制字符集
r.encoding = 'gbk'
# 显示内容
print(r.text)java

 

 

一,cookie和session的区别
cookie在客户的浏览器上,session存在服务器上
cookie是不安全的,且有失效时间
session是在cookie的基础上,服务端设置session时会向浏览器发送设置一个设置cookie的请求,这个cookie包括session的id当访问服务端时带上这个session_id就能够获取到用户保存在服务端对应的sessionpython

二,爬虫处理cookie和session
带上cookie和session的好处:程序员

可以请求到登陆后的界面
1
带上cookie和session的弊端:web

一个cookie和session每每和一个用户对应,访问太快容易被服务器检测出来爬虫
1
不须要cookie的时候尽可能不要用ajax

三,处理session,cookie请求
1,cookie请求方式
1.1 直接使用浏览器抓包到的现有的cookie进行访问网站:
放在header字典里面chrome

header={
"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/64.0",
"Cookie":"csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj",
}
r=request.get(url,headers=header)
1
2
3
4
5
固然也能够在发送get请求时加上cookies的字典参数:编程

Cookie="csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj"
1
可是接受的参数是字典类型的,这就须要咱们适用字符串分割方法把cookie字符串转为字典形式:

Cookie="csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj"
cookies={i.split("=")[1]:i.split("=")[1] for i in Cookie.split("; ")} #先使用for循环遍历Cookie以”; “(分号和空格)分开的列表 再分别获取i以等号分割的列表的[0] [1] 位置填入 字典键 和值的位置
r=request.get(url,headers=header,cookies=cookies)
1
2
3
适用于cookie过时时间比较长的网站
2.session请求方式
request提供了一个一个叫作session的类,来实现客户端和服务端的会话保持
使用方法:

实例化一个session对象
让session发送get或post请求
再使用session访问只有登陆以后才能访问的网站,这时候session会自动带上服务器保存在其中的信息进行访问
session=request.session() #实例化session对象
response=session.get(url,header) #使用session对象发送get请求 就能获取服务端设置的session对象

 

 

cookie保存在浏览器中,不少浏览器限制一个站点最多保存20个cookie
session存在服务器中。

爬虫cookie和session
1.带上cookie和session的好处
可以请求到登录后的页面
2,弊端
一套cookie和session每每对应一个用户,请求太快,请求次数太多,容易被识别为爬虫

不须要cookie的时候尽可能不去使用cookie
可是有时为了获取登录的页面,必须发送带有cookie的请求

处理cookie和session
session
requests提供了一个sessiion类,来实现客户端和服务器端的会话保持
使用的方法:
1.实例化一个session对象
2.让session来发送get或post请求

session=requests.session()
response=session.get(url,headers)
例子:
第一种方法:

import requests
def run():
headers = {
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
data = {
'username': 'xxxx',
'password': 'xxxx'

}
session = requests.session()
# 使用session发送请求,cookie保存其中
session.post('https://passport.baidu.com/center', headers=headers, data=data)
# 使用session请求登录后地址,获得信息返回
r = session.get("https://passport.baidu.com/center", headers=headers)
with open('csdn-1.html', 'w', encoding='utf-8') as f:
f.write(r.content.decode())

if __name__ == '__main__':
run()


第二种方法,直接获取cookie放在headers中

import requests

def run():
headers = {
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
'Cookie':'BAIDUID=341732C7B4F15BBC29D34AEACEB3504A:FG=1; PSTM=1542017140;'
' BIDUPSID=2AC22745056694211D23B3E44908D13C; HOSUPPORT=1; '
'UBI=fi_PncwhpxZ%7ETaKARr9ykC%7EUxVaXAd4LMQqiLsD0A7cjJoq7PwEMEJbzj-kwTBzbZ0hiDKutNki369rZtk3; '
'USERNAMETYPE=3; SAVEUSERID=a83c8629c010e3fdeb37bc15bbd859; '
'HISTORY=439af17d04a8573ef0a503db42f7f8eb74194a; cflag=15%3A3; '
'pplogid=1978AIi2iDItRkilaVSoqU%2F1X%2FxJALykIUX9p6Uk4D0coM4%3D; '
'STOKEN=59bc2a92ec36899d06dc0ded956639e6d7ab5fa617516a8ea1656eb926d7081a;'
'BDUSS=ENLNTVSVVRqVFI3SDJwQTJJRm5yWXMwQ35QYW9XM29UTUIxWk83ZGNmb2xlQzFjQVFBQUFBJCQAAAAAAAAAAAEAAACvILVXsaHO7W3OosG5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXrBVwl6wVcR;'
' PTOKEN=d0c63029731a23a92850fccfb5803c10; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1543891782;'
' Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1543892594'
}
r=requests.get('https://passport.baidu.com/center',headers=headers)
print(r.content.decode())
with open('csdn-2.html','w',encoding='utf-8') as f:
f.write(r.content.decode())

if __name__ == '__main__':
run()


第三种方式:将cookies字典化

import requests


def run():
url='https://passport.baidu.com/center'
headers={
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
}
#将cookie转为字典
cookies='BAIDUID=341732C7B4F15BBC29D34AEACEB3504A:FG=1;PSTM=1542017140;BIDUPSID=2AC22745056694211D23B3E44908D13C;HOSUPPORT=1;UBI=fi_PncwhpxZ%7ETaKARr9ykC%7EUxVaXAd4LMQqiLsD0A7cjJoq7PwEMEJbzj-kwTBzbZ0hiDKutNki369rZtk3;USERNAMETYPE=3; SAVEUSERID=a83c8629c010e3fdeb37bc15bbd859;HISTORY=439af17d04a8573ef0a503db42f7f8eb74194a; cflag=15%3A3;pplogid=1978AIi2iDItRkilaVSoqU%2F1X%2FxJALykIUX9p6Uk4D0coM4%3D;STOKEN=59bc2a92ec36899d06dc0ded956639e6d7ab5fa617516a8ea1656eb926d7081a;BDUSS=ENLNTVSVVRqVFI3SDJwQTJJRm5yWXMwQ35QYW9XM29UTUIxWk83ZGNmb2xlQzFjQVFBQUFBJCQAAAAAAAAAAAEAAACvILVXsaHO7W3OosG5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXrBVwl6wVcR;PTOKEN=d0c63029731a23a92850fccfb5803c10; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1543891782;Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1543892594'
cookies={cookie.split('=')[0]:cookie.split('=')[1] for cookie in cookies.split(";")}
r=requests.get(url=url,headers=headers,cookies=cookies)
with open ('csdn-3.html','w',encoding='utf-8') as f:
f.write(r.content.decode())

if __name__ == '__main__':
run()

不须要创建session对象来获取cookie直接复制浏览器cookie的状况
1.cookie过时时间很长的网站(学校网站)
2,在cookie过时以前能拿到全部数据
3,配合其余程序, 其余程序获取cookie

获取登录后的页面三种方式
1.实例化session,使用session发送post请求,而后在使用session.get获取登录后的信息
2,将cookie信息加入到headers中
3,将cookies字典化,而后调用

 

PASSWORD = '[{"userId":"**","password":"**"}]'


def getData():  
    s = requests.Session()#建立一个session对象
    s.keep_alive = False  #保持一个长链接
    s.headers.update({'Connection': 'keep-alive'}) 
    for i in range(0,5):
        try:
            s.post('URL',data=PASSWORD)#该URL为登陆页面的URL
            s.headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
            break
        except requests.exceptions.ConnectionError:
            time.sleep(1)
            continue   


    s.headers.update({'Content-Type': 'application/x-www-form-urlencoded'}) 
      
    payload = ''   
    for count in range(0,5):
        print count
        try:
            rsp = s.post('URL',data=payload)#该URL为须要获取数据页面的F12请求正文内容
            #print "rsp",rsp
            break
        except requests.exceptions.ConnectionError:
            time.sleep(1)
            continue 
    #print "rsp",rsp
    
    exportfile ="D:/data.xls"


    with open(exportfile,'wb') as out_file:
        for chunk in rsp.iter_content():#将文本流保存到文件
            out_file.write(chunk)
    #若数据无效,则删除文件
    f = open(exportfile, 'rb')
    lines = f.read()
    isinvalid=re.search("javascript",lines)
    if (len(lines)==0) or (isinvalid is not None):
        print "this is empty data,system will delete it"
        f.close()
        os.remove(exportfile)
    else:
        print "this is valid data"
        time.sleep(40)

 

 

1、为何要使用Cookie

    Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(一般通过加密)。
    好比说有些网站须要登陆后才能访问某个页面,在登陆以前,你想抓取某个页面内容,登录前与登录后是不一样的,或者不容许的。
    使用Cookie和使用代理IP同样,也须要建立一个本身的opener。在HTTP包中,提供了cookiejar模块,用于提供对Cookie的支持。


    http.cookiejar功能强大,咱们能够利用本模块的CookieJar类的对象来捕获cookie并在后续链接请求时从新发送,好比能够实现模拟登陆功能。该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

    它们的关系: CookieJar–派生–>FileCookieJar–派生–>MozillaCookieJar和LWPCookieJar

    工做原理:建立一个带有cookie的opener,在访问登陆的URL时,将登陆后的cookie保存下来,而后利用这个cookie来访问其余网址。查看登陆以后才能看到的信息。

    一样,咱们以实例进行讲解,爬取伯乐在线的面向对象的漂亮MM的邮箱联系方式。

2、实战

1.背景介绍

    在伯乐在线有这么一个有趣的模块,面向对象,它说白了就是提供了一个程序员(媛)网上相亲的平台。

    URL:http://date.jobbole.com/

    它的样子是这样的:


    能够看到,这里有不少的相亲贴,随便点进去就会有网上相亲MM的详细信息,想获取MM的联系方式,须要积分,积分能够经过签到的方式获取。若是没有登录帐户,获取联系方式的地方是这个样子的:


    若是登录了帐号,获取联系方式的地方是这个样子的:


    想要爬取MM的联系邮箱,就须要用到咱们本次讲到的知识,Cookie的使用。固然,首先你积分也得够。

    在讲解以前,推荐一款抓包工具–Fiddler,能够在Google Chrome的Google商店下载这个插件,它的样子是这样的:


    能够看到,经过这个插件,咱们能够很容易找到Post的Form Data等信息,很方便,固然也能够用以前讲得浏览器审查元素的方式查看这些信息。

2.过程分析

    在伯乐在线首页点击登录的按钮,Fiddler的抓包内容以下:


    从上图能够看出,真正请求的url是

http://www.jobbole.com/wp-admin/admin-ajax.php

    Form Data的内容记住,这些是咱们编程须要用到的。user_login是用户名,user_pass是用户密码。

    在点击取得联系邮箱按钮的时候,Fiddler的抓包内容以下:


    从上图能够看出,此刻真正请求的url是

http://date.jobbole.com/wp-admin/admin-ajax.php

    一样Form Data中内容要记下来。postId是每一个帖子的id。例如,打开一个相亲贴,它的URL是http://date.jobbole.com/4128/,那么它的这个postId就是4128。为了简化程序,这里就不讲解如何自动获取这个postId了,本实例直接指定postId。若是想要自动获取,可使用beautifulsoup解析http://date.jobbole.com/返回的信息。beautifulsoup的使用。有机会的话,会在后面的爬虫笔记中进行讲解。

3.测试

    1)将Cookie保存到变量中

    首先,咱们先利用CookieJar对象实现获取cookie的功能,存储到变量中,先来感觉一下:

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar

if __name__ == '__main__':
#声明一个CookieJar对象实例来保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request库的HTTPCookieProcessor对象来建立cookie处理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#经过CookieHandler建立opener
opener = request.build_opener(handler)
#此处的open方法打开网页
response = opener.open('http://www.baidu.com')
#打印cookie信息
for item in cookie:
print('Name = %s' % item.name)
print('Value = %s' % item.value)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    咱们使用以上方法将cookie保存到变量中,而后打印出了cookie中的值,运行结果以下:


    2)保存Cookie到文件

    在上面的方法中,咱们将cookie保存到了cookie这个变量中,若是咱们想将cookie保存到文件中该怎么作呢?方便之后直接读取文件使用,这时,咱们就要用到FileCookieJar这个对象了,在这里咱们使用它的子类MozillaCookieJar来实现Cookie的保存,编写代码以下:

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar

if __name__ == '__main__':

#设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,以后写入文件
cookie = cookiejar.MozillaCookieJar(filename)
#利用urllib.request库的HTTPCookieProcessor对象来建立cookie处理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#经过CookieHandler建立opener
opener = request.build_opener(handler)
#此处的open方法打开网页
response = opener.open('http://www.baidu.com')
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    cookie.save的参数说明:

ignore_discard的意思是即便cookies将被丢弃也将它保存下来;

ignore_expires的意思是若是在该文件中cookies已经存在,则覆盖原文件写入。

    在这里,咱们将这两个所有设置为True。

    运行以后,cookies将被保存到cookie.txt文件中。咱们能够查看本身查看下cookie.txt这个文件的内容。

    3)从文件中获取Cookie并访问

    咱们已经作到把Cookie保存到文件中了,若是之后想使用,能够利用下面的方法来读取cookie并访问网站,感觉一下:

# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar

if __name__ == '__main__':
#设置保存cookie的文件的文件名,相对路径,也就是同级目录下
filename = 'cookie.txt'
#建立MozillaCookieJar实例对象
cookie = cookiejar.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load(filename, ignore_discard=True, ignore_expires=True)
#利用urllib.request库的HTTPCookieProcessor对象来建立cookie处理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#经过CookieHandler建立opener
opener = request.build_opener(handler)
#此用opener的open方法打开网页
response = opener.open('http://www.baidu.com')
#打印信息
print(response.read().decode('utf-8'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    了解到以上内容,咱们那就能够开始正式编写模拟登录伯乐在线的程序了。同时,咱们也能够获取相亲MM的联系方式。

4.编写代码

    咱们利用CookieJar对象实现获取cookie的功能,存储到变量中。而后使用这个cookie变量建立opener,使用这个设置好cookie的opener便可模拟登录,同笔记四中讲到的IP代理的使用方法相似。

    建立cookie_test.py文件,编写代码以下:

# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
from urllib import parse
from http import cookiejar

if __name__ == '__main__':
#登录地址
login_url = 'http://www.jobbole.com/wp-admin/admin-ajax.php'
#User-Agent信息
user_agent = r'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
#Headers信息
head = {'User-Agnet': user_agent, 'Connection': 'keep-alive'}
#登录Form_Data信息
Login_Data = {}
Login_Data['action'] = 'user_login'
Login_Data['redirect_url'] = 'http://www.jobbole.com/'
Login_Data['remember_me'] = '0' #是否一个月内自动登录
Login_Data['user_login'] = '********' #改为你本身的用户名
Login_Data['user_pass'] = '********' #改为你本身的密码
#使用urlencode方法转换标准格式
logingpostdata = parse.urlencode(Login_Data).encode('utf-8')
#声明一个CookieJar对象实例来保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request库的HTTPCookieProcessor对象来建立cookie处理器,也就CookieHandler
cookie_support = request.HTTPCookieProcessor(cookie)
#经过CookieHandler建立opener
opener = request.build_opener(cookie_support)
#建立Request对象
req1 = request.Request(url=login_url, data=logingpostdata, headers=head)

#面向对象地址
date_url = 'http://date.jobbole.com/wp-admin/admin-ajax.php'
#面向对象
Date_Data = {}
Date_Data['action'] = 'get_date_contact'
Date_Data['postId'] = '4128'
#使用urlencode方法转换标准格式
datepostdata = parse.urlencode(Date_Data).encode('utf-8')
req2 = request.Request(url=date_url, data=datepostdata, headers=head)
try:
#使用本身建立的opener的open方法
response1 = opener.open(req1)
response2 = opener.open(req2)
html = response2.read().decode('utf-8')
index = html.find('jb_contact_email')
#打印查询结果
print('联系邮箱:%s' % html[index+19:-2])

except error.URLError as e:
if hasattr(e, 'code'):
print("HTTPError:%d" % e.code)
elif hasattr(e, 'reason'):
print("URLError:%s" % e.reason)
————————————————
版权声明:本文为CSDN博主「Jack-Cui」的原创文章

 

 

1.获取须要提交的数据

使用chrome的Network或者fiddler能够很轻易的获得咱们想要的数据,这里使用fiddler举例。

打开fiddler

输入完帐户信息和验证码后,为了方便查找,推荐点击清除清空会话记录

点击页面中的登陆
能够看到fiddler已经捕捉到了浏览器提交的数据

能够看到点击登陆后浏览器提交的数据,通过简单的观察,能够肯定登陆时提交的是选中的这个


查看右侧的详情了解到提交发法是post,发送了一个form。其中uname是帐号,password是密码,numcode是验证码,fid和fidname是机构名,都是明文,处理起来很是方便。
只要照着这个表发送就可以模拟登录了
在Python的Requests库中form是一个字典
form = {
'pid':' -1',
'pidName':'',
'fid':'机构码',
'fidName':'机构名',
'allowJoin':'0',
'isCheckNumCode':'1',
'f':'0',
'productid':'',
'uname':'帐号',
'password':'密码',
'numcode':'验证码',
'verCode':''
}
2.验证码
验证码其实就是一张图片,在你向服务器请求完以后,服务器并不知道你看到了哪一张图,只会将图片的识别码做为一个cookie发送给客户端,只要在提交验证码的时候把cookie同时提交就能够了。
也就是说咱们能够先get验证码的图片,再打开登陆页面,提交form的同时把验证码的cookie一块儿提交就能提早知道验证码了。
requests库中的session()可以自动管理cookie,在我看来就像是模拟了一个浏览器
browser = requests.session()
在登陆页面按F12进入Network,刷新一下

通过判断code?1515406681840就是验证码图片。右侧General的Request Url能够找到地址
Url_1 = 'http://passport2.chaoxing.com/num/code?1515388254551'#验证码地址
Url_2 = 'http://passport2.chaoxing.com/login?refer=http%3A%2F%2Fi.mooc.chaoxing.com'#登陆地址

temp = open("valcode.png","wb")
temp.write(valcode.content)
temp.close()

valc = input("输入验证码:")
form["numcode"]=str(valc)

resp = browser.post(Url_2, headers = headers,data=form)

#把返回的页面写入temp_1.html
temp = open("temp_1.html","wb")
temp.write(resp.content)
temp.close()

————————————————
版权声明:本文为CSDN博主「lyh_ADT」的原创文章\

 

 

点击右下角的花朵便可送一朵花,左上角显示当前剩余数量,规则是每两分钟花朵数量恢复成100,每一个帐号能够一直送。若是仅仅是点击花朵形状能够一直送花的话,是很简单的,关键问题在于它时不时会跳出滑动验证码,以下图所示,这时候就须要解决验证码的问题了,固然了,这部分代码我是参考的别人的。


须要作的准备工做比较多,须要用到的库有selenium、PIL、openCV库,还须要安装Chrome浏览器驱动,具体如何安装我就不详述了。须要注意一下,安装OpenCV你们仍是去(https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)下载.whl格式的文件再pip install,否则会像我同样走许多弯路... auto_click.py代码以下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image, ImageEnhance
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import cv2
import numpy as np
from io import BytesIO
import time, requests

class CrackSlider():
"""
经过浏览器截图,识别验证码中缺口位置,获取须要滑动距离,并模仿人类行为破解滑动验证码
"""
def __init__(self):
super(CrackSlider, self).__init__()
# 实际地址
self.url = 'http://3g.163.com/wap/special/newsapp_idol_personal/?starId=14#/home'
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver, 20)
self.zoom = 2

def open(self):
self.driver.get(self.url)

def get_pic(self):
time.sleep(2)
target = browser.find_element_by_class_name("yidun_bg-img")
template = browser.find_element_by_class_name("yidun_jigsaw")
target_link = target.get_attribute('src')
template_link = template.get_attribute('src')
target_img = Image.open(BytesIO(requests.get(target_link).content))
template_img = Image.open(BytesIO(requests.get(template_link).content))
target_img.save('target.jpg')
template_img.save('template.png')
size_orign = target.size
local_img = Image.open('target.jpg')
size_loc = local_img.size
self.zoom = 320 / int(size_loc[0])

def get_tracks(self, distance):
print(distance)
distance += 20
v = 0
t = 0.2
forward_tracks = []
current = 0
mid = distance * 3/5
while current < distance:
if current < mid:
a = 2
else:
a = -3
s = v * t + 0.5 * a * (t**2)
v = v + a * t
current += s
forward_tracks.append(round(s))

back_tracks = [-3,-3,-2,-2,-2,-2,-2,-1,-1,-1]
return {'forward_tracks':forward_tracks,'back_tracks':back_tracks}

def match(self, target, template):
img_rgb = cv2.imread(target)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread(template,0)
run = 1
w, h = template.shape[::-1]
print(w, h)
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)

# 使用二分法查找阈值的精确值
L = 0
R = 1
while run < 20:
run += 1
threshold = (R + L) / 2
if threshold < 0:
print('Error')
return None
loc = np.where( res >= threshold)
#print(len(loc[1]))
if len(loc[1]) > 1:
L += (R - L) / 2
elif len(loc[1]) == 1:
print('目标区域起点x坐标为:%d' % loc[1][0])
break
elif len(loc[1]) < 1:
R -= (R - L) / 2

return loc[1][0]

def crack_slider(self,browser):
#self.open()
target = 'target.jpg'
template = 'template.png'
self.get_pic()
distance = self.match(target, template)
zoo = 1.36 #缩放系数,须要本身调整大小
tracks = self.get_tracks((distance + 7 )*zoo) # 对位移的缩放计算
#print(tracks)
slider = browser.find_element_by_class_name("yidun_slider")
ActionChains(browser).click_and_hold(slider).perform()

for track in tracks['forward_tracks']:
ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()

time.sleep(0.5)
for back_tracks in tracks['back_tracks']:
ActionChains(browser).move_by_offset(xoffset=back_tracks, yoffset=0).perform()

ActionChains(browser).move_by_offset(xoffset=-3, yoffset=0).perform()
ActionChains(browser).move_by_offset(xoffset=3, yoffset=0).perform()
time.sleep(0.5)
ActionChains(browser).release().perform()
try:
failure = WebDriverWait(browser, 5).until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'yidun_tips__text'), '向右滑动滑块填充拼图'))
print(failure)
except:
print('验证成功')
return None

if failure:
self.crack_slider(browser)

#if __name__ == '__main__':
browser = webdriver.Chrome()

username="11111111" #填本身的用户名
passwd="1111111" #填用户名对应的密码
browser = webdriver.Chrome()
# 打开的是微博登陆界面,能够本身改,以前作的时候是qq登陆,可是那个界面电脑端如今登不了了
browser.get('https://api.weibo.com/oauth2/authorize?client_id=469534363&redirect_uri=https%3A%2F%2Freg.163.com%2FouterLogin%2Foauth2%2Fsina_connect.do%3Furl%3Dhttp%253A%252F%252F3g.163.com%252Fwap%252Fspecial%252Fnewsapp_idol_personal%252F%253FstarId%253D222%26url2%3Dhttp%253A%252F%252F3g.163.com%252Ftouch%252Flogin%252F%253Furl%253Dhttp%253A%252F%252F3g.163.com%252Fwap%252Fspecial%252Fnewsapp_idol_personal%252F%253FstarId%253D222%2523%252Fhome%2526fail%26product%3D3g_163%26domains%3D163.com%26display%3Dmobile%26urs_tg%3D3&response_type=code&forcelogin=true&display=mobile')
browser.implicitly_wait(10)
# 须要本身按F12查原网址对应的用户名和密码框的id_name
elem=browser.find_element_by_id("userId") #u
elem.send_keys(username)
elem=browser.find_element_by_id("passwd") #p
elem.send_keys(passwd)
elem=browser.find_element_by_class_name("btnP")#.submit()
#elem=browser.find_element_by_id("go")
elem.click()

browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1])
c = CrackSlider()
k = 1
for i in range(1,70000):
try:
elem=browser.find_element_by_class_name("idol_vote_info")
elem.click()
time.sleep(0.2)
# 设置点击50次刷新一次
if k%50 == 0:
browser.refresh() # 刷新方法 refresh
print ('test pass: refresh successful')
# 点击110次休眠50s,能够本身设置
if k%110 == 0:
print ("click",k)
time.sleep(50)
k += 1
except:
print('-----须要验证-----')
c.crack_slider(browser)

不过代码仍然有不完善的地方,由于验证码拖动是借鉴的别人的代码,我也没有深刻理解,这个验证大概须要拖动两三次才验证成功,不过我以为已经够用了。还有程序偶尔会报错中止运行,这时候就能够再写一个小程序,监控这个程序有没有挂掉,挂掉的话从新运行该程序便可。监控的程序runner.py以下:

import os
from sys import argv

if __name__ == '__main__':
while os.system('python ' + ' '.join(argv[1:])):
print('Halted by exception, restart')


在命令行中输入

python -m runner auto_click.py————————————————版权声明:本文为CSDN博主「jingjing_94」的原创文章

相关文章
相关标签/搜索