這篇文章主要跟大家介紹了利用python爬取散文網文章的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
本文主要介紹給大家的是python爬取散文網文章的相關內容,分享出來供大家參考學習,下面一起來看看詳細的介紹:
效果圖如下:
#設定python 2.7
# #
bs4 requests安裝用pip進行安裝
sudo pip install bs4
sudo pip install requests簡單說明一下bs4的使用因為是爬取網頁所以就介紹find 跟find_allfind跟find_all的不同在於返回的東西不同find返回的是匹配到的第一個標籤及標籤裡的內容find_all返回的是一個列表
例如我們寫一個test.html 用來測試find跟find_all的差別。
內容是:
<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>然後test.py的程式碼為:
from bs4 import BeautifulSoup import lxml if __name__=='__main__': s = BeautifulSoup(open('test.html'),'lxml') print s.prettify() print "------------------------------" print s.find('p') print s.find_all('p') print "------------------------------" print s.find('p',id='one') print s.find_all('p',id='one') print "------------------------------" print s.find('p',id="two") print s.find_all('p',id="two") print "------------------------------" print s.find('p',id="three") print s.find_all('p',id="three") print "------------------------------" print s.find('p',id="four") print s.find_all('p',id="four") print "------------------------------"運行以後我們可以看到結果當取得指定標籤時候兩者差異不大當取得一組標籤的時候兩者的差異就會顯示出來
def get_html(): url = "https://www.sanwen.net/" 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這部分的程式碼中我沒有對
res.status_code不是200的進行處理,導致的問題是會不顯示錯誤,爬取的內容會有丟失。然後分析散文網的網頁,發現是www.sanwen.net/rizhi/&p=1
#
def soup(html_text): s = BeautifulSoup(html_text,'lxml') link = s.find('p',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))取得標題的時候出現坑爹的事,請問大佬們寫散文你標題加斜杠幹嘛,不光加一個還有加兩個的,這個問題直接導致我後面寫入文件的時候文件名出現錯誤,於是寫正則表達式,我給你改行了吧。
def get_content(url): res = requests.get('https://www.sanwen.net'+url) if res.status_code==200: soup = BeautifulSoup(res.text,'lxml') contents = soup.find('p',class_='content').find_all('p') content = '' for i in contents: content+=i.text+'\n' return content最後就是寫入檔案保存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()三個函數取得散文網的散文,不過有問題,問題在於不知道為什麼有些散文丟失了我只能獲取到大概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爬取文章實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!