Heim >Backend-Entwicklung >Python-Tutorial >[Python] Web Crawler (10): Der gesamte Entstehungsprozess eines Crawlers (am Beispiel der Notenberechnung der Shandong University)
Lassen Sie uns zunächst über die Website unserer Schule sprechen:
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
Sie müssen sich anmelden, um die Ergebnisse zu überprüfen , und dann werden die Ergebnisse für jedes Fach angezeigt, es werden jedoch nur die Ergebnisse ohne die Notenpunkte angezeigt, bei denen es sich um die gewichtete Durchschnittspunktzahl handelt.
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. Am 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 unten gezeigt:
Ja Sehen Sie sich die entsprechenden Informationen sehr intuitiv an.
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
Besuchen Sie die Website der Shandong-Universität, um zu sehen, welche Informationen beim Anmelden gesendet werden.
Gehen Sie zuerst zur Anmeldeseite, öffnen Sie httpfox, klicken Sie nach dem Löschen auf Start, um die Erkennung zu starten:
Stellen Sie nach Eingabe der persönlichen Daten sicher, dass httpfox ist aktiviert. 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. Jiedin Niu
Auf den ersten Blick haben wir drei Daten erhalten, zwei sind GET und einer ist POST, aber was sind sie und wie? Es sollte verwendet werden, wir haben noch keine Ahnung.
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, ein ACCOUNT-Cookie wurde empfangen und wird nach Ende der Sitzung automatisch gelöscht.
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 Seite ist. Klicken Sie auf das Cookie, um die Cookie-bezogenen Informationen anzuzeigen:
Aha, es stellt sich heraus, dass der Inhalt der HTML-Seite erst empfangen wurde, nachdem die Cookie-Informationen gesendet wurden.
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 , wir posten den Studentenausweis und das Passwort ---> geben dann den Cookie-Wert zurück
senden dann das Cookie an den Server ---> geben die Seiteninformationen zurück.
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?
Sehen Sie sich noch einmal die Originalseite an:
Es ist offensichtlich mit einem HTML-Framework implementiert, das heißt, was wir in der Adressleiste sehen Die Adresse ist nicht die Adresse zum Absenden des Formulars auf der rechten Seite.
Wie bekomme ich also die echte Adresse? -Rechtsklick, 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, durch visuelle Inspektion ist dies der Fall Adresse, an die die POST-Daten übermittelt werden.
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 Linkadresse anzuzeigen.)
5. Ein kleiner Test Ihrer Fähigkeiten
Die nächste Aufgabe ist: Verwenden Sie Python, um das Senden von POST-Daten zu simulieren und den zurückgegebenen Cookie-Wert zu erhalten.
Informationen über die Funktionsweise von Cookies finden Sie in diesem Blogbeitrag:
http://blog.csdn.net/wxg694175346/article/ Details/8925978
Wir bereiten zuerst POST-Daten vor, bereiten dann ein Cookie für den Empfang vor und schreiben 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()
Danach schauen wir uns an Die Auswirkung des Vorgangs:
ok, so haben wir die Anmeldung erfolgreich simuliert.
6. Die Situation ändern
Die nächste Aufgabe besteht darin, mithilfe eines Crawlers die Ergebnisse der Schüler zu ermitteln.
Schauen wir uns noch einmal die Quellwebsite an.
Klicken Sie nach dem Öffnen von HTTPFOX, um die Ergebnisse anzuzeigen und festzustellen, dass die folgenden Daten erfasst wurden:
Klicken Sie auf die ersten GET-Daten und überprüfen Sie den Inhalt, um festzustellen, dass der Inhalt der Inhalt der erhaltenen Ergebnisse ist.
Um den Seitenlink zu erhalten, klicken Sie mit der rechten Maustaste, um das Element aus dem Seitenquellcode anzuzeigen. Sie können die Seite sehen, die nach dem Klicken auf den Link springt (in Firefox, Sie müssen nur mit der rechten Maustaste klicken, „Diesen Rahmen anzeigen“, fertig):
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 fertig
Jetzt ist alles fertig, also wenden Sie einfach den Link an den Crawler an und schauen Sie, ob Sie die Ergebnisseite sehen 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()
Drücken Sie einfach F5, um die erfassten Daten auszuführen und anzusehen:
In diesem Fall gibt es kein Problem. Verwenden Sie reguläre Ausdrücke, um die Daten zu verarbeiten ein wenig und extrahieren Sie die Credits und die entsprechenden Punkte.
8. Holen Sie es sich zur Hand
Eine so große Menge an HTML-Quellcode ist für unsere Verarbeitung offensichtlich nicht förderlich. Als nächstes müssen wir reguläre Ausdrücke verwenden, um das Notwendige zu extrahieren Daten.
Tutorials zu regulären Ausdrücken finden Sie in diesem Blogbeitrag:
http://blog.csdn.net/wxg694175346/article/details/8929576
Werfen wir einen Blick auf den Quellcode der Ergebnisse:
既然如此,用正则表达式就易如反掌了。
我们将代码稍稍整理一下,然后用正则来取出数据:
# -*- 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('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S) #获取到学分 for item in myItems: self.weights.append(item[0].encode('gbk')) self.points.append(item[1].encode('gbk')) # 将内容从页面代码中抠出来 def print_data(self,items): for item in items: print item #调用 mySpider = SDU_Spider() mySpider.sdu_init()
水平有限,,正则是有点丑,。运行的效果如图:
ok,接下来的只是数据的处理问题了。。
9.凯旋而归
完整的代码如下,至此一个完整的爬虫项目便完工了。
# -*- 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 = '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.calculate_date(); # 将内容从页面代码中抠出来 def deal_data(self,myPage): myItems = re.findall('<TR>.*?<p.*?<p.*?<p.*?<p.*?<p.*?>(.*?)</p>.*?<p.*?<p.*?>(.*?)</p>.*?</TR>',myPage,re.S) #获取到学分 for item in myItems: self.weights.append(item[0].encode('gbk')) self.points.append(item[1].encode('gbk')) #计算绩点,如果成绩还没出来,或者成绩是优秀良好,就不运算该成绩 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()
以上就是 [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)的内容,更多相关内容请关注PHP中文网(www.php.cn)!