<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python私活300元,爬蟲批量獲取新浪博客文章存儲到Word文件

          共 3895字,需瀏覽 8分鐘

           ·

          2022-02-14 08:48

          前言

          8號開了一天車從老家回來,昨天正在干家務(wù),休息的時候看了一眼手機(jī),螞蟻在群里@我接單。結(jié)果因為沒有及時看消息,發(fā)現(xiàn)的時候已經(jīng)被別人接了。既然如此,本著練習(xí)的目的,我也打開文件看了一下需求,此時剛好收到信息說,此前接單的人已經(jīng)放棄接單了,那還等什么,趕緊拿下。

          需求分析

          先看一下金主爸爸的需求:

          簡單分析下,大概是:

          • 爬取1000多篇文章,保存為word
          • word必須要有目錄,目錄為文章標(biāo)題
          • 每篇文章單獨(dú)一頁
          • 要求提供原始代碼

          后來又新增了一個需求:

          • 每篇文章要包括:題目、時間和內(nèi)容

          實施思路

          • 分析網(wǎng)頁,獲取文章標(biāo)題、鏈接和發(fā)布時間
          • 將文章標(biāo)題、發(fā)布時間寫入word
          • 根據(jù)文章鏈接獲取每一頁的數(shù)據(jù),并將數(shù)據(jù)寫入word
          • 保存數(shù)據(jù)
          • 用可視化工具處理word

          實施步驟

          • 網(wǎng)頁分析,構(gòu)造url,獲取文章標(biāo)題、鏈接和發(fā)布時間

          打開需求文檔里的鏈接后,發(fā)現(xiàn)有“博文目錄”標(biāo)簽,點(diǎn)擊后開始分析url構(gòu)成:

          分析發(fā)現(xiàn),網(wǎng)頁的url變化的數(shù)據(jù)只有.html前一位,而且這個數(shù)字就是當(dāng)前的頁碼,同時列表里包含文章標(biāo)題、發(fā)布時間,那文章鏈接應(yīng)該也有,進(jìn)一步查看網(wǎng)頁源代碼:

          至此,第一步的代碼就已經(jīng)可以完成了:

          import?requests
          from?lxml?import?etree

          for?i?in?range(1,?23):?#?共22頁
          ????counter?
          =?0??#?計數(shù)器
          ????url?=?f'http://blog.sina.com.cn/s/articlelist_**********_0_{i}.html'??#?構(gòu)造url
          ????response?=?requests.get(url,?headers=headers)??#?發(fā)起請求
          ????response.encoding?=?response.apparent_encoding??#?設(shè)置編碼格式
          ????result?=?etree.HTML(response.text)??#?xpath解析
          ????divs?=?result.xpath('//*[@id="module_928"]/div[2]/div[1]/div[2]/div')
          ????for?div?in?divs:
          ????????title?=?("".join(div.xpath('./p[1]/span[2]/a/text()'))).replace("\xa0",?"")??#?獲取文章標(biāo)題
          ????????date?=?("".join(div.xpath('./p[2]/span[2]/text()')))[:10]??#?獲取日期,不要時間
          ????????link?=?"".join(div.xpath('./p[1]/span[2]/a/@href'))??#?獲取文章鏈接
          • 根據(jù)文章鏈接獲取每一頁的數(shù)據(jù)

          這里是遇到的第一個問題,也耽擱了好久。博主最早的文章可以追溯到2006年,時間上跨越了16年之久,網(wǎng)頁數(shù)據(jù)結(jié)構(gòu)有差別,一開始為了簡潔我用的是xpath,請求之后發(fā)現(xiàn)好多文章內(nèi)容是空白,分析之后發(fā)現(xiàn)xpath的層級不一樣,有好多種情況要做判斷,多次嘗試之后不得不放棄。但通過分析發(fā)現(xiàn),所有文章內(nèi)容都是在“class=articalContent ? newfont_family”或“class=articalContent ? ”下面,經(jīng)過調(diào)試,最后決定使用BeautifulSoup的select方法獲取class標(biāo)簽下所有文字。

          代碼如下:

          res_data?=?requests.get(link,?headers=headers)??#?發(fā)起請求
          res_data.encoding?=?res_data.apparent_encoding??#?設(shè)置編碼
          soup?=?BeautifulSoup(res_data.text,?"html.parser")??#?解析
          articles?=?soup.select(".articalContent")??#?取值
          for?article?in?articles:
          ????content?=?article.text.strip()??#?獲取文本內(nèi)容
          • 數(shù)據(jù)寫入和保存

          docx庫的寫入相對來說比較容易理解,寫入的過程可以根據(jù)每一步寫入的需要融合進(jìn)代碼中。這里需要注意的是,百度的時候不要搜索“python docx庫”直接搜“docx庫”。

          完整代碼

          import?requests
          from?lxml?import?etree
          import?docx
          from?docx.oxml.ns?import?qn??#?用于中文字體
          from?bs4?import?BeautifulSoup


          headers?=?{
          ????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/98.0.4758.82?Safari/537.36',
          ????'Referer':?'http://blog.sina.com.cn/********',
          }

          doc?=?docx.Document()??#?新建word文檔
          doc.styles['Normal'].font.name?=?u'宋體'??#?設(shè)置全局字體
          doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),?u'宋體')

          for?i?in?range(1,?23):
          ????counter?
          =?0??#?計數(shù)器
          ????url?=?f'http://blog.sina.com.cn/s/articlelist_**********_0_{i}.html'??#?構(gòu)造url
          ????response?=?requests.get(url,?headers=headers)??#?發(fā)起請求
          ????response.encoding?=?response.apparent_encoding??#?設(shè)置編碼格式
          ????result?=?etree.HTML(response.text)??#?xpath解析
          ????divs?=?result.xpath('//*[@id="module_928"]/div[2]/div[1]/div[2]/div')
          ????for?div?in?divs:
          ????????title?=?("".join(div.xpath('./p[1]/span[2]/a/text()'))).replace("\xa0",?"")??#?獲取文章標(biāo)題
          ????????doc.add_heading(title,?1)??#?添加文章標(biāo)題為一級標(biāo)題
          ????????date?=?("".join(div.xpath('./p[2]/span[2]/text()')))[:10]??#?獲取日期,不要時間
          ????????doc.add_paragraph(date)??#?添加日期
          ????????print(f"正在寫入文章?{title}……")
          ????????link?=?"".join(div.xpath('./p[1]/span[2]/a/@href'))??#?獲取文章鏈接
          ????????res_data?=?requests.get(link,?headers=headers)??#?發(fā)起請求
          ????????res_data.encoding?=?res_data.apparent_encoding??#?設(shè)置編碼
          ????????soup?=?BeautifulSoup(res_data.text,?"html.parser")??#?解析
          ????????articles?=?soup.select(".articalContent")??#?取值
          ????????for?article?in?articles:
          ????????????content?=?article.text.strip()??#?獲取文本內(nèi)容
          ????????????doc.add_paragraph(content)??#?寫入
          ????????doc.add_page_break()??#?增加分頁
          ????????counter?+=?1
          ????print(f"第{i}頁,已寫入?{counter}?篇文章。")
          doc.save("隨緣即福新浪博客文章.docx")

          整理前效果展示

          格式調(diào)整、交付

          docx庫平常使用的比較少,以上代碼僅限于拿到數(shù)據(jù)和實現(xiàn)基本的寫入和分頁的要求,剩下的格式調(diào)整、目錄生成與其百度去搜索和代碼調(diào)試,我更愿意使用wps office等可視化工具去處理,方便、專業(yè)、高效,最終效果如下:

          寫在最后

          至此,跨越16年的1090篇文章全部拿下,word寫入共1790頁,近30萬字,由衷地欽佩老先生知識儲備之豐富,文采之飛揚(yáng)。同時也感謝雇主在溝通過程中給予的理解,感謝螞蟻老師提供的平臺,最后也感謝一下A0-Vinson小辰。


          最后,推薦螞蟻老師的《Python爬蟲課》限時優(yōu)惠69元:



          瀏覽 80
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  AV12在线 | 美国富婆吃鸡巴视频 | 中文字幕国产 | 欧美激情乱伦 | 欧美国产日韩在线观看 |