使用python爬取散文網的文章

来源:http://www.cnblogs.com/qxhn/archive/2017/07/02/7106610.html
-Advertisement-
Play Games

image.png 配置python 2.7 bs4 requests 安裝 用pip進行安裝 sudo pip install bs4 sudo pip install requests 簡要說明一下bs4的使用因為是爬取網頁 所以就介紹find 跟find_all find跟find_all的不 ...



image.png

配置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的區別。內容是:

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

 

 

然後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 "------------------------------"

 

 

運行以後我們可以看到結果當獲取指定標簽時候兩者區別不大當獲取一組標簽的時候兩者的區別就會顯示出來


image.png

所以我們在使用時候要註意到底要的是什麼,否則會出現報錯
接下來就是通過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的進行處理,導致的問題是會不顯示錯誤,爬取的內容會有丟失。然後分析散文網的網頁,發現是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))

 

 

獲取標題的時候出現坑爹的事,請問大佬們寫散文你標題加斜杠幹嘛,不光加一個還有加兩個的,這個問題直接導致我後面寫入文件的時候文件名出現錯誤,於是寫正則表達式,我給你改行了吧。
最後就是獲取散文內容了,通過每頁的分析,獲得文章地址,然後直接獲取內容,本來還想直接通過改網頁地址一個一個的獲得呢,這樣也省事了。

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多篇文章,這跟散文網的文章是差很多很多的,但是確實是一頁一頁的獲取來的,這個問題希望大佬幫忙看看。可能應該做網頁無法訪問的處理,當然我覺得跟我宿舍這個破網有關係

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

 

差點忘了效果圖

代碼雖亂,我卻從未止步
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2、列表簡介 Python內置的一種數據類型是列表:list。 list是一種有序的集合。 列表由一系列按特定順序排列的元素組合。用 [ ] 來表示。 list裡面的元素的數據類型也可以不同,比如: >>> L = ['Apple', 123, True] 2.1索引列表 從0開始而不是1。當索引超 ...
  • 題目描述 香穗子在田野上調蘑菇!她跳啊跳,發現自己很無聊,於是她想了一個有趣的事情,每個格子最多只能經過1次,且每個格子都有其價值 跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格子,並且她只能往價值更高(這裡是嚴格的大於)的格子跳. 香穗子可以從任意的格子出發,在任意的格子結束, 那麼她 ...
  • 題目描述 和所有人一樣,奶牛喜歡變化。它們正在設想新造型的牧場。奶牛建築師Hei想建造圍有漂亮白色柵欄的三角形牧場。她擁有N(3≤N≤40)塊木板,每塊的長度Li(1≤Li≤40)都是整數,她想用所有的木板圍成一個三角形使得牧場面積最大。 請幫助Hei小姐構造這樣的牧場,並計算出這個最大牧場的面積。 ...
  • Netty 線程模型 Netty的線程模型主要是基於React,因為考慮到應用場景的不同所以演化出多種版本。 單線程模式 即接收服務請求以及執行IO操作都由一個線程來完成,由於採用的是IO多路復用這類無阻塞IO操作,所以在請求量不大的情況下單線程模式也是可以解決一部分場景問題的。 單接收多工作線程模 ...
  • 一、前言 今天在Ubuntu安裝了lnmp環境,運行項目的時候出現了,引入500的錯誤 二、查看錯誤 再項目文件入口添加,代碼顯示錯誤內容,查看到一下錯誤 三、分析錯誤內容 查看問題描述以及資料,發現是php open_basedir 配置的問題,php不能引入其授權目錄上級及其以上的文件,預設配置 ...
  • 上傳頭像,自己感覺了好久,就是上傳文件唄其實,存在一個路徑,資料庫存儲這個路徑,然後展示給前端,啥都不說,看怎麼實現的。 資料庫設置如下 form 表單設計: 後端實現代碼 存儲路徑是 接下來是前端的展示 這裡說明下,這裡的後端實現上傳的頭像的代碼 在Windows上回報錯,說文件不存在,我試著去修 ...
  • 簡單工廠模式 簡單工廠模式是類的創建模式,又叫做靜態工廠方法模式。簡單工廠模式由一個工廠對象決定生產出哪一種產品類的實例。 為什麼要使用簡單工廠模式 原因很簡單:解耦。 LOL場景分析: LOL中目前有100多個英雄,各個人物的技能全都不同,具體英雄的代碼實現必定不同; 但是每個英雄的技能都是Q、W ...
  • 上面這段代碼是書上關於Nio具體工作過程的代碼示例。其工作過程可以具體闡述如下: 其中有兩個關鍵的類:Channel和Selector,它們是NIO中的核心概念。其中Channel可類比為交通工具,而且是具體的交通工具,例如:汽車,自行車。而Selector則可以類比為車輛調度系統,負責車輛運行狀況 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...