Scratch_python からの Python クローラーの作成の完全な記録
最初の9回の記事は基礎から書き方まで詳しく紹介していますので、10回目の記事ではクローラープログラムの書き方をステップバイステップで詳しく記録していきます。本校のウェブサイトについて:
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
スコアを確認するには、ログインする必要があり、各科目のスコアが表示されます。ただし、加重平均点である成績点は表示されません。
このように評定点を手動で計算するのは、明らかに非常に面倒です。したがって、Python を使用してこの問題を解決するクローラーを作成できます。
まずツールを準備しましょう:HttpFoxプラグイン。
これは、ページのリクエストとレスポンスの時間と内容、およびブラウザで使用される COOKIE を分析する http プロトコル分析プラグインです。
例として、Firefox にインストールするだけで、次のような効果が得られます:
対応する情報を非常に直感的に表示できます。
「開始」をクリックして検出を開始し、「停止」をクリックして検出を一時停止し、「クリア」をクリックしてコンテンツをクリアします。
通常、使用する前に、[停止] をクリックして一時停止し、[クリア] をクリックして画面をクリアし、現在のページにアクセスして取得したデータが表示されていることを確認します。
ログイン時にどのような情報が送信されるかを確認するには、山東大学のスコア照会 Web サイトにアクセスしてみましょう。
まず、ログイン ページに移動し、httpfox を開いてクリアし、[開始] をクリックして検出を開始します:
個人情報を入力した後、httpfox がオンになっていることを確認し、[OK] をクリックして情報を送信し、ログに記録しますで。
この時点で、httpfox が 3 つの情報を検出したことがわかります:
この時点で、ページにアクセスした後にフィードバックされたデータが確実にキャプチャされるように、ログインをシミュレートできるように、停止ボタンをクリックします。クローラーをするとき。
一見すると、GET が 2 つ、POST が 1 つで、合計 3 つのデータが得られましたが、それらが何なのか、どのように使用するのかはまだわかりません。
そのため、キャプチャしたコンテンツを 1 つずつ確認する必要があります。
最初にPOST情報を見てみましょう:
POST情報なので、PostDataを見るだけで済みます。
POSTデータはstudidとpwdの合計2つあることがわかります。
そして、Type の Redirect to から、POST 完了後に bks_login2.loginmessage ページにジャンプすることがわかります。
このデータは、「OK」をクリックした後に送信されたフォームデータであることがわかります。
Cookie ラベルをクリックすると、Cookie 情報が表示されます:
はい、ACCOUNT Cookie が受信されました。セッション終了後に自動的に破棄されます。
それでは、送信後にどのような情報を受け取りましたか?
次の 2 つの GET データを見てみましょう。
まず最初のものを見てみましょう。コンテンツタグをクリックして、受け取ったコンテンツを表示します。 -HTML ソース コードは間違いなく公開されています:
これは単にページの HTML ソース コードであるようです。Cookie をクリックすると、Cookie 関連の情報が表示されます:
。ああ、HTML ページの元のコンテンツは、Cookie 情報が送信された後に受信されました。
最後に受信したメッセージを見てみましょう:
大まかに見てみると、これは style.css という単なる CSS ファイルであるはずですが、これは私たちにはあまり影響しません。
サーバーに送信したデータと受信したデータがわかったので、基本的なプロセスは次のとおりです:
まず、学生 ID とパスワードを送信します--- > ;その後、Cookie の値を返し、Cookie をサーバーに送信します--->ページ情報を返します。成績ページからデータを取得し、正規表現を使用して成績と単位を個別に抽出し、加重平均を計算します。
OK、非常に単純なサンプル用紙のように見えます。それでは試してみましょう。
しかし、実験の前に、POST データがどこに送信されるかという未解決の問題がまだあります。
元のページをもう一度見てください:
明らかに、これは HTML フレームワークを使用して実装されています。つまり、アドレス バーに表示されるアドレスは、右側のフォームを送信するアドレスではありません。
それでは、どうすれば本当の住所を取得できるのでしょうか - 。 - 右クリックしてページのソース コードを表示します:
はい、そうです。name="w_right" を持つものが目的のログイン ページです。
Web サイトの元のアドレスは:
http://jwxt.sdu.edu.cn:7777/zhxt_bks/zhxt_bks.html
したがって、実際のフォーム送信アドレスは次のようになります:
http://jwxt .sdu.edu.cn:7777/zhxt_bks/xk_login.html
入力してみると、
清華大学のコース選択システムであることが判明しました。 。 。おそらくうちの学校はページを作るのが面倒だったので、そのまま借りただけだと思います。 。結果的にはタイトルも変更されませんでした。 。 。
しかし、このページはまだ必要なページではありません。POST データが送信されるページは、フォームの ACTION で送信されるページである必要があるためです。
つまり、POST データが送信される場所を知るためにソース コードをチェックする必要があります:
そうですね、視覚的に言うと、これは POST データが送信されるアドレスです。
アドレスバーに配置します。完全なアドレスは次のようになります:
http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bks_login2.login
(取得方法は非常に簡単です。Firefox で参照します。ブラウザでリンクを直接クリックすると、リンクのアドレスが表示されます)
5. 試してみましょう
次のタスクは、Python を使用して POST データの送信をシミュレートし、返された Cookie 値。
Cookieの操作については、次のブログ投稿を参照してください:
http://www.jb51.net/article/57144.htm
最初にPOSTデータを準備し、次にCookie受信を準備し、次に書き込みますソース コードは次のとおりです。
# -*- 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()
この後、実行時の効果を見てみましょう:
これで、シミュレートされたログインが成功したことが計算されます。
6. あるものを別のものに置き換える
次のタスクは、クローラーを使用して生徒のスコアを取得することです。
ソースのウェブサイトをもう一度見てみましょう。
HTTPFOX を開いた後、クリックして結果を表示し、次のデータがキャプチャされたことを確認します。
最初の GET データをクリックしてコンテンツを表示すると、Content が取得された結果のコンテンツであることがわかります。
取得したページリンクは、右クリックしてページのソースコードから要素を表示すると、リンクをクリック後にジャンプするページが表示されます(Firefoxの場合は右クリックして「このフレームを表示」するだけです) ):
次のように結果を表示するためのリンクを取得できます:
http://jwxt.sdu.edu.cn:7777/pls/wwwbks/bkscjcx.curscopre
7。すべての準備が整いました
これですべての準備が整ったので、クローラーにリンクを適用して、結果ページが表示されるかどうかを確認してください。
httpfox からわかるように、スコア情報を返すには Cookie を送信する必要があるため、Python を使用してスコア情報を要求する Cookie の送信をシミュレートします:
# -*- 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()
F5 を押して実行して確認します。キャプチャされたデータ:
このままでも問題ないので、正規表現を使ってデータを少し加工して、クレジットと対応するスコアを抽出します。
8. すぐに使える
このような大量の HTML ソース コードは明らかに処理に役立ちません。次に、正規表現を使用して必要なデータを抽出する必要があります。
正規表現のチュートリアルについては、次のブログ投稿をご覧ください:
http://www.jb51.net/article/57150.htm
結果のソース コードを見てみましょう:
そんな時は、正規表現を使えば簡単です。
コードを少し整理してから、正規表現を使用してデータを抽出します。
# -*- 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 クローラーを使用して貴重なブログ投稿を取得する方法
以上がScratch_python からの Python クローラーの作成の完全な記録の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

この記事では、MySQLデータベースの操作を紹介します。まず、MySQLWorkBenchやコマンドラインクライアントなど、MySQLクライアントをインストールする必要があります。 1. mysql-uroot-pコマンドを使用してサーバーに接続し、ルートアカウントパスワードでログインします。 2。CreatedAtaBaseを使用してデータベースを作成し、データベースを選択します。 3. createTableを使用してテーブルを作成し、フィールドとデータ型を定義します。 4. INSERTINTOを使用してデータを挿入し、データをクエリし、更新することでデータを更新し、削除してデータを削除します。これらの手順を習得することによってのみ、一般的な問題に対処することを学び、データベースのパフォーマンスを最適化することでMySQLを効率的に使用できます。

mysqlダウンロードファイルは破損していますが、どうすればよいですか?残念ながら、MySQLをダウンロードすると、ファイルの破損に遭遇できます。最近は本当に簡単ではありません!この記事では、誰もが迂回を避けることができるように、この問題を解決する方法について説明します。それを読んだ後、損傷したMySQLインストールパッケージを修復するだけでなく、将来の行き詰まりを避けるために、ダウンロードとインストールプロセスをより深く理解することもできます。最初に、ファイルのダウンロードが破損した理由について話しましょう。これには多くの理由があります。ネットワークの問題は犯人です。ダウンロードプロセスの中断とネットワーク内の不安定性は、ファイル腐敗につながる可能性があります。ダウンロードソース自体にも問題があります。サーバーファイル自体が壊れており、もちろんダウンロードすると壊れています。さらに、いくつかのウイルス対策ソフトウェアの過度の「情熱的な」スキャンもファイルの破損を引き起こす可能性があります。診断問題:ファイルが本当に破損しているかどうかを判断します

MySQLのインストール障害の主な理由は次のとおりです。1。許可の問題、管理者として実行するか、SUDOコマンドを使用する必要があります。 2。依存関係が欠落しており、関連する開発パッケージをインストールする必要があります。 3.ポート競合では、ポート3306を占めるプログラムを閉じるか、構成ファイルを変更する必要があります。 4.インストールパッケージが破損しているため、整合性をダウンロードして検証する必要があります。 5.環境変数は誤って構成されており、環境変数はオペレーティングシステムに従って正しく構成する必要があります。これらの問題を解決し、各ステップを慎重に確認して、MySQLを正常にインストールします。

MySQLは開始を拒否しましたか?パニックにならないでください、チェックしてみましょう!多くの友人は、MySQLのインストール後にサービスを開始できないことを発見し、彼らはとても不安でした!心配しないでください、この記事はあなたがそれを落ち着いて対処し、その背後にある首謀者を見つけるためにあなたを連れて行きます!それを読んだ後、あなたはこの問題を解決するだけでなく、MySQLサービスの理解と問題のトラブルシューティングのためのあなたのアイデアを改善し、より強力なデータベース管理者になることができます! MySQLサービスは開始に失敗し、単純な構成エラーから複雑なシステムの問題に至るまで、多くの理由があります。最も一般的な側面から始めましょう。基本知識:サービススタートアッププロセスMYSQLサービススタートアップの簡単な説明。簡単に言えば、オペレーティングシステムはMySQL関連のファイルをロードし、MySQLデーモンを起動します。これには構成が含まれます

MySQLは、基本的なデータストレージと管理のためにネットワーク接続なしで実行できます。ただし、他のシステムとのやり取り、リモートアクセス、または複製やクラスタリングなどの高度な機能を使用するには、ネットワーク接続が必要です。さらに、セキュリティ対策(ファイアウォールなど)、パフォーマンスの最適化(適切なネットワーク接続を選択)、およびデータバックアップは、インターネットに接続するために重要です。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

MySQLパフォーマンスの最適化は、インストール構成、インデックス作成、クエリの最適化、監視、チューニングの3つの側面から開始する必要があります。 1。インストール後、INNODB_BUFFER_POOL_SIZEパラメーターやclose query_cache_sizeなど、サーバーの構成に従ってmy.cnfファイルを調整する必要があります。 2。過度のインデックスを回避するための適切なインデックスを作成し、説明コマンドを使用して実行計画を分析するなど、クエリステートメントを最適化します。 3. MySQL独自の監視ツール(ShowProcessList、ShowStatus)を使用して、データベースの健康を監視し、定期的にデータベースをバックアップして整理します。これらの手順を継続的に最適化することによってのみ、MySQLデータベースのパフォーマンスを改善できます。
