Python私活300元,爬蟲批量獲取新浪博客文章存儲到Word文件
前言
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元:
