python自動化処理ページ(urllib,beatuifulsoup,re)にカードを打って署名する

4045 ワード

0 x 00:python言語には多くのサードパーティライブラリがあり、自身が所有するライブラリも非常に多く、これらのライブラリはpythonという言語で何でもできる称号を達成しています.
0 x 01:urllibはpythonがウェブページを処理するモジュールで、このモジュールはpythonの付属モジュールで、使用時に直接インポートすることができます.
beauitfulsoupはpythonのサードパーティモジュールであり、Webページhtmlとxmlファイルの解析機能を提供します.
0 x 02:このスクリプトの目的は、あるソフトの打カード署名機能を実現し、linux cronと協力して全自動打カードを実現することである.サイトはクッキーを追跡するのでスクリプトにはクッキーの処理機能が必要で、サイトはjsを使ってパラメータを生成する方法があります.
スクリプトを使用してpost固定のアカウントパスワードを通じてカードを打つことを防止するため、スクリプトは直接postアカウントパスワードを固定のウェブサイトに登録するのではなく、シミュレーションログインの過程が必要です.
カードを打つウェブサイトはjspを使って編纂して、スクリプトの流れは:カードを打つウェブサイトのトップページに入って、ホームページ内から次のホームページに提出する必要があるいくつかのパラメータを読み出して、
例えば、通常のウェブサイトでは、ユーザ明和パスワードは「user」=「abc 123」、「password」=「ccc 456」であるが、このウェブサイトではフォーム内のユーザ名とパスワードのnameはjsがウェブページを生成する際に生成される.
これは、Webページを読み取り、名前を解析する必要があります.第2のステップは、第1のウェブページで解析されたパラメータにアカウントパスワードを加えて、第2のウェブサイトにpostを追加することです.すなわち、ウェブサイトの認証プロセスを完了します.
第3歩は、第2のウェブサイトのページ内容に基づいてpostが必要なフォームとurlを見つけ、必要なヘッダファイルとpost内容を生成して第3のウェブページに提出し、ページをカードするカードボタンの動作を完了する.
0 x 03:スクリプト
__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)