Vollständige Aufzeichnung des Schreibens von Python-Crawlern von Scratch_Python

不言
Freigeben: 2018-04-08 11:52:06
Original
1713 Leute haben es durchsucht

Die ersten neun Artikel wurden von den Grundlagen bis zum Schreiben ausführlich vorgestellt. Im zehnten Artikel geht es darum, Schritt für Schritt ein Crawler-Programm zu schreiben. Bitte lesen Sie ihn sorgfältig 🎜>

Lassen Sie uns zunächst über die Website unserer Schule sprechen:

http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html

Ergebnisse überprüfen Sie müssen sich anmelden in, und dann werden die Ergebnisse jedes Fachs angezeigt, aber nur die Ergebnisse werden ohne die Notenpunkte angezeigt, die der gewichteten Durchschnittspunktzahl entsprechen.

Notenpunkte manuell zu berechnen ist natürlich eine sehr mühsame Sache. Wir können also Python verwenden, um einen Crawler zu erstellen, der dieses Problem löst.

1. Der Vorabend der entscheidenden Schlacht

Lassen Sie uns zuerst ein Tool vorbereiten: das HttpFox-Plug-in.

Dies ist ein HTTP-Protokollanalyse-Plug-in, das die Zeit und den Inhalt von Seitenanfragen und -antworten sowie das vom Browser verwendete COOKIE analysiert.


Nehmen Sie mich als Beispiel, installieren Sie es einfach auf Firefox. Der Effekt ist wie folgt:

Sie können die entsprechenden Informationen sehr intuitiv anzeigen.

Klicken Sie auf „Start“, um die Erkennung zu starten, auf „Stopp“, um die Erkennung anzuhalten, und auf „Löschen“, um den Inhalt zu löschen.

Im Allgemeinen klicken Sie vor der Verwendung auf Stopp, um anzuhalten, und klicken Sie dann auf Löschen, um den Bildschirm zu löschen und sicherzustellen, dass Sie die durch den Zugriff auf die aktuelle Seite erhaltenen Daten sehen.


2. Gehen Sie tief hinter die feindlichen Linien

Gehen wir zur Punkteabfrage-Website der Shandong-Universität, um zu sehen, was beim Einloggen gesendet wurde. Information.

Gehen Sie zunächst zur Anmeldeseite und öffnen Sie httpfox. Klicken Sie nach dem Löschen auf Start, um die Erkennung zu aktivieren:

Stellen Sie nach Eingabe der persönlichen Daten sicher, dass httpfox aktiviert ist Klicken Sie dann auf OK, um die Informationen zu übermitteln und sich anzumelden.

Zu diesem Zeitpunkt können Sie sehen, dass httpfox drei Informationen erkannt hat:

Klicken Sie zu diesem Zeitpunkt auf die Stopp-Schaltfläche, um sicherzustellen, dass das, was ist Erfasst werden die Rückmeldungen nach dem Besuch der Seite, damit wir die Anmeldung beim Crawlen simulieren können.

3. Hu Ding Jie Niu

Auf den ersten Blick haben wir drei Daten, zwei sind GET und eine ist POST, aber was genau sind sie? Wir wissen es immer noch nicht.

Wir müssen uns also die erfassten Inhalte einzeln ansehen.

Sehen Sie sich zuerst die POST-Informationen an:


Da es sich um POST-Informationen handelt, können wir uns einfach PostData ansehen.

Sie können sehen, dass es zwei POST-Daten gibt, studid und pwd.

Und aus dem Redirect to of Type geht hervor, dass nach Abschluss des POST zur Seite bks_login2.loginmessage gesprungen wird.

Es ist ersichtlich, dass es sich bei diesen Daten um die Formulardaten handelt, die nach dem Klicken auf „OK“ übermittelt wurden.

Klicken Sie auf das Cookie-Label, um die Cookie-Informationen anzuzeigen:


Ja, ich habe ein KONTO-Cookie erhalten und es wird nach dem automatisch gelöscht Sitzung endet.

Welche Informationen haben Sie nach dem Absenden erhalten?

Werfen wir einen Blick auf die nächsten beiden GET-Daten.

Schauen wir uns zuerst den ersten an. Wir klicken auf das Inhalts-Tag, um den empfangenen Inhalt anzuzeigen. Haben Sie Lust, ihn lebendig zu essen? -Der HTML-Quellcode ist zweifellos offengelegt:


Es scheint, dass dies nur der HTML-Quellcode der Anzeigeseite ist. Klicken Sie auf das Cookie, um das Cookie anzuzeigen -bezogene Informationen:



Aha, es stellt sich heraus, dass der Inhalt der HTML-Seite erst nach den Cookie-Informationen empfangen wurde gesendet.

Schauen wir uns die zuletzt empfangene Nachricht an:

Nach einem groben Blick sollte es sich lediglich um eine CSS-Datei namens style.css handeln, was der Fall ist Das bedeutet für uns keine große Wirkung.

4. Ruhig antworten

Da wir nun wissen, welche Daten wir an den Server gesendet und welche Daten wir empfangen haben, ist der grundlegende Vorgang wie folgt:

Zuerst posten wir die Studenten-ID und das Passwort---> geben dann den Cookie-Wert zurück und senden dann das Cookie an den Server---> Rufen Sie die Daten von der Notenseite ab, verwenden Sie reguläre Ausdrücke, um die Noten und Credits separat zu extrahieren und den gewichteten Durchschnitt zu berechnen.


Okay, es sieht aus wie ein ganz einfaches Beispielpapier. Dann lass es uns ausprobieren.

Aber vor dem Experiment gibt es noch ein ungelöstes Problem: Wo werden die POST-Daten gesendet?

Schauen Sie sich noch einmal die Originalseite an:

Offensichtlich wird es mithilfe eines HTML-Frameworks implementiert, das heißt, die Adresse, die wir in der Adressleiste sehen, ist nicht die Adresse zum Absenden des Formulars auf der rechten Seite.

Wie bekomme ich also die echte Adresse? -Klicken Sie mit der rechten Maustaste, um den Quellcode der Seite anzuzeigen:

Ja, das stimmt, die Seite mit dem Namen „w_right“ ist die Anmeldeseite, die wir wollen.

Die ursprüngliche Adresse der Website lautet:

http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html

Also die wahre Form Einreichung Die Adresse sollte lauten:

http://jwxt.sdu.edu.cn:7777/zhxt_bks/xk_login.html

Nach der Eingabe stellt sich heraus, dass es wie erwartet ist:


Verdammt, es ist das Kursauswahlsystem der Tsinghua-Universität. . . Ich vermute, dass unsere Schule zu faul war, eine Seite zu erstellen, also haben wir sie uns einfach ausgeliehen. . Infolgedessen wurde der Titel nicht einmal geändert. . .

Aber diese Seite ist immer noch nicht die Seite, die wir brauchen, denn die Seite, an die unsere POST-Daten übermittelt werden, sollte die Seite sein, die in der AKTION des Formulars übermittelt wird.

Mit anderen Worten, wir müssen den Quellcode überprüfen, um zu wissen, wohin die POST-Daten gesendet werden:


Nun, optisch ist das das POST-Übermittlung Die Adresse der Daten.

Ordnen Sie es in der Adressleiste ein. Die vollständige Adresse sollte wie folgt lauten:

http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login

(Der Weg, es zu erhalten, ist sehr einfach. Klicken Sie direkt im Firefox-Browser auf den Link, um die Adresse des Links anzuzeigen.)

5. Probieren Sie es aus im Kleinen

Die nächste Aufgabe besteht darin, mit Python das Senden von POST-Daten zu simulieren und den zurückgegebenen Cookie-Wert abzurufen.

Für die Funktionsweise von Cookies können Sie diesen Blogbeitrag lesen:

http://www.jb51.net/article/57144.htm

Wir bereiten zunächst eine vor POST-Daten, bereiten Sie ein Cookie für den Empfang vor und schreiben Sie dann den Quellcode wie folgt:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
cookie = cookielib.CookieJar()  
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的数据#
postdata=urllib.urlencode({  
    'stuid':'201100300428',  
    'pwd':'921030'  
})
#自定义一个请求#
req = urllib2.Request(  
    url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login',  
    data = postdata
)
#访问该链接#
result = opener.open(req)
#打印返回的内容#
print result.read()
Nach dem Login kopieren

Sehen Sie sich anschließend die Auswirkung des Vorgangs an:


ok, auf diese Weise haben wir die Anmeldung erfolgreich simuliert.

6. Eine Sache durch eine andere ersetzen

Die nächste Aufgabe besteht darin, einen Crawler zu verwenden, um die Ergebnisse der Schüler zu ermitteln.

Schauen wir uns noch einmal die Quellwebsite an.

Nachdem Sie HTTPFOX aktiviert haben, klicken Sie, um die Ergebnisse anzuzeigen und festzustellen, dass die folgenden Daten erfasst wurden:


Klicken Sie auf die ersten GET-Daten um den Inhalt anzuzeigen. Es wird festgestellt, dass der Inhalt der Inhalt der erhaltenen Punktzahl ist.

Für den erhaltenen Seitenlink klicken Sie mit der rechten Maustaste, um das Element aus dem Quellcode der Seite anzuzeigen. Sie können die Seite sehen, die nach dem Klicken auf den Link springt (in Firefox müssen Sie nur mit der rechten Maustaste klicken und „ Diesen Frame anzeigen". ):


Sie können den Link zum Anzeigen der Ergebnisse wie folgt erhalten:

http://jwxt .sdu.edu.cn: 7777/pls/wwwbks/bkscjcx.curscopre

7. Alles ist bereit

Jetzt ist alles bereit, also bewerben Sie sich einfach Klicken Sie auf den Link zum Crawler und prüfen Sie, ob Sie die Ergebnisseite anzeigen können.

Wie Sie bei httpfox sehen können, müssen wir ein Cookie senden, um die Punkteinformationen zurückzugeben. Daher verwenden wir Python, um das Senden eines Cookies zum Anfordern der Punkteinformationen zu simulieren:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
#初始化一个CookieJar来处理Cookie的信息#
cookie = cookielib.CookieJar()
#创建一个新的opener来使用我们的CookieJar#
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#需要POST的数据#
postdata=urllib.urlencode({  
    'stuid':'201100300428',  
    'pwd':'921030'  
})
#自定义一个请求#
req = urllib2.Request(  
    url = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login',  
    data = postdata
)
#访问该链接#
result = opener.open(req)
#打印返回的内容#
print result.read()
#打印cookie的值
for item in cookie:  
    print 'Cookie:Name = '+item.name  
    print 'Cookie:Value = '+item.value
    
#访问该链接#
result = opener.open('http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre')
#打印返回的内容#
print result.read()
Nach dem Login kopieren

Drücken Sie F5, um die erfassten Daten auszuführen und anzusehen:


Da es auf diese Weise kein Problem gibt, verwenden Sie reguläre Ausdrücke, um die Daten leicht zu konvertieren Verarbeiten Sie es und nehmen Sie die Credits und die entsprechenden Punkte heraus.

8. So viel HTML-Quellcode ist für unsere Verarbeitung offensichtlich nicht förderlich Extrahieren Sie die erforderlichen Daten.
Tutorials zu regulären Ausdrücken finden Sie in diesem Blog-Beitrag:

http://www.jb51.net/article/57150.htm

Lass uns einen nehmen Schauen Sie sich die Ergebnisse an. Der Quellcode:

In diesem Fall ist die Verwendung regulärer Ausdrücke einfach.
Wir werden den Code ein wenig aufräumen und dann reguläre Ausdrücke verwenden, um die Daten zu extrahieren:

Die Ebene ist begrenzt und reguläre Ausdrücke sind etwas hässlich. Der Laufeffekt ist wie in der Abbildung dargestellt:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
import re
class SDU_Spider:  
    # 申明相关的属性  
    def __init__(self):    
        self.loginUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login'   # 登录的url
        self.resultUrl = 'http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre' # 显示成绩的url
        self.cookieJar = cookielib.CookieJar()                                      # 初始化一个CookieJar来处理Cookie的信息
        self.postdata=urllib.urlencode({'stuid':'201100300428','pwd':'921030'})     # POST的数据
        self.weights = []   #存储权重,也就是学分
        self.points = []    #存储分数,也就是成绩
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))
    def sdu_init(self):
        # 初始化链接并且获取cookie
        myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata)   # 自定义一个请求
        result = self.opener.open(myRequest)            # 访问登录页面,获取到必须的cookie的值
        result = self.opener.open(self.resultUrl)       # 访问成绩页面,获得成绩的数据
        # 打印返回的内容
        # print result.read()
        self.deal_data(result.read().decode('gbk'))
        self.print_data(self.weights);
        self.print_data(self.points);
    # 将内容从页面代码中抠出来  
    def deal_data(self,myPage):  
        myItems = re.findall(&#39;<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>&#39;,myPage,re.S)     #获取到学分
        for item in myItems:
            self.weights.append(item[0].encode(&#39;gbk&#39;))
            self.points.append(item[1].encode(&#39;gbk&#39;))
            
    # 将内容从页面代码中抠出来
    def print_data(self,items):  
        for item in items:  
            print item
#调用  
mySpider = SDU_Spider()  
mySpider.sdu_init()
Nach dem Login kopieren

OK, als nächstes kommt nur noch das Datenverarbeitungsproblem. .

9. Rückkehr im Triumph

Der vollständige Code lautet wie folgt.

Verwandte Empfehlungen:

# -*- coding: utf-8 -*-
#---------------------------------------
#   程序:山东大学爬虫
#   版本:0.1
#   作者:why
#   日期:2013-07-12
#   语言:Python 2.7
#   操作:输入学号和密码
#   功能:输出成绩的加权平均值也就是绩点
#---------------------------------------
import urllib  
import urllib2
import cookielib
import re
import string
class SDU_Spider:  
    # 申明相关的属性  
    def __init__(self):    
        self.loginUrl = &#39;http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login&#39;   # 登录的url
        self.resultUrl = &#39;http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre&#39; # 显示成绩的url
        self.cookieJar = cookielib.CookieJar()                                      # 初始化一个CookieJar来处理Cookie的信息
        self.postdata=urllib.urlencode({&#39;stuid&#39;:&#39;201100300428&#39;,&#39;pwd&#39;:&#39;921030&#39;})     # POST的数据
        self.weights = []   #存储权重,也就是学分
        self.points = []    #存储分数,也就是成绩
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookieJar))
    def sdu_init(self):
        # 初始化链接并且获取cookie
        myRequest = urllib2.Request(url = self.loginUrl,data = self.postdata)   # 自定义一个请求
        result = self.opener.open(myRequest)            # 访问登录页面,获取到必须的cookie的值
        result = self.opener.open(self.resultUrl)       # 访问成绩页面,获得成绩的数据
        # 打印返回的内容
        # print result.read()
        self.deal_data(result.read().decode(&#39;gbk&#39;))
        self.calculate_date();
    # 将内容从页面代码中抠出来  
    def deal_data(self,myPage):  
        myItems = re.findall(&#39;<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>&#39;,myPage,re.S)     #获取到学分
        for item in myItems:
            self.weights.append(item[0].encode(&#39;gbk&#39;))
            self.points.append(item[1].encode(&#39;gbk&#39;))
    #计算绩点,如果成绩还没出来,或者成绩是优秀良好,就不运算该成绩
    def calculate_date(self):
        point = 0.0
        weight = 0.0
        for i in range(len(self.points)):
            if(self.points[i].isdigit()):
                point += string.atof(self.points[i])*string.atof(self.weights[i])
                weight += string.atof(self.weights[i])
        print point/weight
#调用  
mySpider = SDU_Spider()  
mySpider.sdu_init()
Nach dem Login kopieren

So verwenden Sie den Python-Crawler, um diese wertvollen Blogbeiträge zu erhalten

Beispiel für das Teilen von Dynamischer Python-Crawler

Das obige ist der detaillierte Inhalt vonVollständige Aufzeichnung des Schreibens von Python-Crawlern von Scratch_Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage