Pythonは淘宝網の売上データをクロールします!今年のデータはお金です!

 

序文

この記事では、淘宝網のWebサイトで、各カテゴリで最も売れている製品データコードをクロールする方法を学習する実装プロセスを記録します。これには、セレンライブラリのWebドライバーを使用して、GOOGLEブラウザーを操作し、ログイン、検索、クリックして並べ替えることが含まれます。売上高は上から下へ、ページのコンテンツを取得して使用します。美しいライブラリ分析プロセス。

1.基本的な環境構成

Pythonバージョン:python 3.8.3エディター:anaconda3でのスパイダーブラウザーバージョン:Google Chrome 87.0.4280.88ブラウザードライバー:この記事では、セレンのWebドライバーを使用してブラウザーを駆動し、情報をクロールするための人間のクリック動作をシミュレートします。これもダウンロードする必要があるためです。対応するバージョンのブラウザドライバー、Googleドライブのダウンロードアドレス:https://npm.taobao.org/mirrors/chromedriverこのアドレスにはさまざまなバージョンのドライバーがあります。自分のバージョンでGoogleドライブを見つけてください(ダウンロードしたバージョンは/87.0.4280.20)、ダウンロードしてGoogleディレクトリに配置し、環境変数へのパスを追加します。

次に、手順を使用します

1.ライブラリをインポートします

コードは次のとおりです(例):

BS4輸入BeautifulSoupから
セレンのインポートからwebdriverを
#ActionChainは、いくつかの基本的な自動化された操作を実装するために使用されます。このようActionChainsマウスの移動、マウスのクリックなどなどをワンステップで複数のステップを実装することができ
selenium.webdriverインポートActionChainsから
PILをインポート
PILインポートイメージから
インポートtime 
import base64#Base64エンコーディングは、バイナリから文字
インポートスレッドへのプロセスです。
インポートパンダをpdとしてインポートします。

メインライブラリの役割:BeautifulSoup:HTMLまたはXMLファイルからデータを抽出し、通常のドキュメントナビゲーションを実現し、お気に入りのコンバーターを介してドキュメントを検索および変更できるPythonライブラリ。この記事では、主にライブラリを使用してWebページをクロールします。 of webriverデータは、目的のデータコンテンツを取得するために解析されます。詳細については、次のURLを参照してください。https://beautifulsoup.readthedocs.io/zh_CN/latest/ selenium.webdriver:通常、Pythonはurllibのurlopenを使用してクロールします。 webpage data。メソッド、Webページオブジェクトを返し、readメソッドを使用してurlのhtmlコンテンツを取得し、美しいスープを通常の式と組み合わせて使用​​して特定のタグコンテンツを取得すると、urlopenはWebサイトコンテンツへのアクセスも実現できます。毎回ログインしなくてもログイン後にCookieを使用するログインの問題;ただし、urllibの制限は、Webページの静的なhtmlコンテンツしか取得できないことです。Webページの動的コンテンツは静的コンテンツに含まれていません。 htmlであるため、クロールされたWebサイトのhtml情報が実際のWebサイトと同じである場合があります。表示されるhtml情報に一貫性がありません。セレンモジュールは、動的なWebページによって生成されたコンテンツを取得できます。画像:Image.open()はフォルダ内の画像を開くことができます。この記事は、ローカルにダウンロードされたTaobaoログインQRコードを開くために使用されます。大きな画像QRコードをスキャンして開くと、Taobaoスキャンコードログインを実現できます。time:この記事では、time.sleep()メソッドを使用して一時スリープ関数を実現し、アクセス速度がクローラーとして認識されないようにすることができます。

2.実際のケース

淘宝網にログインします。

def login_first(self):#Taobao
        
        ホームページリンクrequest.getは、最初にhttpsを使用すると502のstatus_codeを返します
        #pageview_url = 'http://www.taobao.com/?spm = a1z02.1.1581860521.1.CPoW0X ' class属性
        #PhantomJSとChromeの違いは、Chromeがブラウザを起動し、コード操作の各ステップで実行されるページ操作を監視できることです。PhantomJSは仮想ブラウザをシミュレートします。つまり、ブラウザを開かずに操作します。 browser 
        #driver = webdriver.PhantomJS()
        #driver = webdriver.Chrome()がクラスプロパティで定義さています#get()ステップでの読み込み時間が非常に長くなります。ネットワークの問題かどうかはわかりません、したがって、20秒後に
        self.driverのロードを停止するように制限されています。set_page_load_timeout(40)
        self.driver.set_script_timeout(40)
        try:
            self.driver.get(self.pagelogin_url)
        ただし、
            print( "ページのロードが遅すぎます。ロードを停止し、次のステップに
            進みます")self.driver.execute_script(" window.stop() ")
        ます待機を設定する必要があります。そうしないと、ページがキャッシュされる前に次のステートメントが実行された場合、要素が見つかりません
        #ここでtime.sleep(40)#
        ログインボタンを見つけてクリックします#元々、
        Cookieを取得した後、Cookieでアクセスしますリクエストライブラリを介してログインする必要がありますアクセス可能なページ
        のみ
        ですが、ウェブドライバーには影響しません#wedriver要素の配置のさまざまな方法https://www.cnblogs.com/yufeihlf/p/5717291.html#ウェブページの自動化の最も基本的な要件は、最初に各要素を見つけます。次に、各要素を操作できます(入力、クリック、クリア、送信など)。
        #XPathは、XMLドキュメント内の要素を見つけるための言語です。この配置方法は、一般的に使用される配置方法でもあり
        ます。#8.1属性による要素の検索find_element_by_xpath( "// tag name [@ attribute = 'attribute value']")#可能な
        属性:id、class、name、maxlength#
        タグ名による検索属性:すべての入力タグ要素find_element_by_xpath( "// input")#
        親と子で属性を検索:すべての入力タグ要素find_element_by_xpath( "// span / input")
        #要素の内容で検索:find_element_by_xpath( "// p [contains (テキスト()、 'Jinggong.com')] ")
        #id = "login" // 'のラベルの下で最初のdivを取得するということは、任意のノードからの検索がルートノードセクションからである必要がないことを
        #。 tag_nameによる要素
        #対応するボタンまたはページのxpathコンテンツを見つける方法:ページを確認し、左上隅の矢印記号を
        クリックします
        #次に、ターゲットコンテンツをクリックすると、Elementsでコンテンツのラベル属性が自動的に検索されます。右クリックします。 Xpathを    #self.driver.find_element_by_xpath( '// * [@ class = "btn-login ml1 tb-bg weight"]')。click()
  
        #time.sleep(40)にコピーします。
        ダウンストリームコードの目的: QRコードログインのソースコードを見つけるクリックしてQRコードコードログインを使用して
        みてください:
            #QRコードログインに
            対応する属性を見つけ、QRコードをクリックしてログインしてくださいdriver_data = self.driver.find_element_by_xpath( '// * [ @ id = "login"] / div [1] / i ')
        。click ()
            
        except:
            pass #通常
        、数秒間一時停止する必要があります。そうしないと、クローラーとして検出されます#Web
        ページのバッファーを待つtime.sleep( 20)
        #JSを
        実行してキャンバスのQRコードを取得JS = 'return document.getElementsByTagName( "canvas")[0] .toDataURL( "image / png");' 
        im_info = self.driver.execute_script(JS)#JSを実行して画像情報を取得します
        im_base64 = im_info.split( ' 、 ')[1] base64でエンコードされた画像情報を取得しますim_bytes = base64.b64decode(im_base64)#open 
        (' E:/learning'/login.png '、' wbを使用して
        time.sleep(2)入力します。')as f:
            保存するQRコードを生成しますf.write(im_bytes)
            f.close(
        QRコード画像を開きます。QRコードを手動でスキャンしてログインする必要があります
        t = threading.Thread(target = self。 open、args =( 'E:/学' /login.png '、))
        t.start()
        print( "ログイン...コードをスイープしてください!\ n") 
        #ログイン後にCookieを取得します(ユーザー名のみが表示されますが、アカウントとパスワードは表示されません)
        while(True):
            c = self.driver.get_cookies() 
            if len(c)> 20:に正常にログインする
                cookies = {} 
                以下に非表示になっているのは、Cookieの名前と値のみが予約されており、リクエストにのみ使用できるためです。add_cookiesはWebドライバーには使用できません。それ以外の場合は、エラーInvalidCookieDomainException 
                #for i in range(len(c)):
                    #cookies [c [i] ['name']] = c [i] ['value'] 
                self.driver.close()
                print( "ログインに成功しました!\ n ")
                #return Cookies 
            return c 
            time.sleep(10)

上記のコードを実行すると、淘宝網のログインが完了し、淘宝網のページにジャンプします

私の淘宝網から淘宝網のホームページにジャンプします。

def my_split(self、s、seps):
        "" "分割削除複数文字" "" 
        res = [s] 
        for sep in seps:
            t = [] 
            list(map(lambda ss:t.extend(ss.split(sep ))、res))
            res = t 
        return res 
    
    def is_Chinese(self、word):
        "" "中国語かどうかの判断" "" 
        for ch in word:
            if '\ u4e00' <= ch <= '\ u9fff':
                return True 
        return False 
        
    def get_Cates(self):
        "" "ログイン後、デフォルトで私のページにジャンプします。このコードのユーザーはTaobaoホームページにジャンプし、すべてのTaobao製品カテゴリを取得します" "" 
        #上記の手順は次のとおりです。 Taobaoログインを達成し、私のページに移動し、Taobaoホームページをクリックして、ホームページ
        time.sleep(10)にジャンプします。sleep(10)#
        ソースコードを表示して、「Taobao.comホームページ」のボタンに対応する属性を特定し、クリックしてクリックします
        self.driver.find_element_by_xpath( '// * [@ class = "site-nav-menu site-nav-home"]')。click()#ホームページに
        ジャンプした後、最初にの左側の列にあるすべてのカテゴリを取得しますTaobaoページ
        
        #detectTo Taobaoは動的JSであり、リクエストライブラリを使用してWebページ情報を取得すると、Webページでチェックされるデータと矛盾するため、セレンパッケージを使用する必要があります。
        静的および動的Webページ識別する方法:https://www.jianshu.com/p/236fc043db0b#
        ターゲットコンテンツ(つまりカテゴリ列)を配置するソースコードに対応する属性を表示するclass driver_data = self.driver.find_element_by_xpath( '/ / * [@ class = "screen-outer clearfix"] ')
        html_doc = self.driver.page_source 
        #driver.quit()#
        beautifulSoupを使用してWebページのソースコードを解析する
        soup = BeautifulSoup(html_doc、 "lxml")#
        すべて検索Taobaoホームページのテーマ、対応するクラスは、クラス
        cate_list = [] 
        soup_data_list = soup.find( "div"、attrs = {'の範囲を確認することで判別できます。
        ソースコードのテキスト情報、つまりTaobaoのすべてのアイテムのテーマを
        取得します。カスタム分割関数list_tuple = list(( "\ n"、 "\\"、)を使用して、不正な文字を削除した後、漢字を取得します。 "\ ue62e"、 "/"、 "\ t"、 ""、 ""、 ""))
        cate_list = self.my_split(soup_data_list.text、list_tuple)#
        カスタムis_Chinese関数を使用して、中国語のテキストのみを保持します
        keep_select = [ ] 
        #cate_list_final = [] 
        for i in cate_list:
            keep_select = self.is_Chinese(i)
            if keep_select:
                self.cate_list_final.append(i)
        time.sleep(10)
        return self.cate_list_final

上記のコードの実行が完了し、淘宝網ページのすべてのカテゴリ名を取得しました

検索ボックスに検索するカテゴリを入力し、[検索]をクリックして、[販売注文]ボタンをクリックして、分析用のページコンテンツを取得します。

def search_Taobao(self、cate):
        print( "検索対象のカテゴリは:%s"%cate)#Taobao
        
        ホームページをクリックして、ホームページにあるか、各カテゴリの検索対象のホームページにあるかを問わず、ホームページにジャンプします。クリックする必要がありますタオバオのホームページに戻るクラスは変更されていないので、ここにホームページをクリックするためのコードを入力してください " 
        time.sleep(10)#
        
        ホームページの検索バーに検索したいコンテンツを入力し、 [検索]をクリックします
        。1つの入力ボックス、2つの入力、2つの入力が重複している場合は、最初に値プロンプトの入力をクリックし、次に実際に入力する必要のある入力を表示してから、この入力に値を入力します。最初に
        検索ボックス ' 
        // * [@ class = "search-combobox -input-wrap"]'をクリックして、インタラクティブなself.driver.find_element_by_xpath( '// * [@ class = "search-combobox-input- wrap "] ')。click()#
        入力検索をもう一度検索ボックスクラス名、検索するコンテンツを入力し、対応するクラスを検索して、検索をクリックします
        driver_input_data = self.driver.find_element_by_xpath(' // * [@ class = "search-combobox-input"] ') 
        #検索する必要のあるカテゴリに入力します。Cookieを使用してログインする必要がある理由がわかりません。
        #driver_input_data.send_keys( '婦人服')
        driver_input_data.send_keys(cate)
        3秒間一時停止します。それ以外の場合、速度はクローラー時間として認識されます。sleep(8)#
        ページの[検索]ボタンを検索して
        みてください:
            submit = self.driver.find_element_by_xpath( '// * [@ class = "search-button"] ')
            submit.click()
        を除く:
            pass 
            
        time.sleep(5)
        
    def get_Catinfo(self、cate):
        #self.login_first()
        time.sleep(20)
        self.search_Taobao (cate)#
        ログイン後、検索カテゴリに対応するページに入り、最初のページの商品情報を販売
        時間の降順で取得しました。sleep(50)#販売順に
        
        並べ替えた要素を検索し、クリックして取得降順の製品情報
        submit_order = self.driver.find_element_by_xpath( '// * [@ class = "J_Ajax link"]')
        submit_order.click()
        time.sleep(5 
        ページ全体のソースコードを
        取得html_doc = self.driver.page_source#
        
        ページのソースコードを介して各製品の必要な情報を取得
        soup = BeautifulSoup(html_doc、 "lxml")
        shop_data_list = soup.find( 'div'、class_ = "grid g-clearfix")。find_all_next( 'div'、class_ = "items")
        for shop_data in shop_data_list:#異なる
            情報は、次の2つの異なるクラス
            shop_data_a = shop_dataで配布されます。 find_all( "div"、class_ = "ctx-box J_MouseEneterLeave J_IconMoreNew")
            shop_data_b = shop_data.find_all( "div"、class_ = "pic-box J_MouseEneterLeave J_PicBox")
            for goods_contents_b in shop_data_b:
                #別の列はクロールする製品カテゴリです
                self.shop_cate_list.append(cate)) 
                #goods_price_list.append(goods_price) 
                #0。製品名を
                取得goods_name = goods_contents_b.find( "div"、class_ = "pic ")。find_all(" img "、class_ =" J_ItemPic img ")[0] [" alt "]
                self.goods_name_list.append(goods_name)
                #0。
                获取物価格片goods_pic = goods_contents_b.find( "div"、class_ = "pic")。find_all( "img"、class_ = "J_ItemPic img")[0] ["src "] 
                shop_data_aのgoods_contents_aのself.goods_pic_list.append(goods_pic)
                    
                #2。获取商品
                价格trace- pricegoods_price = goods_contents_a.find_all(" a "、class_ =" J_ClickStat ")[0] [" trace-price "] 
                self.goods_price_list.append(goods_price)
                #goods_price = goods_contents_a.find( "div"、class_ = "price g_price g_price-highlight")
                #1。商品の売り上げを取得
                goods_salenum = goods_contents_a.find( "div"、class_ = "deal-cnt")
                self.goods_salenum_list.append(goods_salenum)
                #2。
                获取商品idgoods_id = goods_contents_a.find_all( "a"、class_ = "J_ClickStat")[0] ["data-nid"] 
                self.goods_id_list.append(goods_id)
                #2 。
                获取商品链接goods_href = goods_contents_a.find_all( "a"、class_ = "J_ClickStat")[0] ["href"] 
                self.goods_href_list.append(goods_href)
                #2。获取店
                铺名goods_store = goods_contents_a.find( "a "、class_ =" shopname J_MouseEneterLeave J_ShopInfo ")。contents[3]  
                #goods_store = goods_contents.find_all( "span"、class_ = "dsrs")
                self.goods_store_list.append(goods_store)
                #4。获取店铺地址
                goods_address = goods_contents_a.find( "div"、class_ = "location")。contents 
                self.goods_address_list.append(goods_address)
                
                #取取結果整理成データフレーム形式
        j in range(min(
               len(self.goods_name_list)、len( self.goods_id_list)、len(self.goods_price_list)
               、len(self.goods_salenum_list)、len(self.goods_pic_list)、len(self.goods_href_list)
               、len(self.goods_store_list)、len(self.goods_address_list)
           ):
            self .data.append([self.shop_cate_list [j]、self.goods_name_list [j]、self.goods_id_list [j]、self.goods_price_list [j]
                         、self.goods_salenum_list [j]、self.goods_pic_list [j]、self.goods_href_list [j] 
                         、self.goods_store_list [j]、self.goods_address_list [j] 
                         ])
        #out_df = pd.DataFrame(self.data、columns = ['goods_name' 
        #、 'goods_id' 
        #、 'goods_price' 
        #、 'goods_salenum' 
        #、 'goods_pic' 
        #、 'goods_href' 
        #、 'goods_store' 
        #、 'goods_address']) 
        
        #self.Back_Homepage()
        スリープしない場合、ページが読み込まれる前にクリックが発生し、クリックエラーが発生する可能性がありますtime.sleep(20)
        self.driver.find_element_by_xpath( '// * [@ class = "site-nav- menu site-nav-home "] ')
        。click ()   return self.data

上記のコードを実行すると、各カテゴリの最初のページで、売上高の降順で並べ替えられた製品情報の検索が完了します。

3. Webコンテンツのタグと属性を見つける方法は?

上記はセレンクローラータオバオカテゴリーTOP売上データを使用したソースコードですが、クロールデータの最終的な内容は、Webページで取得する必要のあるコンテンツのタグや属性を見つける方法です。 Tencent Videoのクローラービデオは次のとおりです。1。Webページを右クリックし、レビュー要素(またはチェック)をクリックし、ページの右上隅をクリックして、チェック情報の左上隅にある矢印をクリックします。 ([要素]の左側に、ページ内の要素を選択して検査するように表示されます)次に、Webページ上の任意の場所をクリックして、対応する属性を見つけます。

 

 

あとがき

この記事では、淘宝網の各カテゴリの売上を実際の事例としてクローラーの演習として取り上げますが、クロールプロセスでは、HTMLの構造、Webドライバーでの要素の配置方法、美しいスープ要素の配置の完全な概念はありません。 、および正規表現の使用。フォローアップコンテンツのこの部分は次のように分類されます。

最近、多くの友人がプライベートメッセージを通じてPythonの学習問題について相談しました。コミュニケーションを促進するには、青をクリックしてディスカッションに参加し、自分でリソースベースに回答してください

 

おすすめ

転載: blog.csdn.net/weixin_43881394/article/details/112228530