このコラムは、YangXiuzhangのクローラーブック「PythonWebData Crawling and Analysis "From Beginner to Proficiency"」をメインラインとして、個人的な学習と理解をメインコンテンツとして、スタディノートの形式で記述したものに基づいています。
このコラムは、私自身の研究と共有であるだけでなく、クローラーに関する知識を広め、クローラーの簡単なアイデアを提供したいと考えています。
列アドレス:Python Webデータのクロールと分析「エントリから習熟まで」
クローラーのその他の例については、列:Pythonクローラースレッジハンマーテストを参照してください。
前回の記事レビュー:
「Pythonクローラーシリーズの説明」1.ネットワークデータクロールの概要
「Pythonクローラーシリーズの説明」2.Python知識初心者
「Pythonクローラーシリーズの説明」3.正規式クローラーの強力なテスト
「Pythonクローラーシリーズの説明」4.BeautifulSoupテクノロジー
「Pythonクローラーシリーズの説明」5.BeautifulSoupを使用して映画情報をクロールする
「Pythonクローラーシリーズの説明」6.Pythonデータベースの知識
「Pythonクローラーシリーズの説明」7.BeautifulSoupデータベースベースのリクルートクロール
「Pythonクローラーシリーズの説明」8.セレニウムテクノロジー
「 Pythonクローラーシリーズの説明」9.Seleniumを使用してオンライン百科事典の知識をクロールする
「Pythonクローラーシリーズの説明」10.データベースストレージに基づくSeleniumブログクローラー
目次
Webクローラーを作成する過程で、Pythonは通常、ログイン検証を使用してQzoneデータ、Sina Weiboデータ、メールボックスなどのデータをクロールできる状況に遭遇します。検証が行われない場合、一部のWebサイトはホームページデータをインテリジェントにクロールし、多くのWebサイトでさえクロールできません。同時に、ソーシャルネットワークの人気が高まるにつれ、ソーシャルネットワークがもたらす膨大なデータは、ますます多くのアプリケーション価値を持ち、世論分析、テキスト分析、レコメンデーション分析、レコメンデーションシステムなどの分野でよく使用されます。
この記事では、主にログイン検証に基づくSeleniumテクノロジーを紹介し、SeleniumがWeiboデータをクロールする例についても説明します。
この前に、私も同様の記事を書きました。クリックして表示→ログインからクロールへ:Pythonのクロール防止により、宝物から何千もの公開ビジネスデータを取得できます
1ログイン確認
現在、多くのWebサイトにログイン確認ページがあり、セキュリティが向上している一方で、ユーザー権限に応じて管理やスケジュールを変えることができます。たとえば、Baiduのログイン確認ページでは、ユーザー名、パスワード、確認コードを入力する必要があります。では、ユーザーが必要とするデータをログイン後にクロールできる場合、または検証コードをクロールできる場合、それを解決するにはどうすればよいでしょうか。
Pythonクローラーには、ログイン検証を解決するための多くの方法があります。一般的な方法には、ログイン中のメッセージヘッダーの設定、ログインのシミュレーション、ログインインターフェイスのバイパスなどがあります。この記事では、主にSeleniumテクノロジーを組み合わせて、ログイン検証の方法を説明します。
Seleniumテクノロジーはクローラーで使用されているため、自動Webサイトテストでも広く使用されています。キーボードとマウスを自動的に操作してシングルクリック操作をシミュレートできるため、このテクノロジーを使用してログインをシミュレートします。もちろん、シミュレートされたログインがすべてスムーズに進むとは限らず、人間と機械による検証が必要になる場合があります。たとえば、ログインするにはスライダーを正しい位置に移動する必要があります。または、ログインするには検証コードを入力する必要があります。 。
163メールボックスに自動的にログインする機能を実現するために、Pythonコードを作成する必要があるとします。ログインして初めて、メールの送受信メールボックスをクロールして、関連するデータ分析実験を実行できます。
1.1位置決め要素
最初に163Webサイトにアクセスし、ログインユーザー名、パスワード、およびその他の要素を見つけます。通常、F12キーを使用すると、「要素セレクター」を使用して、ターゲット要素に対応するHTMLソースコードをすばやく見つけることができます。
上の図からわかるように、検索する必要のある要素のソースコードは「<inputname = "email">」と「<inputname = "password">」であり、これらはユーザー名とそれぞれパスワード。
1.2Chromeブラウザを開きます
driver = webdriver.Chrome()で定義されたChromeブラウザードライバーを呼び出し、driver.get(ur)関数を使用してブラウザーでターゲットページのURLを開きます。
1.3Seleniumを使用して要素を取得する
Seleniumを介してfind_element_by_name()またはfind_element_by_path()関数を呼び出して、163メールボックスログインのユーザー名とパスワードに対応する要素を見つけ、send_keys()関数を介して正しいユーザー名とパスワードを入力します。コアコードは次のとおりです。
elem_user = driver.find_element_by_name("email")
elem_user.send_keys("这里填用户名")
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys("这里填密码")
1.4一時停止を設定して確認コードを入力し、ログインします
ウェブサイトで確認コードを入力する必要がある場合は、time.sleep(3)を呼び出して一時停止時間を3秒に設定し、確認コードを手動で入力して自動ログインを待つ必要があります。スライダーの確認が必要な場合は、前の記事に、シミュレートされたマウス、キーボードなどを呼び出します。操作はさらに自動化されています。ログイン後、必要なデータを取得できます。
import time
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 打开 Chrome 浏览器,这顶等待加载时间
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
# 模拟登录 163 邮箱
url = 'https://mail.163.com/'
driver.get(url)
# 用户名、密码
driver.find_element_by_xpath('//*[@id="auto-id-1594007552696"]').send_keys('用户名')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="auto-id-1594002566766"]').send_keys('密码')
time.sleep(2)
driver.send_keys(Keys.RETURN)
time.sleep(3)
driver.close()
driver.quit()
たとえば、上記のコードのように、まだログインできない、またはエラーを報告することさえできないことがわかります。これは、多くのWebサイトのログインページが動的に読み込まれ、HTMLノードをキャプチャできず、Seleniumがノードを見つけることができないため、後続の操作を実装できないためです。同時に、Webサイトを開発するプログラマーは、悪意のある攻撃やクロールを防ぐために、WebサイトのHTMLソースコードを時々変更することがよくあります。しかし、このような考え方はすべての人に提供されており、必要なデータをクロールするために、今後も改善を続けてほしいと思います。
2Weiboクローラーについて知る
2.1 微博
MicroBlogの略であるWeiboは、ユーザー関係情報の共有、配布、および取得に基づくフォローメカニズムを通じて、短いリアルタイムの情報を共有するブロードキャストソーシャルメディアおよびネットワークプラットフォームでもあります。これにより、ユーザーはWeb、Wep、Mailを使用できます。 、アプリ、IM、SMS、およびユーザーは、PCや携帯電話などのさまざまなモバイル端末を介してアクセスでき、テキスト、写真、ビデオなどのマルチメディア形式の情報の即時共有と配布を実現します。
共有およびコミュニケーションプラットフォームとして、Weiboは適時性とランダム性にさらに注意を払い、常に自分の考えや最新の開発の使用をより適切に表現できます。ブログは、一定期間に見たものを整理することに重点を置いています。 。あなたが聞いて感じること。一般的なWeiboには、Sina Weibo、Tencent Weibo、Netease Weibo、Sohu Weiboなどが含まれます。特に明記されていない限り、WeiboはSinaWeiboを指します。
Sina Weibo Webページの公式アドレスはhttps://weibo.com/で、ログインインターフェイスは下図のようになっています。人気のWeibo、特に関心のあるWeibo、動的情報などを見ることができます。各Weiboには通常、ユーザー名、Weiboコンテンツ、閲覧量、コメント数、いいね数が含まれています。
個人情報をクリックすると、個人情報、基本情報、フォローしている有名人、ファンなどが表示され、ソーシャルネットワーク分析、世論分析、グラフ関係分析、Weiboユーザーポートレートなどに大きな価値をもたらします。
2.2ログイン入口
なぜログインする必要があるのですか?ログインしないと、Weiboファンリストや個人情報など、SinaWeiboの多くのデータを取得またはアクセスできないためです。これらのハイパーリンクがスタンドアロンの場合、自動的にログインインターフェイスにジャンプします。これは、開発者がWeiboを保護するために取ったものです。同時に、ソフトウェア会社は通常、開発者がWeiboデータにアクセスしたり操作を実行したりするためのAPIインターフェースを提供しますが、ここでは、Seleniumを使用してログイン検証のためのブラウザー操作をシミュレートします。
まず、Weiboのログイン入口を見つける必要があります。URL「https://weibo.com/」を開くと、下図のようなホームページが表示され、右側にログイン場所が表示されます。ただし、WebサイトはHTTPS認証を採用しているため、より安全です。さらに、ログインボタンの動的な読み込みにより、Seleniumをポジショニングに使用できないため、新しいログインエントリを見つける必要があります。
2.2.1 SinaWeiboの一般的なログイン入口
Sina Weiboの一般的なログインエントリURL:https://login.sina.com.cn/ または https://login.sina.com.cn/signup/signin.php
2.2.2 SinaWeibo携帯電話のログイン入口
Sina Weiboのモバイル端末は、携帯電話Weibo APPのデータを保存します。データはより洗練され、画像は小さく、読み込み速度は速くなります。モバイル端末でのリアルタイムアクセスに適しています。そのエントリアドレスです:https://weibo.cn/ または https://weibo.cn/pub/。SinaWeiboモバイルページに表示される情報はまだ非常に洗練されていることがわかります。
次に、Weiboに自動的にログインする方法、話題のトピックをクロールする方法、特定の人のWeibo情報などについて説明します。
2.3Weibo自動ログイン
まず、ブラウザページにターゲットURLを入力し、キーボードのF12キーをクリックし、「要素セレクタ」から「ログイン名」と「パスワード」を見つけて、関連するボタンのHTMLソースコードの場所を表示します。下の図。
id属性が「username」でname属性が「username」のノードを見つけるか、「login name」テキストボックスを見つけるか、<liclass = "item">パスの下にある2番目の入力ノードを見つけることができます。ここでは、Seleniumライブラリの関連関数を使用して、ノードを特定します。コアコードは次のとおりです。
elem_user = driver.find_element_by_name("username")
elem_user.send_keys("登录名")
同様に、「パスワード」テキストボックスのHTMLソースコードを見つけます。コアコードは次のとおりです。
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys("密码")
find_element_by_xpath()関数を呼び出して「ログイン」ボタンノードを見つけ、click()関数を呼び出して「ログイン」ボタンをクリックしてログインします。コードは次のとおりです。
elem_sub = driver.find_element_by_xpath("//input[@class='W_btn_a btn_34px']")
elem_sub.click() # 单击登录
同時に、Enterキー、つまりelem_pwd.send_keys(Keys.RETURN)を押してログインできます。最後に、Seleniumテクノロジーを使用してSina Weiboに自動的にログインするための完全なコードが提供されます。アカウントとパスワードを入力したら、[ログイン]をクリックします。
import time
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 打开 Chrome 浏览器,这顶等待加载时间
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
# 模拟登录新浪微博
url = 'https://login.sina.com.cn/signup/signin.php'
driver.get(url)
driver.implicitly_wait(10) # 隐式等待(单位是秒) 等到页面渲染完之后就不再等待
driver.maximize_window() # 最大化浏览器
# 用户名、密码
elem_user = driver.find_element_by_name("username")
elem_user.send_keys("账户")
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys("密码")
elem_pwd.send_keys(Keys.RETURN)
# 暂停20s,人为输入验证码
time.sleep(20)
elem_sub = driver.find_element_by_xpath('//input[@class="W_btn_a btn_34px"]')
elem_sub.click() # 单击登录
print("登陆成功!")
driver.close()
driver.quit()
注:Weiboにログインするときに確認コードを入力する必要があり、確認コードは[ログイン]ボタンをクリックした後にのみ表示されるため、ユーザーは自動的にアカウントパスワードを入力し、Enterキーを押して確認を行います。コードプロンプトが表示されたら、time.sleep(20)関数を使用して20秒の一時停止を設定し、確認コードを手動で入力してWeiboに正常にログインします。次の図は、アカウント、パスワード、および確認コードを入力した後、正常にログインするプロセスを示しています。
3最新のWeibo情報をクロールする
以下では、Pythonを使用してWeiboの特定のトピックに関するデータをクロールする方法について説明します。
3.1目的のWeiboトピックを検索する
Weiboにログインすると、Weiboでのキーワード検索用のWeibo検索ボックスがページの上部に表示されます。同様に、キーボードのF12キーを押し、「要素セレクター」を使用してターゲットの場所を選択し、HTMLソースコードを表示します。ご覧のとおり、<input in = "search_input">の位置にあります。
次に、driver.find_element_by_xpath()関数を使用して、検索テキストボックスの場所を見つけます。コアコードは次のとおりです。
elem_topic = driver.find_element_by_xpath("//input[@id='search_input']")
elem_topic.send_keys("高考")
elem_topic.send_keys(Keys.RETURN)
ただし、ここでは別の方法を使用してキーワードを入力し、Weiboトピックを検索します。つまり、「Weibo検索」ページ(URL:https://s.weibo.com/)にアクセスし、検索テキストボックスのHTMLソースコードを見つけます。次のように:
find_element_by_xpath()関数を呼び出して検索テキストボックスを見つけ、Enterキーを押して検索してジャンプします。コアコードは次のとおりです。
elem_topic = driver.find_element_by_xpath('//*[@id="pl_homepage_search"]/div/div[2]/div/input')
elem_topic.send_keys("高考")
elem_topic.send_keys(Keys.RETURN)
Weibo検索部分の完全なコードは次のとおりです。
import time
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 打开 Chrome 浏览器,这顶等待加载时间
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
try:
# 访问新浪微博搜索页面
url = 'https://s.weibo.com/'
driver.get(url)
driver.implicitly_wait(10) # 隐式等待(单位是秒) 等到页面渲染完之后就不再等待
driver.maximize_window() # 最大化浏览器
# 按回车键搜索主题
elem_topic = driver.find_element_by_xpath('//*[@id="pl_homepage_search"]/div/div[2]/div/input')
elem_topic.send_keys("高考")
elem_topic.send_keys(Keys.RETURN)
time.sleep(5)
except Exception as e:
print('Error: ', e)
finally:
print('爬取结束!')
3.2Weiboコンテンツのクロール
フィードバック検索結果を取得した後、対応するWeiboコンテンツをクロールできます。また、ブラウザのテクノロジを使用して要素を確認し、ノードを特定します。このテクノロジは、クロールするコンテンツのHTMLソースコードを識別できるため、Webクローラーで広く使用されています。
3.2.1需要分析
以下の図に示すように、取得したWeiboコンテンツの情報を決定します。取得した情報には、ユーザー名、コンテンツ、リリース時間、転送量、コメント数、いいね数が含まれます。その中で、再投稿の数、コメントの数、いいねの数は、Weiboとユーザーの肖像画の人気を分析するために使用できます。
3.2.2WeiboのHTMLソースコード法を分析する
Weibo HTMLソースコードの配布法則を分析する場合、フィードバックは通常、リストの形式になります。たとえば、「大学入試」の題材を検索すると、下図のように、Weiboを大量にフィードバックして順番に配布します。その中で、各Weiboのレイアウトは同じです。上の図に示すように、ソースコードを確認して、どのような法則があるかを確認する必要があります。前述の方法に従って、ターゲットの場所に対応するHTMLソースコードを表示します。
各Weibo情報は<divclass = "card-feed"> ... </ div>ノードの下にあります。複数のWeibo情報は、find_elements_by_xpath()関数を介して取得でき、次にユーザー名などのコア情報を取得できます。コンテンツ、リリース時間、転送量、コメント数、いいね数など。コアコードは次のとおりです。
info = driver.find_elements_by_xpath('//div[@class="card-feed"]')
for value in info:
print(value.text)
content = value.text
このとき、クロールされたコンテンツを下図に示し、正規表現と文字列操作を使用して、必要なフィールドコンテンツを順番に抽出できます。
3.2.3ユーザー名を探す
ノード<divclass = "info"> ... </ div>の下にある最初のハイパーリンク、それに対応するソースコードを次の図に示します。
ユーザー名を見つけるためのPythonのコアコードは次のとおりです。
YHM = driver.find_element_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[6]/div[2]/div[1]/div[2]/div[1]/div[2]/a[1]')
最後に、この記事のすべてのコードは参照用にのみ提供されています。
import time
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 打开 Chrome 浏览器,这顶等待加载时间
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
# 登录函数
def LoginWeibo(username, password):
print('准备登录微博...')
driver.get('https://login.sina.com.cn/')
# 用户名、密码
elem_user = driver.find_element_by_name("username")
elem_user.send_keys(username)
elem_pwd = driver.find_element_by_name("password")
elem_pwd.send_keys(password)
elem_pwd.send_keys(Keys.RETURN)
# 暂停20s,人为输入验证码
time.sleep(20)
elem_sub = driver.find_element_by_xpath('//input[@class="W_btn_a btn_34px"]')
elem_sub.click() # 单击登录
print("登陆成功!")
# 函数搜索主题
def SearchWeibo(topic):
try:
# 访问新浪微博搜索页面
url = 'https://s.weibo.com/'
driver.get(url)
driver.implicitly_wait(10) # 隐式等待(单位是秒) 等到页面渲染完之后就不再等待
driver.maximize_window() # 最大化浏览器
# 按回车键搜索主题
elem_topic = driver.find_element_by_xpath('//*[@id="pl_homepage_search"]/div/div[2]/div/input')
elem_topic.send_keys(topic)
elem_topic.send_keys(Keys.RETURN)
time.sleep(5)
# 获取用户名
for i in range(1,11):
elem_name = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[1]/div[2]/div[1]/div[2]/a[1]'.format(i))
for value in elem_name:
print(value.text)
# 获取内容
for i in range(1,11):
elem_content = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[1]/div[2]/p[1]'.format(i))
for value in elem_content:
print(value.text)
# 获取时间
for i in range(1,11):
elem_time = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[1]/div[2]/p[3]/a[1]'.format(i))
for value in elem_time:
print(value.text)
# 获取来自
for i in range(1,11):
elem_from = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[1]/div[2]/p[3]/a[2]'.format(i))
for value in elem_from:
print(value.text)
# 获取评论数
for i in range(1, 11):
elem_PLnumber = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[2]/ul/li[3]/a'.format(i))
for value in elem_PLnumber:
print(value.text)
# 获取转发数
for i in range(1, 11):
elem_ZFnumber = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[2]/ul/li[2]/a'.format(i))
for value in elem_ZFnumber:
print(value.text)
# 获取点赞数
for i in range(1, 11):
elem_DZnumber = driver.find_elements_by_xpath('//*[@id="pl_feedlist_index"]/div[1]/div[{}]/div[2]/div[2]/ul/li[4]/a/em'.format(i))
for value in elem_DZnumber:
print(value.text)
except Exception as e:
print('Error: ', e)
finally:
print('爬取结束!')
# 主函数
if __name__ == '__main__':
# 定义用户名、密码
username = '账户'
password = '密码'
topic = '高考'
# 调用函数登录微博
LoginWeibo(username, password)
# 调用函数搜索热门主题
SearchWeibo(topic)
4この記事の要約
Pythonを使用してWebクローラーを設計する過程で、ログインしてデータをクロールするために検証する必要がある状況に遭遇することがよくあります。また、Weibo、Zhihu、Email、Qzoneなどの検証コードを入力する必要がある場合もあります。一般的な解決策は、メッセージのヘッダーを設定して、シミュレートされたログインを実装することです。この記事では、Seleniumテクノロジーを介してブラウザーにアクセスし、マウスとキーボードを操作してユーザー名とパスワードを自動的に入力し、フォームを送信してログインする別の方法を紹介します。ログインプロセス中に確認コードを入力する必要がある場合は、time.sleep()コードを使用して一時停止し、確認コードを手動で入力してログインし、必要な情報をクロールできます。このメソッドは、Weiboログイン、電子メールを解決できます。ログイン、およびBaiduログイン、Taobaoログインおよびその他の問題。大量のデータを短時間でクロールする場合、一部のWebサイトのアンチクローラーテクノロジーがクローラーを検出し、WeiboやTaobaoなどの現在のIPをブロックすることに特に注意してください。これはIPを介して実現する必要があります。プロキシ。。もちろん、より実用的なアプリケーションには、さらに詳細な調査と分析が必要です。
メッセージを残し、学び、一緒にコミュニケーションすることを歓迎します〜
読んでくれてありがとう