ホームページ  >  記事  >  バックエンド開発  >  Python クロール記事のサンプル チュートリアル

Python クロール記事のサンプル チュートリアル

巴扎黑
巴扎黑オリジナル
2017-08-07 17:37:451846ブラウズ

この記事では、主に Python を使用して散文 Web サイトの記事をクロールするための関連情報を紹介します。記事内の紹介は非常に詳細であり、必要な友人は以下を参照してください。

この記事では、主に Python クローリング散文ネットワーク記事に関する関連コンテンツを紹介します。参考と学習のために共有されています。詳細な紹介を見てみましょう:

レンダリングは次のとおりです。

Configure python 2.7

 bs4

 requests

インストール Use pip to install sudo pip install bs4


sudo pip install requests
sudo pip install bs4


<html>
<head>
</head>
<body>
<p id="one"><a></a></p>
<p id="two"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >abc</a></p>
<p id="three"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >three a</a></p>
<p id="four"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >four<p>four p</p><p>four p</p><p>four p</p> a</a></p>
</body>
</html>

简要说明一下bs4的使用因为是爬取网页 所以就介绍find 跟find_all

find跟find_all的不同在于返回的东西不同 find返回的是匹配到的第一个标签及标签里的内容

find_all返回的是一个列表

比如我们写一个test.html 用来测试find跟find_all的区别。

内容是:


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;p&#39;)
 print s.find_all(&#39;p&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id=&#39;one&#39;)
 print s.find_all(&#39;p&#39;,id=&#39;one&#39;)
 print "------------------------------"
 print s.find(&#39;p&#39;,id="two")
 print s.find_all(&#39;p&#39;,id="two")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="three")
 print s.find_all(&#39;p&#39;,id="three")
 print "------------------------------"
 print s.find(&#39;p&#39;,id="four")
 print s.find_all(&#39;p&#39;,id="four")
 print "------------------------------"

然后test.py的代码为:


def get_html():
 url = "https://www.sanwen.net/"
 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

运行以后我们可以看到结果当获取指定标签时候两者区别不大当获取一组标签的时候两者的区别就会显示出来


所以我们在使用时候要注意到底要的是什么,否则会出现报错

接下来就是通过requests 获取网页信息了,我不太懂别人为什么要写heard跟其他的东西

我直接进行网页访问,通过get方式获取散文网几个分类的二级网页然后通过一个组的测试,把所有的网页爬取一遍


def soup(html_text):
 s = BeautifulSoup(html_text,&#39;lxml&#39;)
 link = s.find(&#39;p&#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))

这部分的代码中我没有对res.status_code bs4の使い方を簡単に説明します。 find_all

find と find_all の違いは、返されるものが異なることです


find_all はリストを返します

たとえば、次のように書きます。テスト用の test.html find と find_all の違い。

内容は次のとおりです:


def get_content(url):
 res = requests.get(&#39;https://www.sanwen.net&#39;+url)
 if res.status_code==200:
 soup = BeautifulSoup(res.text,&#39;lxml&#39;)
 contents = soup.find(&#39;p&#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

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


 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()

実行後、指定されたタグを取得すると、結果が表示されます。タグのセットを取得すると、その 2 つの違いが表示されます


したがって、これを使用するときは、必要なことに注意する必要があります。そうでないと、エラーが発生します


次のステップは、リクエストを通じて Web ページの情報を取得することです。他の人が聞いたことやその他のことを書いている理由をよく理解しています

私は直接続行します Web ページにアクセスするには、get メソッドを通じて Prose Network の分類されたセカンダリ Web ページをいくつか取得し、すべての Web ページをクロールするためのグループ テストに合格します


 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()

コードのこの部分では、res.status_code を修正していません。200 でない場合、エラーが表示されず、クロールされたコンテンツが失われるという問題が発生します。次に Sanwen.net/rizhi/&p=1 の Web ページを分析しました

🎜🎜 p の最大値は 10 です。前回ディスクをクロールしたときは 100 ページでした。それは後で。次に、get メソッドを使用して各ページのコンテンツを取得します。 🎜🎜🎜各ページのコンテンツを取得した後、著者とタイトルを分析します。コードは次のようになります🎜🎜🎜🎜rrreee🎜タイトルを取得するときに何かが間違っています、なぜ書くときにタイトルにスラッシュを追加しますか。散文ですか? 1 つだけではありません。あと 2 つあります。この問題は、後でファイルを作成したときにファイル名が間違っていたため、正規表現を書き直しました。 🎜🎜🎜最後のステップは、各ページの分析を通じて記事のアドレスを取得し、最初は Web ページのアドレスを変更して直接コンテンツを 1 つずつ取得することです。トラブルを省きます。 🎜🎜🎜🎜rrreee🎜最後にファイルを書いて保存すればOKです🎜🎜🎜🎜rrreee🎜散文ネットワークから散文を取得するための3つの関数ですが、問題はわかりません。一部の散文が失われているのはなぜですか。記事は約 400 件しか取得できません。これは Prose.com の記事とは大きく異なりますが、この問題について誰かが私を助けてくれることを願っています。もちろん、寮のネットワークが壊れているのと関係があると思います🎜🎜🎜🎜rreee🎜レンダリングのことを忘れるところでした🎜🎜🎜🎜🎜🎜タイムアウト現象が発生するかもしれません。 . 大学に行くと必ずそうなります、としか言えません。 🎜

以上がPython クロール記事のサンプル チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。