前言8號(hào)開了一天車從老家回來,昨天正在干家務(wù),休息的時(shí)候看了一眼手機(jī),螞蟻在群里@我接單。結(jié)果因?yàn)闆]有及時(shí)看消息,發(fā)現(xiàn)的時(shí)候已經(jīng)被別人接了。既然如此,本著練習(xí)的目的,我也打開文件看了一下需求,此時(shí)剛好收到信息說,此前接單的人已經(jīng)放棄接單了,那還等什么,趕緊拿下。 需求分析先看一下金主爸爸的需求: 簡單分析下,大概是: 后來又新增了一個(gè)需求: - 每篇文章要包括:題目、時(shí)間和內(nèi)容
實(shí)施思路- 分析網(wǎng)頁,獲取文章標(biāo)題、鏈接和發(fā)布時(shí)間
- 將文章標(biāo)題、發(fā)布時(shí)間寫入word
- 根據(jù)文章鏈接獲取每一頁的數(shù)據(jù),并將數(shù)據(jù)寫入word
實(shí)施步驟- 網(wǎng)頁分析,構(gòu)造url,獲取文章標(biāo)題、鏈接和發(fā)布時(shí)間
打開需求文檔里的鏈接后,發(fā)現(xiàn)有“博文目錄”標(biāo)簽,點(diǎn)擊后開始分析url構(gòu)成: 分析發(fā)現(xiàn),網(wǎng)頁的url變化的數(shù)據(jù)只有.html前一位,而且這個(gè)數(shù)字就是當(dāng)前的頁碼,同時(shí)列表里包含文章標(biāo)題、發(fā)布時(shí)間,那文章鏈接應(yīng)該也有,進(jìn)一步查看網(wǎng)頁源代碼: 至此,第一步的代碼就已經(jīng)可以完成了: import requests from lxml import etree
for i in range(1, 23): # 共22頁 counter = 0 # 計(jì)數(shù)器 url = f'http://blog.sina.com.cn/s/articlelist_**********_0_{i}.html' # 構(gòu)造url response = requests.get(url, headers=headers) # 發(fā)起請(qǐng)求 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] # 獲取日期,不要時(shí)間 link = ''.join(div.xpath('./p[1]/span[2]/a/@href')) # 獲取文章鏈接
- 根據(jù)文章鏈接獲取每一頁的數(shù)據(jù)
這里是遇到的第一個(gè)問題,也耽擱了好久。博主最早的文章可以追溯到2006年,時(shí)間上跨越了16年之久,網(wǎng)頁數(shù)據(jù)結(jié)構(gòu)有差別,一開始為了簡潔我用的是xpath,請(qǐng)求之后發(fā)現(xiàn)好多文章內(nèi)容是空白,分析之后發(fā)現(xiàn)xpath的層級(jí)不一樣,有好多種情況要做判斷,多次嘗試之后不得不放棄。但通過分析發(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ā)起請(qǐng)求 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)容
docx庫的寫入相對(duì)來說比較容易理解,寫入的過程可以根據(jù)每一步寫入的需要融合進(jìn)代碼中。這里需要注意的是,百度的時(shí)候不要搜索“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 # 計(jì)數(shù)器 url = f'http://blog.sina.com.cn/s/articlelist_**********_0_{i}.html' # 構(gòu)造url response = requests.get(url, headers=headers) # 發(fā)起請(qǐng)求 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)題為一級(jí)標(biāo)題 date = (''.join(div.xpath('./p[2]/span[2]/text()')))[:10] # 獲取日期,不要時(shí)間 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ā)起請(qǐng)求 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ù)和實(shí)現(xiàn)基本的寫入和分頁的要求,剩下的格式調(diào)整、目錄生成與其百度去搜索和代碼調(diào)試,我更愿意使用wps office等可視化工具去處理,方便、專業(yè)、高效,最終效果如下: 寫在最后至此,跨越16年的1090篇文章全部拿下,word寫入共1790頁,近30萬字,由衷地欽佩老先生知識(shí)儲(chǔ)備之豐富,文采之飛揚(yáng)。同時(shí)也感謝雇主在溝通過程中給予的理解,感謝螞蟻老師提供的平臺(tái),最后也感謝一下A0-Vinson小辰。 最后,推薦螞蟻老師的《Python爬蟲課》限時(shí)優(yōu)惠69元:
|