ホームページ >バックエンド開発 >Python チュートリアル >Python はどのようにして prose.com から記事をクロールしますか?
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__=='__main__': s = BeautifulSoup(open('test.html'),'lxml') print s.prettify() print "------------------------------" print s.find('div') print s.find_all('div') print "------------------------------" print s.find('div',id='one') print s.find_all('div',id='one') print "------------------------------" print s.find('div',id="two") print s.find_all('div',id="two") print "------------------------------" print s.find('div',id="three") print s.find_all('div',id="three") print "------------------------------" print s.find('div',id="four") print s.find_all('div',id="four") print "------------------------------"
<br/>
実行後、指定されたタグを取得すると、結果が確認できます。 2 つのタグのセットを取得するとき、
のときに 2 つの違いが表示されます。したがって、それを使用するときは、必要なものに注意する必要があります。そうしないと、エラーが表示されます。
次のステップは、リクエストを通じて Web ページの情報を取得することです。なぜ他の人が聞いたことや他のことについて書くのかよくわかりません
Web ページに直接アクセスし、get を通じて prose.com 上のいくつかのカテゴリのいくつかの二次 Web ページを取得しますメソッドを実行し、すべての Web ページをクロールするグループ テストに合格します
def get_html(): url = "" two_html = ['sanwen','shige','zawen','suibi','rizhi','novel'] for doc in two_html: i=1 if doc=='sanwen':print "running sanwen -----------------------------" if doc=='shige':print "running shige ------------------------------" if doc=='zawen':print 'running zawen -------------------------------' if doc=='suibi':print 'running suibi -------------------------------' if doc=='rizhi':print 'running ruzhi -------------------------------' if doc=='nove':print 'running xiaoxiaoshuo -------------------------' while(i<10): par = {'p':i} res = requests.get(url+doc+'/',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 メソッドを使用して各ページのコンテンツを取得します。
各ページのコンテンツを取得した後、著者とタイトルを分析します。 コードは次のとおりです
def soup(html_text): s = BeautifulSoup(html_text,'lxml') link = s.find('div',class_='categorylist').find_all('li') for i in link:if i!=s.find('li',class_='page'): title = i.find_all('a')[1] author = i.find_all('a')[2].text url = title.attrs['href'] sign = re.compile(r'(//)|/') match = sign.search(title.text) file_name = title.text if match: file_name = sign.sub('a',str(title.text))
<br/>
タイトルを取得するときに何かが間違っています、なぜ書くときにタイトルにスラッシュを追加しますか。散文ですか? 1 つだけではありません。あと 2 つあります。この問題は、後でファイルを作成したときにファイル名が間違っていたため、正規表現を書き直しました。
最後のステップは、各ページの分析を通じて記事のアドレスを取得し、最初は Web ページのアドレスを変更してコンテンツを 1 つずつ取得することです。トラブル。
def get_content(url): res = requests.get(''+url) if res.status_code==200: soup = BeautifulSoup(res.text,'lxml') contents = soup.find('div',class_='content').find_all('p') content = ''for i in contents: content+=i.text+'\n'return content
<br/>
最後にファイルを書いて保存すればOKです
f = open(file_name+'.txt','w') print 'running w txt'+file_name+'.txt' f.write(title.text+'\n') f.write(author+'\n') content=get_content(url) f.write(content) f.close()
3つの関数は散文ネットワークから散文を取得しますが、問題はそれを取得していないことです。一部の散文が失われた理由はわかりません。400 を超える記事がありますが、ページごとに取得できることを願っています。この問題。もちろん、寮のネットワークが壊れているのと関係があると思います
f = open(file_name+'.txt','w') print 'running w txt'+file_name+'.txt' f.write(title.text+'\n') f.write(author+'\n') content=get_content(url) f.write(content) f.close()
レンダリングのことをほとんど忘れていました
以上がPython はどのようにして prose.com から記事をクロールしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。