Pythonの小さなケースのベタサイトをクロール

分析的思考:

  熱によるオンライン視聴者のアンカーを表示するには:1は、我々はデータへのアクセスの明確な目的を登る必要があります

  図2は、ウェブサイトのソースコードを訪れ、我々は、ラベルの位置データを参照する必要があります

        

 

 

  3、にコードでHTTPリクエストを送信し、GET HTMLページ返された(多くのWebページは、我々は要求にユーザエージェントを追加する必要があり、抗爬虫類のメカニズムを持っていることに注意してください、クライアントのアクセスを装っ)

  HTMLに取得する4は、我々は(ブロックは、視聴者の名前と番号を固定する必要があること注意が抽出全体に配置されている、それは難しいの対応で、Webデザインは法律ではありません、その後場合は、抽出された)必要なものの抽出部分に正規表現を用いて分析しました

  5、単一のアンカー結果のデータは、辞書に格納され、アンカーに全てのデータがリストに保存されています

  6、クロールスペースやその他の不要な改行文字、精錬に必要なデータへのデータの場合。

  図7に示すように、降順にデータクロール(注:我々はデータが文字列でつかみ、そして単位は人や人であってもよいし、処理を見る人の数ので)

  8、ソートされたデータの出力トラバーサル。

ウェブサイトが実装テンプレートベタを使用することですので、ケースは他のカテゴリをリッピングするために、アンカーデータの王のグラブの栄光である、そして唯一のURLを変更する必要があります〜

 

コードの実装:

「」「
    クロール王の栄光分類アンカーベタのウェブサイトの視聴やアンカー名、およびプレス人気順位の
」「」
から urllibはインポート要求
 から IO インポートBytesIO
 インポートgzipの
 インポートを再


クラススパイダー():
    URL = " HTTPS:/ /www.douyu.com/g_wzry 

    #の中間体、非貪欲モードのルートノードを除くすべての文字に一致する正規表現に一致するルート文字列</ div>終了見つけることが最初 
    root_pattern = <DIVクラス= "DyListCover-INFO">([\ S \ S] *?)</ div>の' 

    ヘッダ = { ' User--エージェント''Mozilla / 5.0(Windows NTの10.0; Win64の、x64-)のAppleWebKit / 537.36(KHTML、ヤモリ等)クローム/ 71.0.3578.80サファリ/ 537.36 ' } 

    #の視聴マッチング文字列 
    number_pattern_str = ' <スパンクラス=「ホットIS- DyListCoverテンプレート"> </ span>を([\ S \ S] *?)' 
    削除アイコン部の前に、数文字列を表示する 
    number_pattern = ' <SVG> <XLinkの使用:のhref =" #hot_8a57f0bアイコン「> < /使用> </ SVG> ' 

    name_pattern_str = ' <H2クラス= "DyListCover-ユーザーは、テンプレートです"> </ H2>([\ S \ S] *?)' 
    NAME_PATTERN = ' <SVG> <XLinkのを使用します。HREF = "#アイコンuser_c95acf8"> </使用> </ SVG> " 

    から与えられたページのフェッチとデコード内容
    デフ __fetch_content (自己):
        httpリクエストを送信し、返されたHTMLコード得る 
        REQ = request.Request(Spider.urlを、ヘッダー= Spider.headers)
        HTMLなど = request.urlopen(REQ).read() 

        復号 
        BUFF = BytesIO (HTMLなど)
        F = gzip.GzipFile(もしfileobj = BUFF)
        HTMLなど =に達し、f.read()。デコード(UTF-8 を返すHTMLなど

    、分析キャプチャコンテンツを選択し、終了タグのラベルを選択しようと、標識基が選択されています対応する後
    DEF  __analysis (セルフ、HTMLなど)を:
         #は、すべてのデータが必要取得 
        root_html =re.findall(Spider.root_pattern、HTMLなど)
         同じブロック内の2つのページが最初のアンカーが記述する前記クラスクラスいるので
        秒のデータが必要とされるが、奇数番目の要素を選択するための標準である 
        root_info_html = root_htmlを[ 1 :: 2 ] 

        #は、最終的にデータのリストを取得 
        アンカー= []
        視聴者のユーザ名と番号を抽出、リストを横断する
        ための HTML root_info_htmlを:
             #は、アイコンを抽出する部分である 
            watch_num_str = re.findall(Spider.number_pattern_str、HTML )
             #の削除アイコン部 
            watch_num = re.sub(Spider.number_pattern、'' 、watch_num_str [0]) 

            アイコンの名前で抽出部 
            name_str =re.findall(Spider.name_pattern_str、HTML)
            名前 = re.sub(Spider.name_pattern、「」、name_str [0]) 

            次に、格納された辞書視聴者の名前と番号、各アンカーのために格納されたデータの最終的なリスト 
            アンカー= { ' 名前':名、' 番号' :watch_num} 
            anchors.append(アンカー)

        を返すアンカー

    精錬機能
    #のDEFの__refine(セルフ、アンカー): 
        ラムラムダ=アンカー:{ 'name'のアンカー[ '名前'] [0]、 '番号':アンカー[ '番号'] [0]} 
        リターンマップ(ラム、アンカー)

    ソート
    DEF  __sort (セルフ、アンカー):
        アンカー =(アンカー、キー=自己。ソート__sort_key、リバース= 真)を
         返すアンカー

    照合
    DEF  __sort_key (セルフ、アンカー):
         #1 エキスデジタルコンピューティングおよび 
        R&LT = re.findall(' \ D * '、アンカー[ ' ナンバー' ]) = フロート(R&LT [0])
         IF  ' ワン'  アンカー【' 番号' ]:
            番号 * 10000 =を
         返す番号

    #の表示データ
    DEF  __show (自己、アンカー):
        アンカーにアンカー用:
        #1     :プリント(アンカー[ '番号']アンカー[ '名前']、 '')
        のためのランクにおける範囲(0、lenの(アンカー)):
             プリント" ランク"、ランク+ 1、" "、アンカー[ランク] [ ' 名前' ]、"     "、アンカー[ランク] [ ' ' ]) 

    入口方法
    デフ行く(自己):
        HTMLS =自己。__fetch_content ()
        アンカー=自己。__analysis (HTMLS)
        アンカー =自己。__sort (アンカー)
        自己。__show (アンカー)


クモ = スパイダー()
spider.go()

 

  

おすすめ

転載: www.cnblogs.com/syq816/p/12637776.html