Heim > Artikel > Backend-Entwicklung > Vollständige Aufzeichnung des Schreibens von Python-Crawlern von Scratch_Python
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.htmlErgebnisse ü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.2. Gehen Sie tief hinter die feindlichen Linien
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:4. Ruhig antworten
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()
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()
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:
# -*- 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, als nächstes kommt nur noch das Datenverarbeitungsproblem. . 9. Rückkehr im Triumph
Der vollständige Code lautet wie folgt.
# -*- 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()
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!