python 自动化处理网页 (urllib , beatuifulsoup ,re)打卡签到

时间:2020-12-07 06:55:45

0x00:python 语言有众多的第三方库,并且本身拥有的库也非常多,这些库也成就了python 这门语言无所不能的称号。

0x01:urllib 是python 处理网页的一个模块,该模块是python 的自带模块,使用时可以直接导入,

beauitfulsoup 是python的一个第三方模块,该模块提供了对网页html 和 xml 文件解析的功能。

0x02:这个脚本的目的,实现某软的打卡签到功能,配合linux cron 即可实现全自动打卡。网站会跟踪cookie 所以脚本中需要有对cookie的处理功能,网站使用js生成参数的方法

防止使用脚本通过post固定的账号密码进行打卡,故脚本需要有模拟登陆的过程而不是直接post 账号密码到一个固定的网站中。

打卡网站使用jsp编写,脚本的流程为:进入打卡网站首页,从网页内读出需要提交到下一个网页的一些参数,

例如在正常的网站中,用户明和密码是为‘user’ ='abc123','password'='ccc456',但是在这个网站中表单中用户名和密码的name 为js在生成网页的时候生成的。

这就需要读取网页并解析出该name。第二步为使用第一个网页解析出的参数加上账号密码一起post到第二个网站中,即完成网站的认证过程。

第三步,根据第二个网站的页面内容找出需要post的表单以及url,生成所需头文件以及post内容提交到第三个网页中去,完成打卡网页的打卡按钮动作。

0x03:脚本

__author__ = 'niem'
import urllib.request
import urllib.parse
import re
from bs4 import BeautifulSoup
import http.cookiejar
class neusoft:
    def __init__(self):
        self.__cookie_support = urllib.request.HTTPCookieProcessor(http.cookiejar.LWPCookieJar())
        self.__opener = urllib.request.build_opener(self.__cookie_support,urllib.request.HTTPHandler)

    def makeheader(self):
        UserAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0'
        Connection = 'keep-alive'
        AcceptLanguage = 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3'
        AcceptEncoding = 'gzip, deflate'
        Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
        headers = [('User-Agent',UserAgent),
                   ('Connection',Connection),
                   ('Accept-Language',AcceptLanguage),
                   ('Accept-Encoding',AcceptEncoding),
                   ('Accept',Accept),
                    ]
        return headers

    def prepare_request(self,postdata,url):
        urllib.request.install_opener(self.__opener)
        url_code_post_data = urllib.parse.urlencode(postdata)
        postdata_utf8 = url_code_post_data.encode('utf-8')
        if not postdata:
            request = urllib.request.Request(url)
        else :
            request = urllib.request.Request(url,data = postdata_utf8)
        for (k,v) in self.makeheader():
            request.add_header(k,v)
        return request

neu = neusoft()
request1 = neu.prepare_request('','http://url1')
response1 = urllib.request.urlopen(request1)
page1 = response1.read()
soup1 = BeautifulSoup(page1.decode('utf-8'),'html.parser')
neusoft_key_tag = soup1.find(attrs = {'name':'neusoft_key'})
neusoft_key = neusoft_key_tag.attrs['value']
user_name_name_tag = soup1.find(attrs={'name':re.compile('ID.*')})
user_name_name = user_name_name_tag.attrs['name']
user_pass_name_tag = soup1.find(attrs = {'name':re.compile('KEY.{20,}')})
user_pass_name = user_pass_name_tag.attrs['name']
post_data2 = [(user_pass_name,'bbbbbb'),
                 (user_name_name,'aaaaa'),
                 ('neusoft_key',neusoft_key),
                 ('login','true'),
                 ('neusoft_attendance_online',''),
             ]
request2 = neu.prepare_request(post_data2,'http://url2')
response2 = urllib.request.urlopen(request2)
page2 = response2.read()
soup2 = BeautifulSoup(page2.decode('GBK'),'html.parser')
currentempoid_tag = soup2.find(attrs = {'value':re.compile('[0-9]*')})
currentempoid = currentempoid_tag.attrs['value']
post_data3 = [('currentempoid',currentempoid)]
request3 = neu.prepare_request(post_data3,'http://url3')
response3 = urllib.request.urlopen(request3)