序文
最近、同社は総額が最も多いギフトパッケージなど、一部のユーザーのデータを購入する必要があります。
しかし、Web サイトにはダウンロード チャネルが提供されていないことがわかりました (私のせいではないのであれば、オペレーターが教えてくれました┓(;´_`)┏)
1 ページにはデータが 10 個しかなく、ジャンプもないため、Web ページをクロールするだけでは明らかに不十分であることがわかりました。その後、フォームを取得するクローラーを作成しましたが、失敗しています。Web サイトには比較的高度な
クローラー対策が施されている可能性があることがわかりました。。。
インターネットで検索したところ、selenium のライブラリを見つけました。
準備
基礎知識はまだ必要ですが、大きなブログを見ることができます
次に、ブラウザ ドライバーをインストールしましょう。ここでは、利用可能なはずの Edge を使用します。最初
にバージョンを確認し
、対応するドライバーを見つけてダウンロード
し、解凍し、Python ディレクトリに置き、
現在のパスを環境変数に保存します ([マイ コンピューター] >> [プロパティ] を右クリック >> [システムの詳細設定] >> [詳細設定] >> [環境変数] >> [システム変数] >> [パス])
しかしプログラムを実行するとバグが見つかる
実際には、ドライバー名をこのエラー レポートにあるものに変更するだけです。
Selenium ライブラリを使用せずにインストールする
良い準備ですね
1. Webページを開きます
Selenium はシミュレーション操作なので、ブラウザを開くところから始まります。
まずライブラリをインポートして場所を設定します
from selenium import webdriver
import time
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 10)
次に、ブラウザを開き、ここでエッジを使用します。すべてがあるはずです。Web サイトに直接アクセスしましょう
driver = webdriver.Edge()
driver.get('https://me.modian.com/u/user_index')
time.sleep(1)
通常開いているブラウザとは表示が異なりますのでご注意ください
2. ログインアカウント
全自動なのでアカウントのパスワードを使う必要がありますが、このボタンの位置を見ると、
classを使って上のラベルを探し、次にh3を使い、最後にspan+click操作ができることが分かりました。
このパートで前述したブログに手順が記載されているので、最初に参照してください。
次のステップは、見つけてクリックすることです
ブラウザが応答するまで待つ必要があるため、ここには時間間隔があり、同じことが後で適用されます。
button1=driver.find_element_by_xpath("//*[@class='login_field']/h3/span")
time.sleep(1)
button1.click()
次のステップでは、2 つの入力ボックスを見つけてログインします。つまり、3 つのコンポーネントを見つけます。
引き続きクラス全体で下位レベルを見つけて、2 つの入力と 1 つのクリックをシミュレートします (アカウントのパスワードを変更せずにフォークして直接実行します Ψ( ̄∀ ̄)Ψ)
time.sleep(1)
driver.find_element_by_xpath("//*[@class='phone']/input").send_keys('你的账号')
driver.find_element_by_xpath("//*[@class='password']/input").send_keys('你的密码')
button2=driver.find_element_by_xpath("//*[@class='loginBtn hover other_input']")
button2.click()
アカウントのホームページに入りましたが、顧客情報はまだここにありません。ここにあるので、
まだクリックする必要があります。
time.sleep(1)
driver.find_element_by_xpath("//*[@id='user_manage']/a").click()
time.sleep(1)
OK、ついにデータページに入りました、完璧です! (*^-^*)ゞ
データの読み取りと保存
まずデータフレームを構築してデータを保存します
df = pd.DataFrame(columns = ['id','name','金额'])
num=0
次に、データがどこにあるかを確認し
、クラスに従ってすべての情報行を読み取り、情報の各行を分割します。
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
print(data)
結局のところ、それは会社情報であり、コードは太いですが、それでも顧客が7つの情報を持っていることがわかります
次のステップでは、保存したい情報を選択し、print(data) を次のコードに変更します。
最後のトランザクション レコード内のグループの行を変更したくないので、判断を下すことに注意してください。
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
ただし、動作中にエラーが報告される場合がありますが、これも理由で、
先ほどの例では、すべてのグループにデータが入っていますが、この項目が空白の場合はどうなるでしょうか。
あ、データが6つしかないので、元の形式からすると当然間違っているので、別の判定を追加します
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
このようにして、1 ページのデータを取得できます。もちろん、後でページをめくる必要があります。従来の方法では、ボタンを見つけてクリックする必要がありました
。
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
このようにして、ページごとに読むことができます。ネットワークが十分に速い場合は上記の時間を短縮できますが、そうでない場合は繰り返し読み込むことになります。次は繰り返し作業です
。
for i in range(1): #你的页数!!!!!!!!!!!!!!!!!!别问我怎么只有一页数据
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
最後に保存を追加します
df.to_excel(r'D:\allmoney.xlsx',index = False)
完成*\(^o^)/*
完全なコード
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 23 19:08:35 2022
@author: xyyl
"""
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
from selenium import webdriver
import time
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 50)
pd.set_option('display.max_columns', 10)
#打开
driver = webdriver.Edge()
driver.get('https://me.modian.com/u/user_index')
time.sleep(1)
#定位账号密码登录
button1=driver.find_element_by_xpath("//*[@class='login_field']/h3/span")
time.sleep(1)
button1.click()
#输入账号密码
time.sleep(1)
driver.find_element_by_xpath("//*[@class='phone']/input").send_keys('你的账号')
driver.find_element_by_xpath("//*[@class='password']/input").send_keys('你的密码')
button2=driver.find_element_by_xpath("//*[@class='loginBtn hover other_input']")
button2.click()
#跳转信息
time.sleep(1)
driver.find_element_by_xpath("//*[@id='user_manage']/a").click()
time.sleep(1)
#创建dataframe
df = pd.DataFrame(columns = ['id','name','金额'])
num=0
#定位客户列表
for i in range(1): #你的页数!!!!!!!!!!!!!!!!!!别问我怎么只有一页数据
userslist = driver.find_elements_by_xpath("//tr[@class='el-table__row']")
for user in userslist:
data=user.text.split('\n')
if len(data) == 7 :
if data[2] == "成交客户":
df.loc[num,'id'] = data[3]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[4]
num = num+1
if len(data) == 6:
if data[1] == "成交客户":
df.loc[num,'id'] = data[2]
df.loc[num,'name'] = data[0]
df.loc[num,'金额'] = data[3]
num = num+1
driver.find_element_by_xpath("//*[@class='el-icon el-icon-arrow-right']").click()
#print(df[-10:-1])
time.sleep(2)
df.to_excel(r'D:\allmoney.xlsx',index = False)
データの実行時間が長いことを除けば効果は良好で、ビジネスをしていない完成間近のウェブサイトのようなブロガーに例えることができます( ̄ω ̄;)