Parlons d'abord du site Web de notre école :
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
Vous devez vous connecter pour vérifier les scores , puis il sera affiché. Les résultats de chaque matière sont affichés, mais seuls les résultats sont affichés sans les notes, qui sont la note moyenne pondérée.
De toute évidence, calculer manuellement les notes est une chose très gênante. Nous pouvons donc utiliser Python pour créer un robot permettant de résoudre ce problème.
1. A la veille de la bataille décisive
Préparons d'abord un outil : le plug-in HttpFox.
Il s'agit d'un plug-in d'analyse du protocole http qui analyse l'heure et le contenu des requêtes et des réponses des pages, ainsi que le COOKIE utilisé par le navigateur.
Prenez-moi comme exemple, installez-le simplement sur Firefox, l'effet est le suivant :
Oui Visualisez les informations correspondantes de manière très intuitive.
Cliquez sur Démarrer pour démarrer la détection, cliquez sur Arrêter pour suspendre la détection et cliquez sur Effacer pour effacer le contenu.
Généralement, avant de l'utiliser, cliquez sur arrêter pour mettre en pause, puis cliquez sur Effacer pour effacer l'écran afin de vous assurer que vous voyez les données obtenues en accédant à la page en cours.
2. Allez au plus profond des lignes ennemies
Allons sur le site Web de requête de score de l'Université du Shandong pour voir quelles informations sont envoyées lors de la connexion.
Allez d'abord sur la page de connexion, ouvrez httpfox, après avoir effacé, cliquez sur Démarrer pour lancer la détection :
Après avoir saisi les informations personnelles, assurez-vous que httpfox est activé. Cliquez ensuite sur OK pour soumettre les informations et vous connecter.
À ce moment, vous pouvez voir que httpfox a détecté trois informations :
À ce moment, cliquez sur le bouton d'arrêt pour vous assurer que ce qui est sont capturés les commentaires après avoir visité la page afin que nous puissions simuler la connexion lors de l'exécution de robots d'exploration.
3. Jiedin Niu
À première vue, nous avons trois données, deux sont GET et une est POST, mais lesquelles sont-elles et comment ? il devrait être utilisé, nous n’en avons toujours aucune idée.
Nous devons donc examiner le contenu capturé un par un.
Regardez d'abord les informations POST :
Puisqu'il s'agit d'informations POST, nous pouvons simplement regarder PostData.
Vous pouvez voir qu'il existe deux données POST, studid et pwd.
Et on peut voir à partir de la redirection vers de type qu'une fois le POST terminé, il passe à la page bks_login2.loginmessage.
On peut voir que ces données sont les données du formulaire soumises après avoir cliqué sur OK.
Cliquez sur l'étiquette du cookie pour voir les informations sur le cookie :
Oui, un cookie de COMPTE a été reçu et sera automatiquement détruit une fois la session terminée.
Alors, quelles informations avez-vous reçues après avoir soumis votre candidature ?
Jetons un coup d'œil aux deux données GET suivantes.
Regardons d'abord le premier. On clique sur la balise content pour visualiser le contenu reçu. Avez-vous envie de le manger vivant ? -Le code source HTML est sans aucun doute exposé :
Il semble qu'il ne s'agisse que du code source html de la page d'affichage. Cliquez sur le cookie pour afficher les informations relatives aux cookies. :
Aha, il s'avère que le contenu de la page html n'a été reçu qu'après l'envoi des informations sur le cookie.
Regardons le dernier message reçu :
Après un examen approximatif, il devrait s'agir simplement d'un fichier CSS appelé style.css, qui ne ça ne veut pas dire grand chose pour nous.
4. Répondez calmement
Maintenant que nous savons quelles données nous avons envoyées au serveur et quelles données nous avons reçues, le processus de base est le suivant :
Premièrement , nous POSTONS l'identifiant et le mot de passe de l'étudiant ---> Renvoyons ensuite la valeur du cookie
Envoyons ensuite le cookie au serveur ---> Renvoyons les informations de la page.
Récupérez les données de la page des notes, utilisez des expressions régulières pour extraire les notes et les crédits séparément et calculer la moyenne pondérée.
OK, cela ressemble à un échantillon de papier très simple. Alors essayons-le.
Mais avant l'expérience, il reste encore un problème non résolu : où sont envoyées les données POST ?
Regardez à nouveau la page d'origine :
Elle est évidemment implémentée à l'aide d'un framework html, c'est-à-dire ce que l'on voit dans la barre d'adresse. L'adresse n'est pas l'adresse pour soumettre le formulaire à droite.
Alors, comment puis-je obtenir la vraie adresse -. -Clic droit pour afficher le code source de la page :
Oui, c'est vrai, celle avec name="w_right" est la page de connexion que nous voulons.
L'adresse originale du site Web est :
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
Donc, la forme réelle soumission L'adresse doit être :
http://jwxt.sdu.edu.cn:7777/zhxt_bks/xk_login.html
Après l'avoir saisie, il s'avère qu'elle est comme prévu :
Merde, c'est le système de sélection de cours de l'Université Tsinghua. . . Je suppose que notre école était trop paresseuse pour créer une page, alors nous l'avons simplement empruntée. . En conséquence, le titre n’a même pas été modifié. . .
Mais cette page n'est toujours pas la page dont nous avons besoin, car la page à laquelle nos données POST sont soumises devrait être la page soumise dans l'ACTION du formulaire.
En d'autres termes, nous devons vérifier le code source pour savoir où les données POST sont envoyées :
Eh bien, par inspection visuelle, c'est le adresse où les données POST sont soumises.
Organisez-le dans la barre d'adresse. L'adresse complète doit être la suivante :
http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login
(La façon de l'obtenir est très simple, cliquez sur le lien directement dans le navigateur Firefox pour voir l'adresse du lien)
5. Un petit test de vos compétences
La tâche suivante est : utiliser python pour simuler l'envoi de données POST et obtenir la valeur du cookie renvoyée.
Pour plus d'informations sur le fonctionnement des cookies, vous pouvez lire cet article de blog :
http://blog.csdn.net/wxg694175346/article/ details/8925978
Nous préparons d'abord des données POST, puis préparons un cookie à recevoir, puis écrivons le code source comme suit :
# -*- 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()
Après cela, regardons l'effet de l'opération :
ok, comme ça, nous avons réussi à simuler la connexion.
6. Changer la situation
La tâche suivante consiste à utiliser un robot pour obtenir les scores des élèves.
Regardons à nouveau le site Web source.
Après avoir ouvert HTTPFOX, cliquez pour afficher les résultats et constater que les données suivantes ont été capturées :
Cliquez sur la première donnée GET et vérifiez le contenu pour constater que le contenu est le contenu des résultats obtenus.
Pour obtenir le lien de la page, faites un clic droit pour afficher l'élément à partir du code source de la page, et vous pouvez voir la page qui saute après avoir cliqué sur le lien (dans Firefox, il vous suffit de faire un clic droit, "Afficher ce cadre", et c'est tout) :
Vous pouvez obtenir Le lien pour consulter les résultats est le suivant :
http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre
7. Tout est prêt
Maintenant, tout est prêt, alors appliquez simplement le lien au robot et voyez si vous pouvez afficher la page de résultats.
Comme vous pouvez le voir sur httpfox, nous devons envoyer un cookie pour renvoyer les informations de score, nous utilisons donc python pour simuler l'envoi d'un cookie pour demander les informations de score :
# -*- 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()
Appuyez simplement sur F5 pour exécuter et jetez un œil aux données capturées :
Dans ce cas, il n'y a pas de problème, utilisez des expressions régulières Traiter les données un peu et extrayez les crédits et les partitions correspondantes.
8. Obtenez-le à portée de main
Une si grande quantité de code source HTML n'est évidemment pas propice à notre traitement. Ensuite, nous devons utiliser des expressions régulières pour extraire le nécessaire. données.
Pour des tutoriels sur les expressions régulières, vous pouvez consulter cet article de blog :
http://blog.csdn.net/wxg694175346/article/details/8929576
Jetons un coup d'œil au code source des résultats :
既然如此,用正则表达式就易如反掌了。
我们将代码稍稍整理一下,然后用正则来取出数据:
# -*- 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)!