利用python爬取散文網的文章實例教程
本文主要給大家介紹的是關于python爬取散文網文章的相關內容,分享出來供大家參考學習,下面一起來看看詳細的介紹:
效果圖如下:

配置python 2.7
bs4 requests
安裝 用pip進行安裝 sudo pip install bs4
sudo pip install requests
簡要說明一下bs4的使用因為是爬取網頁 所以就介紹find 跟find_all
find跟find_all的不同在于返回的東西不同 find返回的是匹配到的第一個標簽及標簽里的內容
find_all返回的是一個列表
比如我們寫一個test.html 用來測試find跟find_all的區(qū)別。
內容是:
<html> <head> </head> <body> <div id="one"><a></a></div> <div id="two"><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >abc</a></div> <div 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></div> <div 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></div> </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('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 "------------------------------"運行以后我們可以看到結果當獲取指定標簽時候兩者區(qū)別不大當獲取一組標簽的時候兩者的區(qū)別就會顯示出來

所以我們在使用時候要注意到底要的是什么,否則會出現(xiàn)報錯
接下來就是通過requests 獲取網頁信息了,我不太懂別人為什么要寫heard跟其他的東西
我直接進行網頁訪問,通過get方式獲取散文網幾個分類的二級網頁然后通過一個組的測試,把所有的網頁爬取一遍
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的進行處理,導致的問題是會不顯示錯誤,爬取的內容會有丟失。然后分析散文網的網頁,發(fā)現(xiàn)是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))獲取標題的時候出現(xiàn)的事,請問大佬們寫散文你標題加斜杠干嘛,不光加一個還有加兩個的,這個問題直接導致我后面寫入文件的時候文件名出現(xiàn)錯誤,于是寫正則表達式,我給你改行了吧。
最后就是獲取散文內容了,通過每頁的分析,獲得文章地址,然后直接獲取內容,本來還想直接通過改網頁地址一個一個的獲得呢,這樣也省事了。
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('div',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多篇文章,這跟散文網的文章是差很多很多的,但是確實是一頁一頁的獲取來的,這個問題希望大佬幫忙看看??赡軕撟鼍W頁無法訪問的處理,當然我覺得跟我宿舍這個網有關系
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()
差點忘了效果圖

能會出現(xiàn)timeout現(xiàn)象吧,只能說上大學一定要選網好的啊!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
零基礎寫python爬蟲之使用urllib2組件抓取網頁內容
文章詳細介紹了在python2.5環(huán)境下,如何使用urllib2這個python自帶的組件進行抓取指定網頁內容的,整個過程記錄的非常的詳細,也很簡單,有需要的朋友可以參考下,寫出自己的python爬蟲2014-11-11
opencv+tesseract實現(xiàn)驗證碼識別的示例
本文主要介紹了opencv+tesseract實現(xiàn)驗證碼識別的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06
用Pelican搭建一個極簡靜態(tài)博客系統(tǒng)過程解析
這篇文章主要介紹了用Pelican搭建一個極簡靜態(tài)博客系統(tǒng)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08
詳細介紹pandas的DataFrame的append方法使用
這篇文章主要介紹了詳細介紹pandas的DataFrame的append方法使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
一篇文章入門Python生態(tài)系統(tǒng)(Python新手入門指導)
原文寫于2011年末,雖然文中關于Python 3的一些說法可以說已經不成立了,但是作為一篇面向從其他語言轉型到Python的程序員來說,本文對Python的生態(tài)系統(tǒng)還是做了較為全面的介紹2015-12-12

