共通の処理のPythonの2種類のウェブサイトの画像をクロール

  • サイトのデータ・インタフェース、アドレスを分析し、取得の画像をダウンロード

# - * -コーディング:UTF-8 - * -
インポートのOS
インポート再
インポートsysの
インポートSSL
輸入xlwtの
インポート時の
インポート_threadの
インポート要求が
インポートpymysql
輸入スレッド

#の自定义线程
クラスmyThread(threading.Thread):
    デフ__init __(自己、スレッドID、名前、カウンター):
        threading.Thread .__のinit __(自己)
        self.threadID =スレッドID
        self.name =名前
        self.counter =カウンタ
    デフ実行します(自己):
        印刷( "开始线程:" + self.name)
        threadLock.acquire()
        getDataFromDB(self.counter)
        threadLock.release()
        印刷( "退出线程:" + self.name)


#証明書検証キャンセル
)(コンテキスト= ssl._create_unverified_contextを

#请求头定义
ヘッダー= {
        '接続': 'キープアライブ'、
        '言語を受け入れ': 'ZH ZH-CN、; Q = 0.9'、
        '承諾': 'text / htmlの、アプリケーション/ XHTML + XML、アプリケーション/ xmlの; \
        Q = 0.9、画像/ WEBP、画像/ APNG、* / *; Q = 0.8' 、
        'ユーザーエージェント': 'のMozilla / 5.0(Windows NTの10.0; WOW64)のAppleWebKit / 537.36 \
        (KHTML、ヤモリ)クローム/ 63.0.3239.132サファリ/ 537.36' 、など
    }

#ファイルの格納パス
filePathに= 'F:/爬虫類/音楽/プレーヤー/ティン/'
#imgpath filePathに= + 'IMG /'

#オープンデータベースコネクティビティ
DB = pymysql.connect(
    ホスト= '127.0.0.1'、
    = 3306ポート、
    ユーザー= 'ルート'、
    passwdファイル= 'Lutong'、
    DB = 'テスト'、
    文字セット= 'UTF8'

#を使用カーソル操作するカーソルを取得する()メソッド 
カーソル= db.cursorを()

#制限の検索レコード番号は
= 250制限します

#SQL查询语句
SQL = "名前を選択し、コードt_playerからステータス= '使用'限界{}オフセット"

#現在の現地時間
T = time.time()
音楽クエリーアドレスの何千
tingSearchUrl =「http://tingapi.ting.baidu.com/v1/restserver/ting?from=web&version=5.6.5.0&method=baidu。 ting.search.catalogSug&フォーマット= JSON&クエリ= {} '


データベースからデータを読み取るために#
DEF getDataFromDB(I):
    株式会社フリーはSQLに参加
    してみてください。
        #SQL文の実行
        SQL1 = sql.format(制限)+ STR(リミット* I)
        を印刷(SQL1)        
        cursor.execute(SQL1)
        #は、すべてのレコードのリストを取得
        = cursor.fetchall結果()
        内の行の結果を得るために
            名前=行[0]
            コード=行[1]
            #印刷結果
            GETIMG(名、コード)
    を除く:
        ( '!異常な画像を得る')印刷

#ゲットピクチャー、ウェブからの分析
DEF GETIMG(名、コード):
    株式会社無料tingSearchUrlの参加
    URLを= tingSearchUrl.format(名)
    RSP = requests.get(URL = urlには、ヘッダ=ヘッダ)
    jsonData = rsp.json()
    
    (jsonData IF [ 'ERROR_CODE'] == 22000):
        試してみる:
            用imgUrl jsonData = [ 'アーティスト'] [0] [ 'artistpic']
            imgUrl =用imgUrlのための[0:imgUrl.index( '@')]
            印刷( "歌手"「+ +名「「画像アドレス:」+ imgUrl用)
            imgNameコード+ = 『の.jpg』
            downloadPicは(imgUrl、imgName)のために
        除い:
            #取得した画像が記録されていない歌手、データベースに挿入される
            プリント(「歌手」」+名+ ' 「絵「を見つけ出す)!
            試してみてください。
                。SQL2 =( "ヌル(t_player_no_img値にINSERT '{}'、 '" + +コード"')")形式(名).format(コード)
                cursor.execute(SQL2)
                db.commit()
            を除く:
                DB .rollback()
    他:
        #歌手は、レコードがデータベースに挿入されていません取得し
        た印刷(「!情報「「+名+」」を歌手を見つける」)
        :試し
            SQL2 =は、( " '、ヌル(t_player_no_img値に挿入します} { '' "+ +コード"「)「)形式(名).format(コード)。
            cursor.execute(SQL2)
            db.commit()
        を除く:
            db.rollback()
    
単一の画像のダウンロード方法
downloadPic DEF (imgUrl、imgName):
    試す:
        R = requests.get(imgUrl)
        :Fとしてオープン(filePathに+ imgName、 'WB')と
            f.write(r.content)
    requests.exceptions.ConnectionError除い:
        プリント( '图片请求错误!')
        戻り
    f.close()

    
#取得した画像フォーマット
DEF getPicFormat(URL):
    url.find( 'GIF')> = 0の場合:
        '.GIF'リターン
    のelif url.find> = 0( 'PNG。 '):
        リターンは' .pngの'
    elifのURL .find( 'JEPG。')> = 0:
        リターン'.jepg'
    他:
        リターンは.jpg

#ディレクトリ開発作成
:DEFのMKDIR(パス)
    パス= path.strip()
    パス= path.rstrip( '\\')
    ISEXIST = os.path.exists(パス)
    
    :IFないISEXIST
        os.makdirs(パスを)
    他:
        印刷(「ディレクトリが既に存在する、作成するために繰り返される必要がありません!」)


#Mainメソッド                
IF __name__ == '__main__':
    #はディレクトリを作成し
    ます。mkdir(filePathにします)

    #スレッドロック
    threading.LockのThreadLock =()
    #スレッドアレイ
    スレッド= []
    #のマルチスレッドの
    範囲におけるIための(20を):
        スレッドmyThread =(I、 "スレッド" + STR(I)、I)
        threads.append(スレッド)
    スレッド内TH用:
        th.start()
    THのためのスレッドで:
        th.join()
    
    #は、データベース接続のクローズ
    )(db.closeを
    

  • 分析ページタグ、通常の試合、アドレスおよび抽出画像のダウンロードに必要な画像のプロパティ

# - * -コーディング:UTF-8 - * -
インポートのOS
インポート再
インポートsysの
インポートSSL
輸入xlwtの
インポート時の
インポート_threadの
インポート要求が
インポートpymysql
輸入スレッド

#の自定义线程
クラスmyThread(threading.Thread):
    デフ__init __(自己、スレッドID、名前、カウンター):
        threading.Thread .__のinit __(自己)
        self.threadID =スレッドID
        self.name =名前
        self.counter =カウンタ
    デフ実行します(自己):
        印刷( "开始线程:" + self.name)
        threadLock.acquire()
        getDataFromDB(self.counter)
        threadLock.release()
        印刷( "退出线程:" + self.name)


#証明書検証キャンセル
)(コンテキスト= ssl._create_unverified_contextを

#请求头定义
ヘッダー= {
        '接続': 'キープアライブ'、
        '言語を受け入れ': 'ZH ZH-CN、; Q = 0.9'、
        '承諾': 'text / htmlの、アプリケーション/ XHTML + XML、アプリケーション/ xmlの; \
        Q = 0.9、画像/ WEBP、画像/ APNG、* / *; Q = 0.8' 、
        'ユーザーエージェント': 'のMozilla / 5.0(Windows NTの10.0; WOW64)のAppleWebKit / 537.36 \
        (KHTML、ヤモリ)クローム/ 63.0.3239.132サファリ/ 537.36' 、など
    }

#ファイルの格納パス
filePathに= 'F:/爬虫類/音楽/プレーヤー/ xiami /'
#imgpath filePathに= + 'IMG /'

#オープンデータベースコネクティビティ
DB = pymysql.connect(
    ホスト= '127.0.0.1'、
    = 3306ポート、
    ユーザー= 'ルート'、
    passwdファイル= 'Lutong'、
    DB = 'テスト'、
    文字セット= 'UTF8'

#を使用カーソル操作するカーソルを取得する()メソッド 
カーソル= db.cursorを()

#制限の検索レコード番号は
= 250制限します

#SQL查询语句
SQL = "名前を選択し、コードt_playerからステータス= '使用'限界{}オフセット"

#ローカル現在の時間
Tは、time.time()=
#エビアドレスクエリを
xiamiSearchUrl = 'https://emumo.xiami.com/ajax/search-index?_={}&key='


データベースからデータを読み取るために#
DEF getDataFromDB(I):
    株式会社フリーはSQLに参加
    してみてください。
        #SQL文の実行
        SQL1 = sql.format(制限)+ STR(リミット* I)
        を印刷(SQL1)        
        cursor.execute(SQL1)
        #は、すべてのレコードのリストを取得
        = cursor.fetchall結果()
        内の行の結果を得るために
            名前=行[0]
            コード=行[1]
            #印刷結果
            GETIMG(名、コード)
    を除く:
        ( '!異常な画像を得る')印刷

#ゲットピクチャー、ウェブからの分析
DEF GETIMG(名、コード):
    株式会社無料xiamiSearchUrlの参加
    URLを=名前+ xiamiSearchUrl
    RSP = requests.get(URL = urlには、ヘッダ=ヘッダ)
    HTML = rsp.text
    
    P-r'src = =「( //pic.xiami.net/images/artistlogo/+[^"]+\.jpg)@1e_1c_100Q_55w_55h " '
    imgUrlList re.findall =(re.compile(P)、HTML)
    
    lenのIF(imgUrlList)<= 0:
        プリント(「歌手「」+名+「」画像が見つかりません!」)
        レコードは歌手のイメージを取得していない、データベースに挿入され
        てみてください。
            SQL2は=(「『{}』、ヌル(t_player_no_img値への挿入を、「」 。+ +コード"「)")形式(名).format(コード)
            cursor.execute(SQL2)
            db.commit()
        を除きます:
            db.rollback()
    他:
        #は、ダウンロード画像を取得し、
        imgUrl =のための'HTTPS:' + imgUrlList [0]
        印刷( 'シンガー"' +名+ '"画像アドレス:' + imgUrl用)
        imgNameコード+ = 'の.jpg "
        downloadPic(imgUrl用、imgName)
    
単一の画像のダウンロード方法
()imgUrl、imgNameためDEF downloadPic:
    トライ:
        R&LT requests.get =(imgUrl用)
        Fオープン(filePathに+ imgName、 'WB')を有する:
            f.write(r.content)
    を除きますrequests.exceptions.ConnectionError:
        印刷( '絵のリクエストエラー!')
        戻り
    f.close()

    
#取得した画像フォーマット
DEF getPicFormat(URL):
    url.find( 'GIF')> = 0の場合:
        '.GIF'リターン
    のelif url.find> = 0( 'PNG。 '):
        リターンは' .pngの'
    elifのURL .find( 'JEPG。')> = 0:
        リターン'.jepg'
    他:
        リターンは.jpg

#ディレクトリ開発作成
:DEFのMKDIR(パス)
    パス= path.strip()
    パス= path.rstrip( '\\')
    ISEXIST = os.path.exists(パス)
    
    :IFないISEXIST
        os.makdirs(パスを)
    他:
        印刷(「ディレクトリが既に存在する、作成するために繰り返される必要がありません!」)


#Mainメソッド                
IF __name__ == '__main__':
    #ディレクトリを作成
    MKDIRを(filePathに)
    
    スタンプ#エビ問い合わせアドレス
    xiamiSearchUrl = xiamiSearchUrl.format(INT(T) )

    #スレッドロック
    threading.LockのThreadLock =()
    #スレッドアレイ
    スレッド= []
    #のマルチスレッドの
    範囲におけるIための(20を):
        スレッドmyThread =(I、 "スレッド" + STR(I)、I)
        threads.append(スレッド)
    スレッド内TH用:
        th.start()
    THのためのスレッドで:
        th.join()
    
    #は、データベース接続のクローズ
    )(db.closeを

おすすめ

転載: blog.csdn.net/lierwang2017/article/details/94718698