Python爬取新浪博文的所有文章并存为带目录的word文档

Python爬取新浪博文的所有文章并存为带目录的word文档


(http://blog.sina.com.cn/)网址中任意博主的博文目录网址都可爬取(注意是博主的博文目录对应的网址)


1.先获取到所有文章的标题、发表日期、链接

2.通过链接获取文章的内容

3.将文章标题作为“1级”,发表日期和内容作为正文写入word文件

4.保存word文件

5.保存图片到文件夹 注:图片较多,运行出结果,即可停止


注:安装site-packages时,’from docx.oxml.ns import qn #用于应用中文字体‘ pip install 安装出错,经查资料 在 Terminal 中输入 pip3 install python-docx 解决

Beautifulsoup在Pycharm中安装不了的,进入网址,下载对应版本的模板,在Terminal 中输入 pip install 下载的文件(需要在Terminal找到相应的路径,然后执行语句)

网址语句
https://blog.csdn.net/m0_46299185/article/details/119281928?spm=1001.2014.3001.5501pip install

每段代码含义,作用在代码注释中都有解释
文章只需要更改想要访问的网址,和保存的word文档名称即可(代码本身可以直接使用),看完可以小手点赞收藏呦,谢谢。

#-*- codeing = utf-8 -*-
#@Time : 2021/8/23 20:24
#@Auther : Yt.Monody
#@File : Sina_blog.py
#Software: PyCharm



import requests
from bs4 import BeautifulSoup
import docx
from docx.oxml.ns import qn #用于应用中文字体
import re
import os





def main():         #主函数

    #获取博文的  标题,url,时间  存入字典中
    all_data=getlink()

    #保存到excel
    to_word(all_data)

    #下载图片
    Sina_pic(all_data)


def request_s(url):             #访问网页函数
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"
    }

    html = requests.get(url=url, headers=headers)

    return html


def getlink():

    all_data=[]         #用于存放字典
                        # [{},{},{}]

    #获取博文总页数                爬取的网址不一样,结果可能报错,需要自己去调一下
    # page=request_s('http://blog.sina.com.cn/s/articlelist_1725765581_0_1.html')
    # soup=BeautifulSoup(page.content,'lxml')
    # page_Num=soup.select('.SG_connBody>.article_blk>.SG_page>ul.SG_pages>span')
    # page_Num=re.findall('>共(.*?)页</',str(page_Num[0]))

    for i in range(1,2):    #如要获取全部博文,请用  <int(page_Num[0])+1>  代替range的第二个参数
        url = f'http://blog.sina.com.cn/s/articlelist_1725765581_0_{i}.html'        #访问网址的动态输入    
        #<--如要更换博文,在http://blog.sina.com.cn/里选取博主,只需进入博文目录,把1725765581换成对应的 就可以了-->

        wb_data = request_s(url)

        soup = BeautifulSoup(wb_data.content,'lxml')
        links = soup.select('.atc_title')        #解析博文标题
        times = soup.select('.atc_tm')           #解析博文发表日期

        for i in range(len(links)):
            all_link = {}                       #设置空字典

            http_link = links[i].select('a')[0].get('href')         #定位标题所在的标签
            title = links[i].text.strip()                           #获得博文文本前后去空
            time = times[i].text                                    #获得博文发表日期
            all_link[title] = [http_link, time]                     #将博文的标题,日期存入字典
            all_data.append(all_link)                               #将字典存入列表中

    print(all_data)   #测试 打印字典
    return all_data



# def get_text(all_data):          调试从网页获取文章内容是否有乱码,特殊字符
#     #获取文章中的文字
#     for data in all_data:
#        for url in data.values():
#             url =url[0]
#             wb_data = request_s(url)
#             soup = BeautifulSoup(wb_data.content,'lxml')
#             article = soup.select('.articalContent.newfont_family')
#             # print(article)
#             #print(article[0].text)




def to_word(all_data):
    doc = docx.Document()            # 新建word文档\n",
    doc.styles['Normal'].font.name = u'宋体'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    counter = 0         # 计数器,用于记录写入word的文章数\n",

    for example in all_data:
        for title in example.keys():
            doc.add_heading(title, 1)       #添加标题
            date = example[title][1][:10]   #只去日期,不要时间
            doc.add_paragraph(date)         #添加段落

            #解析网址
            wb_data = request_s(example[title][0])
            soup = BeautifulSoup(wb_data.content,'lxml')
            article = soup.select(".articalContent.newfont_family")

            # 有些文章被加密,获取不到内容,此时article为空,所以加个if语句判断\n",
            if article:
                # text = article[0].text.replace(\"\\xa0\",\"\")
                doc.add_paragraph(article[0].text)
                counter += 1
                print(f"写入第-{counter}-篇文章: {title} 。")
                # 中间出现服务器无反应,应考虑反爬虫或其他延时方法",
                if counter > 150:
                    break

    print(f"共写入 {counter} 篇文章。")
    doc.save("新浪微博文章.docx")



def Sina_pic(all_data):             #下载图片
    picture=[]


    for data in all_data:
        for i in data.values():
        #获取单篇文章中的图片链接
            url = i[0]
            wb_data = requests.get(url)
            soup = BeautifulSoup(wb_data.content,'lxml')
            img_link = soup.select(".articalContent.newfont_family")[0].find_all("img")
            img_link=re.findall('real_src="(.*?)"',str(img_link))

            picture.append(img_link)


    # 新浪博文图片
    if not os.path.exists('./新浪博文图片'):
        os.mkdir('./新浪博文图片')
    j = 1
    for pic in picture:
        for p in pic:
            img_data=requests.get(url=p).content

            img_path=f'./新浪博文图片/图片{j}.jpg'

            with open(img_path,'wb') as fp:
                fp.write(img_data)
            print(f'图片{j}','下载成功!')
            j+=1




if __name__ == '__main__':      #当程序执行时
#调用函数
    main()
    print("保存完毕!")
0docx相关的用法可以参考网址
1https://www.cnblogs.com/treasury-manager/p/14037183.html
2更详细的解释
3https://zhuanlan.zhihu.com/p/157795694
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bEstow--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值