小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 我本無我O 2022-02-11

前言

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

需求分析

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

Image

簡單分析下,大概是:

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

后來又新增了一個(gè)需求:

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

實(shí)施思路

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

實(shí)施步驟

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

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

Image
Image

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

Image

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

import requests
from lxml import etree

for i in range(123): # 共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)簽下所有文字。

Image
Image

代碼如下:

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)容
  • 數(shù)據(jù)寫入和保存

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(123):
    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')

整理前效果展示

Image

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

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

Image
Image
Image

寫在最后

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

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多