爬虫2

import requests

# 创建会话
s = requests.Session()

# 登录要请求的地址,
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)


# 请求一个登录之后的页面
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)

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

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

能够请求到登录后的界面
1
带上cookie和session的弊端:

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

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

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)

一、为什么要使用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的邮箱联系方式。

二、实战

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」的原创文章

原文地址:https://www.cnblogs.com/wenqiang-leo/p/11809446.html