Pythonの学習_ニュースネットワークテキスト爬虫類(V 1.0.2バージョン)

バージョンのアップデート:

  1.関数名、こぶの命名の一部を調整します。

  買収およびエラー統計の数を増やし、3。

  3.bug修理:

    • 最後のバグ修正が終了していません。
    • 唯一のpタグを収集したテキストのバグが修正されました。
    • ログ出力の削減
#!は/ usr / binに/ envをパイソン
# -  *  - コーディング:UTF-8  -  *  - 
「」」
__author__ = 'Wangyiフー'
__mtime__ = '2019年12月20日'
「」」
「」」
修正されたバージョン:
V 1.0:リンク情報とファイルを取得するために使用され、TXT文書に保存されています。
V 1.0.1:新しいロギングモジュール入力ログ情報、ヘッダを調整するために参照します。
V 1.0.2:独立した書き込みテキスト機能、収集された統計のリストを増やし、バグ修正、最後のページには、爬虫類の問題を終了しません。

「」」


#importを関連ライブラリ
インポート要求
BS4のインポートからBeautifulSoup
輸入SYS
輸入OS
インポート時
輸入ランダム
インポートのログ


#1:出力コンソールを設定しない、ファイルの書き込みを設定します
#LOG_FORMAT = "%(いるasctime)S  - %(levelname)S  - %(メッセージ)の"
#DATE_FORMAT = "%のM /%D /%Y%のH:%のM:%S%P"
#logging.basicConfig(ファイル名= '/ TEMP / CCTV_news.log'、レベル= logging.info、形式= LOG_FORMAT、datefmt = DATE_FORMAT)

方法#2:コンソールやファイルへのハンドラを同時に出力
ロガー= logging.getLogger()
logger.setLevel( 'WARNING')
BASIC_FORMAT = "%(いるasctime)S:%(levelname)S:%(メッセージ)の"
DATE_FORMAT = '%Y-%M-%D%H:%のM:%のS'
フォーマッタ= logging.Formatter(BASIC_FORMAT、DATE_FORMAT)
コンソールハンドラにchlr = logging.StreamHandler()#出力
chlr.setFormatter(フォーマッタ)
chlr.setLevel(「INFO」)#が提供されないことがあり、それは、デフォルトでは、ロガーレベルを設定されていません
fhlr = logging.FileHandler( './一時/ CCTV_news.log')#出力ファイルハンドラへ
fhlr.setFormatter(フォーマッタ)
logger.addHandler(chlr)
logger.addHandler(fhlr)

#複数のブラウザが検出を回避するために、頭に追加
headers_list = [
    "Mozillaの/ 5.0(Windows NTの6.3; WOW64)のAppleWebKit / 537.36(KHTML、ヤモリなど)クローム/ 39.0.2171.95サファリ/ 537.36"、
    "Mozillaの/ 5.0(Macintosh版、インテルのMac OS X 10_9_2)のAppleWebKit / 537.36(KHTML、ヤモリなど)クローム/ 35.0.1916.153サファリ/ 537.36"、
    "Mozillaの/ 5.0(Windows NTの6.1; WOW64; RV:30.0)のGecko / 20100101 Firefoxの/ 30.0"、
    "Mozillaの/ 5.0(Macintosh版、インテルのMac OS X 10_9_2)のAppleWebKit / 537.75.14(KHTML、ヤモリなど)のバージョン/ 7.0.3サファリ/ 537.75.14"、
    "Mozilla / 5.0(互換; MSIE 10.0;のWindows NT 6.2、Win64の、x64の、トライデント/ 6.0)"、
    'Mozillaの/ 5.0(Windowsの; U; Windows NTの5.1;それ; RV:1.8.1.11)のGecko / 20071127 Firefoxの/ 2.0.0.11'、
    オペラ/午前9時25分(のWindows NT 5.1; U; EN)」
    'Mozillaの/ 4.0(互換; MSIE 6.0; Windows NTの5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'、
    'のMozilla / 5.0(互換; Konquerorの/ 3.5; Linuxの)(ヤモリのような)KHTML / 3.5.5(Kubuntuの)'、
    'Mozillaの/ 5.0(X11; U; Linuxのi686の; EN-US; RV:1.8.0.12)のGecko / 20070731 Ubuntuの/ DapperのセキュリティのFirefox / 1.5.0.12'、
    'リンクス/ 2.8.5rel.1のlibwww-FM / 2.14 SSL-MM / 1.4.1 GNUTLS / 1.2.9'、
    "Mozilla / 5.0(X11; Linuxのi686の)のAppleWebKit / 535.7(ヤモリ様KHTML)のUbuntu / 11.04クロム/ 16.0.912.77クローム/ 16.0.912.77サファリ/ 535.7"、
    "Mozillaの/ 5.0(X11;のUbuntu、Linuxのi686の; RV:10.0)のGecko / 20100101 Firefoxの/ 10.0"、
    'Mozillaの/ 5.0(Windows NTの10.0; Win64の、x64の)のAppleWebKit / 537.36(ヤモリのようにKHTML、)クローム/ 54.0.2840.99サファリ/ 537.36'
]

グローバルヘッダ
ヘッダー= { 'のUser-Agent':random.choice(headers_list)}

デフgetRespose(URL):
    「」「応答テキストを取得するための要求」「」
    グローバルERR_List
    グローバルヘッダ
    試してみてください。
        R = requests.get(URL、ヘッダー=ヘッダ、タイムアウト= 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        リターンr.text
    eと例外を除きます。
        #print( 'リンクエラー:' + URL)
        logging.error( 'リンクエラー:%s' は、URL)
        ERR_List.add(URL)
        昇給電子


デフgetNowUrls(URL、モード= 1):
    グローバルERR_List
    「」「記事と記事名へのリンクのリストを解決するには、」「」
    URL_all_set =セット()
    URL_next_page_set =セット()
    スープ= BeautifulSoup(getRespose(URL)、 'html.parser')
    モード== 1の場合:
        試してみてください。
            ラインのsoup.body.find(クラス_ = 'xwlist')find_all(名= '')インチ:
                url_point = line.attrs [ 'のhref']
                #Logging.warning(:、url_point '%sの買収は、リストリンク')
                url_pointないURL_all_setであれば:
                    URL_all_set.add(url_point)
            リターンURL_all_set
        eと例外を除きます。
            昇給電子
            logging.error( 'リンクリストの取得に失敗しました:%s' は、URL)
            ERR_List.add(URL)
            リターン偽

    そうしないと:
        試してみてください。
            url_next = soup.body.find(クラス_ = 'ページになりました-ページ')。next_sibling.next_sibling.attrs [ 'のhref']
            url_next == URLの場合:
                URL_next_page_set.add( '終了')
                logging.warning( '最後のページにあります:%s' は、url_nextを)
                リターンURL_next_page_set
            そうしないと:
                url_nextないURL_next_page_setであれば:
                    URL_next_page_set.add(url_next)
                    リターンURL_next_page_set
                そうしないと:
                    logging.warning( 'リンクが既に存在している:%s' は、url_next)

        除きます:
            logging.error( '次のページのリンクが失敗しました:%s' は、URL)
            ERR_List.add(URL)
            リターン偽


デフpageParsing(URL):
    グローバルERR_List
    試してみてください。
        デモ= getRespose(URL)
        soup_text = BeautifulSoup(デモ、 'html.parser')
        textTitle = soup_text.head.title.string
        テキストコンテンツ= []
        soup_text.body.find(ATTRS = { 'クラス': 'TEXT_CONTENT'})の行のため。find_all(名前は= 'P'):
            textContent.append(line.string)
            コンテンツ取得に対応する複数のタグのため#P、ストリング
        logging.warning( 'ニュース正常に解決:%s' は、URL)
        lenの場合(textTitle)= 0またはのみ(のTextContent)= 0!!:
            リターンtextTitle、STR(のTextContent)
        そうしないと:
            logging.error( 'タイトルまたはテキストの解析に失敗しました:%s' は、URL)
    除きます:
        logging.error( 'ニュースページの解析に失敗しました:%s' は、URL)
        ERR_List.add(URL)
        リターン偽


デフtextWrite(url_title、url_text、FILE_PATH = R、FILE_NAME = R 'ニュースネットワークの.txtの' '\ TEMP。'):
    file_all = FILE_PATH + '\\' + file_nameに
    そうでない場合os.path.exists(FILE_PATH):#OSのデータベースパスが存在するかどうかを判断します
        os.mkdir(FILE_PATH)#存在しないパスを作成します。
    試してみてください。
        Fとしてオープン(file_all、r'a +」、コード= "UTF8")を有します。
            f.write(url_title + '\ n' は)
            書き込みはこちらf.write(url_text +「\ n」は)#理由は、STRに翻訳されるリストのためのテキスト形式、内url_textテキストを失敗します
            キャッシュを書き込むためのf.flush()#
            f.close()
            logging.warning( 'が正常に書かれたファイル:%s' は、url_title)
            trueを返します
    除きます:
        #Print(「テキストの書き込み失敗「)
        logging.error( 'ファイルの書き込みに失敗しました:%s' を、url_title)
        リターン偽


デフメイン(URL):
    グローバルAll_List
    URL_all = getNowUrls(URL、1)
    URL_next_page = getNowUrls(URL、2)
    #Logging.warning( 'コレクションリスト:%s' は、URL_all)
    #Logging.warning( '次へ:%s' は、URL_next_page)
    リストの中url_line用(URL_all):
        time.sleep(はrandom.Random())
        parseText = pageParsing(url_line)
        parseText場合:
            url_title = parseText [0]
            url_text = STR(parseText [1])
            印刷(url_title、url_text)
            #Logging.warning( '取得テキスト:%sの|%s' は、url_title、url_text)
            textWrite(url_title、url_text、FILE_PATH = R '\ TEMP'、FILE_NAME = R 'ニュースネットワークは、.txtでは')
        URL_all.remove(url_line)
        All_List.add(url_line)
    URL_next_pageで「終了」の場合:
        logging.error( '最後のページにあります:%s' は、url_line)
        logging.error( 'キャプチャ終わり、収集したページ:%sの、ページのエラー:%s' は、(All_List)でlen、lenは(ERR_List))
        sys.exit()
    そうしないと:
        もしLEN(URL_all)== 0とlen(URL_next_page)== 1:
            Next_url =リスト(URL_next_page)[0]
            URL_next_page.remove(Next_url)
            time.sleep(5)
            メイン(Next_url)


__name__ == '__main__' の場合:
    URL = r'http://www.xwlb.top/xwlb.html」
    All_List =セット()
    ERR_List =セット()
    #URL = r'http://www.xwlb.top/xwlb_709.html」
    logging.warning( "URLとして入力:%s" は、URL)
    手(URL)

  

  

おすすめ

転載: www.cnblogs.com/wyf-349/p/12102465.html