バージョンのアップデート:
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)