zoukankan      html  css  js  c++  java
  • 爬虫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」的原创文章

  • 相关阅读:
    威尔逊置信区间
    mysql函数
    python操作mysql之pymysql
    oracle 表分区
    Python连接sqlserver数据库之pymssql
    python-subprocess
    python-shutil
    python+logging
    公钥加密-DES-RSA
    python-Web-flask-蓝图和单元测试
  • 原文地址:https://www.cnblogs.com/wenqiang-leo/p/11809446.html
Copyright © 2011-2022 走看看