ホームページ > バックエンド開発 > Python チュートリアル > Python はどのようにして prose.com から記事をクロールしますか?

Python はどのようにして prose.com から記事をクロールしますか?

零下一度
リリース: 2017-07-03 09:39:31
オリジナル
1649 人が閲覧しました

image.png

Python 2.7を設定する

    bs4

    requests
ログイン後にコピー

pipを使用してインストールするsudo pip install bs4

sudo pip install request

Webページをクロールしているため、bs4の使用方法を簡単に説明します。 find を導入します。 find_all

find と find_all の違いは、返されるものが異なることです。 find は最初に一致したタグを返し、タグ内のコンテンツを返します

find_all はリストを返します

たとえば、次のような test.html を書きます。テスト find と find_all の違い。内容は次のとおりです:

<html>
<head>
</head>
<body>
<div id="one"><a></a></div>
<div id="two"><a href="#">abc</a></div>
<div id="three"><a href="#">three a</a><a href="#">three a</a><a href="#">three a</a></div>
<div id="four"><a href="#">four<p>four p</p><p>four p</p><p>four p</p> a</a></div>
</body>
</html>
ログイン後にコピー

 <br/>
ログイン後にコピー

そして、test.py のコードは次のようになります:

from bs4 import BeautifulSoup
import lxml

if __name__==&#39;__main__&#39;:
  s = BeautifulSoup(open(&#39;test.html&#39;),&#39;lxml&#39;)
  print s.prettify()
  print "------------------------------"
  print s.find(&#39;div&#39;)
  print s.find_all(&#39;div&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id=&#39;one&#39;)
  print s.find_all(&#39;div&#39;,id=&#39;one&#39;)
  print "------------------------------"
  print s.find(&#39;div&#39;,id="two")
  print s.find_all(&#39;div&#39;,id="two")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="three")
  print s.find_all(&#39;div&#39;,id="three")
  print "------------------------------"
  print s.find(&#39;div&#39;,id="four")
  print s.find_all(&#39;div&#39;,id="four")
  print "------------------------------"
ログイン後にコピー

 <br/>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

実行後、指定されたタグを取得すると、結果が確認できます。 2 つのタグのセットを取得するとき、


image.png

のときに 2 つの違いが表示されます。したがって、それを使用するときは、必要なものに注意する必要があります。そうしないと、エラーが表示されます。 <br/>次のステップは、リクエストを通じて Web ページの情報を取得することです。なぜ他の人が聞いたことや他のことについて書くのかよくわかりません
Web ページに直接アクセスし、get を通じて prose.com 上のいくつかのカテゴリのいくつかの二次 Web ページを取得しますメソッドを実行し、すべての Web ページをクロールするグループ テストに合格します

def get_html():
  url = ""
  two_html = [&#39;sanwen&#39;,&#39;shige&#39;,&#39;zawen&#39;,&#39;suibi&#39;,&#39;rizhi&#39;,&#39;novel&#39;]  for doc in two_html:
      i=1          if doc==&#39;sanwen&#39;:print "running sanwen -----------------------------"  if doc==&#39;shige&#39;:print "running shige ------------------------------"  if doc==&#39;zawen&#39;:print &#39;running zawen -------------------------------&#39;  if doc==&#39;suibi&#39;:print &#39;running suibi -------------------------------&#39;  if doc==&#39;rizhi&#39;:print &#39;running ruzhi -------------------------------&#39;  if doc==&#39;nove&#39;:print &#39;running xiaoxiaoshuo -------------------------&#39;  while(i<10):
        par = {&#39;p&#39;:i}
        res = requests.get(url+doc+&#39;/&#39;,params=par)if res.status_code==200:
          soup(res.text)
              i+=i
ログイン後にコピー

 <br/>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

コードのこの部分では、200 ではない res.status_code を処理しませんでした。その結果、エラーが発生しないという問題が発生します。と表示され、クロールされたコンテンツは失われます。そこで Sanwen.net の Web ページを分析したところ、www.sanwen.net/rizhi/&p=1 であることがわかりました
p の最大値は 10 です。最後にディスクをクロールしたときは、そうでした。 100ページは後で分析します。次に、get メソッドを使用して各ページのコンテンツを取得します。 <br/>各ページのコンテンツを取得した後、著者とタイトルを分析します。 コードは次のとおりです

def soup(html_text):
  s = BeautifulSoup(html_text,&#39;lxml&#39;)
  link = s.find(&#39;div&#39;,class_=&#39;categorylist&#39;).find_all(&#39;li&#39;)  for i in link:if i!=s.find(&#39;li&#39;,class_=&#39;page&#39;):
      title = i.find_all(&#39;a&#39;)[1]
      author = i.find_all(&#39;a&#39;)[2].text
      url = title.attrs[&#39;href&#39;]
      sign = re.compile(r&#39;(//)|/&#39;)
      match = sign.search(title.text)
      file_name = title.text      if match:
        file_name = sign.sub(&#39;a&#39;,str(title.text))
ログイン後にコピー

 <br/>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

タイトルを取得するときに何かが間違っています、なぜ書くときにタイトルにスラッシュを追加しますか。散文ですか? 1 つだけではありません。あと 2 つあります。この問題は、後でファイルを作成したときにファイル名が間違っていたため、正規表現を書き直しました。 <br/>最後のステップは、各ページの分析を通じて記事のアドレスを取得し、最初は Web ページのアドレスを変更してコンテンツを 1 つずつ取得することです。トラブル。

def get_content(url):
  res = requests.get(&#39;&#39;+url)  if res.status_code==200:
    soup = BeautifulSoup(res.text,&#39;lxml&#39;)
    contents = soup.find(&#39;div&#39;,class_=&#39;content&#39;).find_all(&#39;p&#39;)
    content = &#39;&#39;for i in contents:
      content+=i.text+&#39;\n&#39;return content
ログイン後にコピー

 <br/>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

最後にファイルを書いて保存すればOKです

   f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)      print &#39;running w txt&#39;+file_name+&#39;.txt&#39;  f.write(title.text+&#39;\n&#39;)
      f.write(author+&#39;\n&#39;)
      content=get_content(url)     
      f.write(content)
      f.close()
ログイン後にコピー

3つの関数は散文ネットワークから散文を取得しますが、問題はそれを取得していないことです。一部の散文が失われた理由はわかりません。400 を超える記事がありますが、ページごとに取得できることを願っています。この問題。もちろん、寮のネットワークが壊れているのと関係があると思います

     f = open(file_name+&#39;.txt&#39;,&#39;w&#39;)      print &#39;running w txt&#39;+file_name+&#39;.txt&#39;  f.write(title.text+&#39;\n&#39;)
      f.write(author+&#39;\n&#39;)
      content=get_content(url)     
      f.write(content)
      f.close()
ログイン後にコピー

レンダリングのことをほとんど忘れていました

コードは汚いですが、決して止まらなかった


以上がPython はどのようにして prose.com から記事をクロールしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート