ホームページ  >  記事  >  バックエンド開発  >  ブログパークニュースのキャプチャを学ぶPython

ブログパークニュースのキャプチャを学ぶPython

PHP中文网
PHP中文网オリジナル
2017-06-20 15:23:221626ブラウズ

前言

  说到python,对它有点耳闻的人,第一反应可能都是爬虫~

  这两天看了点python的皮毛知识,忍不住想写一个简单的爬虫练练手,JUST DO IT

准备工作

  要制作数据抓取的爬虫,对请求的源页面结构需要有特定分析,只有分析正确了,才能更好更快的爬到我们想要的内容。

  浏览器访问570973/,右键“查看源代码”,初步只想取一些简单的数据(文章标题、作者、发布时间等),在HTML源码中找到相关数据的部分:

  1)标题(url):90f4f834e5b06d6096bb681240960ddba69c86dd6867f396eeb12803a320ba93SpaceX重复使用的飞船成功与国际空间站对接5db79b134e9f6b82c0b36e0489ee08ed16b28748ea4df4d9c2150843fecfba68

2) 著者: e30b4955b26c996260c21fe2781f7294ポスター

3) 公開時間: 26481bc0d1e3a64b3d556a664a12a9d8公開日 2017-06-06 14:53afac152b25f639091bb0d813e8d85b94

もちろん、手がかりをたどりたい場合、「前の記事」と「次の記事」のリンクの構造は非常に重要ですが、問題は、ページ内の 2 つの 3499910bf9dac5ae3c52d5ede7383485 タグ、そのリンクとテキスト コンテンツが js を通じてレンダリングされることです。情報(Python は js などを実行します)を探してみてください。ただし、Python 初心者にとっては少し先を行くかもしれないので、別の解決策を見つけるつもりです。

これら 2 つのリンクは js を介してレンダリングされますが、理論的には、js がコンテンツをレンダリングできる理由は、リクエストを開始して応答を取得することによって行われます。それでは、Web ページの読み込みプロセスを監視できるかどうかわかりますか?情報はありますか? chrome/firefox などのブラウザでは、すべてのリソースのリクエストとレスポンスのステータスを明確に確認できます。

彼らのリクエストアドレスは:

1) 前のニュース ID:

2) 次のニュース ID:

応答コンテンツは JSON です

ここで ContentID が必要なものです はい、あなたは知ることができますニュース リリースのページ アドレスは固定形式であるため、この値に基づく現在のニュースの前または次のニュース URL: {{ContentID}}/ (赤色のコンテンツは置換可能な ID )

ツール

1) python 3.6 (同時にpipをインストールし、環境変数を追加します)

2) PyCharm 2017.1.3

3) サードパーティPython ライブラリ (インストール: cmd -> pip インストール名)

a) pyperclip: クリップボードの読み取りと書き込みに使用されます

b) リクエスト: urllib に基づいており、Apache2 ライセンスのオープン ソース プロトコルを使用する HTTP ライブラリ。 urllib よりも便利で、多くの作業を節約できます

c) beautifulsoup4: Beautifulsoup は、ナビゲーション、検索、解析ツリーの変更、その他の機能を処理するための、いくつかのシンプルな Python スタイルの関数を提供します。これは、ドキュメントを解析してキャプチャする必要があるデータをユーザーに提供するツールボックスです

ソースコード

私は個人的に、コードは非常に基本的で理解しやすいと思います(結局のところ、初心者は高度なコードは書きません) )、ご質問やご提案がございましたら、お気軽にお知らせください

#! python3
# coding = utf-8
# get_cnblogs_news.py
# 根据博客园内的任意一篇新闻,获取所有新闻(标题、发布时间、发布人)
# 

# 这是标题格式 :<div id="news_title"><a href="//news.cnblogs.com/n/570973/">SpaceX重复使用的“龙”飞船成功与国际空间站对接</a></div>
# 这是发布人格式 :<span class="news_poster">投递人 <a href="//home.cnblogs.com/u/34358/">itwriter</a></span>
# 这是发布时间格式 :<span class="time">发布于 2017-06-06 14:53</span>

# 当前新闻ID :<input type="hidden" value="570981" id="lbContentID">

# html中获取不到上一篇和下一篇的直接链接,因为它是使用ajax请求后期渲染的
# 需要另外请求地址,获取结果,JSON
# 上一篇 
# 下一篇 

# 响应内容
# ContentID : 570971
# Title : "Mac支持外部GPU VR开发套件售599美元"
# Submitdate : "/Date(1425445514)"
# SubmitdateFormat : "2017-06-06 14:47"

import sys, pyperclip
import requests, bs4
import json

# 解析并打印(标题、作者、发布时间、当前ID)
# soup : 响应的HTML内容经过bs4转化的对象
def get_info(soup):
    dict_info = {&#39;curr_id&#39;: &#39;&#39;, &#39;author&#39;: &#39;&#39;, &#39;time&#39;: &#39;&#39;, &#39;title&#39;: &#39;&#39;, &#39;url&#39;: &#39;&#39;}

    titles = soup.select(&#39;div#news_title > a&#39;)
    if len(titles) > 0:
        dict_info[&#39;title&#39;] = titles[0].getText()
        dict_info[&#39;url&#39;] = titles[0].get(&#39;href&#39;)

    authors = soup.select(&#39;span.news_poster > a&#39;)
    if len(authors) > 0:
        dict_info[&#39;author&#39;] = authors[0].getText()

    times = soup.select(&#39;span.time&#39;)
    if len(times) > 0:
        dict_info[&#39;time&#39;] = times[0].getText()

    content_ids = soup.select(&#39;input#lbContentID&#39;)
    if len(content_ids) > 0:
        dict_info[&#39;curr_id&#39;] = content_ids[0].get(&#39;value&#39;)

    # 写文件
    with open(&#39;D:/cnblognews.csv&#39;, &#39;a&#39;) as f:
        text = &#39;%s,%s,%s,%s\n&#39; % (dict_info[&#39;curr_id&#39;], (dict_info[&#39;author&#39;] + dict_info[&#39;time&#39;]), dict_info[&#39;url&#39;], dict_info[&#39;title&#39;])
        print(text)
        f.write(text)
    return dict_info[&#39;curr_id&#39;]

# 获取前一篇文章信息
# curr_id : 新闻ID
# loop_count : 向上多少条,如果为0,则无限向上,直至结束
def get_prev_info(curr_id, loop_count = 0):
    private_loop_count = 0
    try:
        while loop_count == 0 or private_loop_count < loop_count:
            res_prev = requests.get(&#39;https://news.cnblogs.com/NewsAjax/GetPreNewsById?contentId=&#39; + curr_id)
            res_prev.raise_for_status()
            res_prev_dict = json.loads(res_prev.text)
            prev_id = res_prev_dict[&#39;ContentID&#39;]

            res_prev = requests.get(&#39;https://news.cnblogs.com/n/%s/&#39; % prev_id)
            res_prev.raise_for_status()
            soup_prev = bs4.BeautifulSoup(res_prev.text, &#39;html.parser&#39;)
            curr_id = get_info(soup_prev)

            private_loop_count += 1
    except:
        pass

# 获取下一篇文章信息
# curr_id : 新闻ID
# loop_count : 向下多少条,如果为0,则无限向下,直至结束
def get_next_info(curr_id, loop_count = 0):
    private_loop_count = 0
    try:
        while loop_count == 0 or private_loop_count < loop_count:
            res_next = requests.get(&#39;https://news.cnblogs.com/NewsAjax/GetNextNewsById?contentId=&#39; + curr_id)
            res_next.raise_for_status()
            res_next_dict = json.loads(res_next.text)
            next_id = res_next_dict[&#39;ContentID&#39;]

            res_next = requests.get(&#39;https://news.cnblogs.com/n/%s/&#39; % next_id)
            res_next.raise_for_status()
            soup_next = bs4.BeautifulSoup(res_next.text, &#39;html.parser&#39;)
            curr_id = get_info(soup_next)

            private_loop_count += 1
    except:
        pass


# 参数从优先从命令行获取,如果无,则从剪切板获取
# url是博客园新闻版块下,任何一篇新闻
if len(sys.argv) > 1:
    url = sys.argv[1]
else:
    url = pyperclip.paste()

# 没有获取到有地址,则抛出异常
if not url:
    raise ValueError

# 开始从源地址中获取新闻内容
res = requests.get(url)
res.raise_for_status()
if not res.text:
    raise ValueError

#解析Html
soup = bs4.BeautifulSoup(res.text, &#39;html.parser&#39;)
curr_id = get_info(soup)
print(&#39;backward...&#39;)
get_prev_info(curr_id)
print(&#39;forward...&#39;)
get_next_info(curr_id)
print(&#39;done&#39;)

実行

上記のソース コードを D:/get_cnblogs_news.py に保存し、Windows プラットフォームでコマンド ライン ツール cmd を開きます:

コマンド py.exe D:/get_cnblogs_news を入力します。 py Enter

分析: py.exe について説明する必要はありません。2 番目のパラメータは Python スクリプト ファイルで、3 番目のパラメータはクロールする必要があるソース ページです (コピーする場合、コードには別の考慮事項があります)。この URL をシステムのクリップボードに保存します。 py.exe D:/get_cnblogs_news.py を直接実行できます。

コマンド ライン出力インターフェイス (印刷)

CSV ファイルに保存される内容

for novices python learning book box または情報:

1) Liao Xuefeng の Python チュートリアル、非常に基本的で理解しやすい:

2) 退屈な作業を自動化するための Python プログラミングですぐに始めましょう.pdf

この記事はあくまで独学でPythonを学ぶための日記です、誤解を招く点があれば批判して修正してください(気に入らない場合は批判しないでください)。

以上がブログパークニュースのキャプチャを学ぶPythonの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。