抓取CSDN博客热门文章

项目需求:
下载CSDN博客上有关python的热门文章

老规矩在开始上手代码前,先对需求进行分析和梳理
将思路先整理出来

  1. 如何定义该博客为热门博客
  2. 需要下载多少篇博客
  3. 下载的博客应该如何命名

既然是去CSDN博客上下载,那么首先打开CSDN博客首页:
网址:blog.csdn.net
[CSDN博客首页]在这里插入图片描述这里有3个关键点:
1.如何定义该博客为热门博客–>我们发现有些博客有浏览量,有些没有,先定义有浏览量的为热门博客
2.下载的数量–>可以定下载多少页,比如从第一页到第十页
3.博客的名称–>用该博客标题作为该文章的名称

## 第一步先分析url地址,通常url地址都是从第二页开始分析,分析url网址哪些是变化的,哪些是不变的
url = 'https://so.csdn.net/so/search/s.do?q={keyword}&t=blog&platform=pc&p={page}&s=&tm=&v=&l=&lv=&u=&ft='
## 上述url地址中有两个变化的参数,一个是q={},代表查询的关键字,另一个是p={},代表页码
## 有关爬虫需要了解到关键信息,爬什么,关键字是python,爬多少,起始页-终止页
## 因此需要拿到3个输入信息,python,page1-page10
接下来导入与爬虫有关的包
import urllib.request as ur
import lxml.etree as le
import re
## 构造一个getResponse函数,getResponse函数主要用于获取浏览器返回的地址信息
def getResponse(url):
    req = ur.Request(
        url=url,  # 请求的url地址
        headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0'
        }  ## 请求的url地址采用的请求头
    )
    response = ur.urlopen(req).read()  ## 将获取到的url地址以只读的方式打开,并返回给response对象
    return response
if __name__ == '__main__':  ##  main函数的使用加深理解
    keyword = input('关键词')
    pn_start = int(input('起始页'))  ## 这里起始页和终止页都是一个整型
    pn_end = int(input('终止页'))
    for page in range(pn_start, pn_end + 1):
        # 访问1级页面
        response = getResponse(
            url='https://so.csdn.net/so/search/s.do?q={keyword}&t=blog&platform=pc&p={page}&s=&tm=&v=&l=&lv=&u=&ft='
                .format(page=page, keyword=keyword)
        )
 ## 有了response对象后,即访问到1级页面后,需要继续对它进行数据的提取,目的是提取到该博客的链接地址
		hrefs = le.HTML(response).xpath('//div[@class="search-list-con"]/div/dl/a[1]/@href')
        ## 取每个博客的标题,若要获取到每个博客的标题,那么点开1级页面,进入到2级页面,抓取2级页面里面的文章标题文本内容
        for href in hrefs:  ## 循环遍历出每一个级页面下的2级页面里面的文章标题文本内容
            response_blog = getResponse(
                url=href,  ## 单个1级页面
            )
            ## 对单个1级页面做Xpath提取到标题文本内容
            title = le.HTML(response_blog).xpath('//div[@class="article-header"]/div/h1/text()')[0]
## 特别提醒下,由于文章的标题含有非法字符,因为需要对标题做过滤,经过过滤后的标题可以作为文件名存储到本地
            title = re.sub(
                '[/\\:*"<>|?]', '', title
            )
## 拿到经过过滤的文章标题后,存储的路径为blog文件下即blog/
            ## %s 这个意思是格式化输出
            filepath = 'blog/%s.html' % title
            ## 打开存储路径,以二进制写入
            with open(filepath, 'wb')as f:
                ## 写入的对象为response_blog,即拿到的单个1级页面的访问地址
                f.write(response_blog)
            print(title)

上述代码运行后的结果:

D:\python3.8.6\python.exe D:/爬虫/pythonProject/CSDN热门爬虫/CSDN.py
关键词python
起始页1
终止页2
python系列文章(基础,应用,后端,运维,自动化测试,爬虫,数据分析,可视化,机器学习,深度学习系列内容)
Python学习路线
1行Python代码制作动态二维码
Python&520
【Python】520爱她就用Python给她做一个漂亮的小心心
Python3  和  运算符
python安装教程(Windows系统,python3.7为例)
python安装教程
Python 基础(一):入门必备知识
深入浅出Python——Python基础语法全解
anaconda  python  版本对应关系
Python一.Python安装及环境配置(小白教程)
Python学习目录
python下载安装教程
python的官网下载安装教程
python 实现手机投屏
python列表获取元素最后一个值的方法
Python中如何求列表list的平均数
ubuntu安装python3.7,并更新python默认指向为python3.7
浏览器执行Python脚本
Python爬虫100例教程导航帖(已完结)
python3升级pip3
快速查找Python安装路径方法
Linux下安装Python
Python学习路线(课程大纲+Python视频教程+下载地址)
Mac 升级Python 2.7 到 Python 3.7
图解Python 玩转Python 秒懂python
Python3.8正版安装软件,windows64位32位(附下载链接)
Python学习笔记(15)-Python代码转换为exe可执行程序详解
第一个Python程序(全面)
python 按中文排序
python计算圆的面积
Ubuntu16.04系统查看已安装的python版本,及Python2与Python3之间切换
python
Python random生成小数
python   与   的含义
Python求积分(定积分)
18个Python爬虫实战案例
Python爬虫的用途
Python基础教程,Python入门教程(非常详细)
python 求N的阶乘
十个Python练手的实战项目,学会这些Python就基本没问题了
Linux下执行Python脚本
Python开根号
Python人工智能之图片识别,Python3一行代码实现图片文字识别
VSCode配置Python开发环境
Python读取文件内容
python3.7安装教程
python安装教程(Windows系统,python3.7为例)
Python idle下载、安装与使用教程
win10安装python详细过程
将python文件打包成exe可运行文件
python中pip的安装与使用
python 如何安装numpy库?
手把手教你在Linux环境下安装Python3
Python之如何实现一行输入多个值
一招解决python  pip install 安装库失败
python 字符串转为日期
python高手之路python处理excel文件
python求三角形面积

Process finished with exit code 0

首次运行过程中出现过错误代码:

OSError: [Errno 22] Invalid argument: 'blog/Python3 * 和 ** 运算符.html'

主要原因是博客的title中含有非法字符,而非法字符无法作为文件命名,因此在上述代码中,有一步骤做了re.sub操作,用于过滤非法字符,代码再现一遍:

## 特别提醒下,由于文章的标题含有非法字符,因为需要对标题做过滤,经过过滤后的标题可以作为文件名存储到本地
            title = re.sub(
                '[/\\:*"<>|?]', '', title
            )

心得体会:

  1. 拿到项目需求后,先静下心来分析
  2. 爬取需要导入哪些包:
    ** import urllib.request as ur
    import lxml.etree as le ->用于将HTML转换为xpath
    import re**->re.sub过滤非法字符
  3. 掌握函数调用规格,传入的参数规则
  4. 代码整体逻辑性,从上到下的运行过程

需要源码的同学可访问如下链接:
CSND热门文章爬取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本程序用java编写,运行的时候需要JDK1.5或以上环境,无需安装。程序通过分析CSDN博客源码来生成一些必要的数据,可能在以后使用当中出现爬取不了的情况,可能是CSDN的源码结构修改了。程序只是用于学习之用,严禁用于非法目的而照成CSDN服务器过载。 由于生成PDF的时候需要依赖字库,所以在打包程序的时候把一些必要的字库已经放到程序中去了。可能在生成一些PDF文件的时候出现乱码问题,那是因为里面缺少需要的字库,如遇到这个问题,请和本人联系wyphao.2007@163com #################################################### 程序功能: 1、支持输入CSDN博客用户名针对性下载 2、支持选择保存下载的文件 保存的结构目录为: 选择的保存路径\CSDN用户名\img 该用户的头像保存路径 选择的保存路径\CSDN用户名\pdf 生成的PDF文件保存路径 选择的保存路径\CSDN用户名\doc 生成的DOC文件保存路径 选择的保存路径\CSDN用户名\txt 生成的TXT文件保存路径 3、支持获取用户博客信息 4、支持显示用户所有的帖子列表 5、可以自己选择需要下载的帖子,有全选、反选、重置按钮 6、支持下载的文件保存为 pdf、doc、txt三种格式 7、生成的pdf、doc文件支持图片 8、支持进度显示 #################################################### 制作时间:2012年07月17日 - 2012年07月18日 制 作:w397090770 个人博客:http://blog.csdn.net/w397090770 Email :wyphao.2007@163.com 版权所有,翻版不究 ####################################################
本程序用java编写,运行的时候需要JDK1.5或以上环境,无需安装。程序通过分析CSDN博客源码来生成一些必要的数据,可能在以后使用当中出现爬取不了的情况,可能是CSDN的源码结构修改了。程序只是用于学习之用,严禁用于非法目的而照成CSDN服务器过载。 由于生成PDF的时候需要依赖字库,所以在打包程序的时候把一些必要的字库已经放到程序中去了。可能在生成一些PDF文件的时候出现乱码问题,那是因为里面缺少需要的字库,如遇到这个问题,请和本人联系wyphao.2007@163com #################################################### 程序功能: 1、支持输入CSDN博客用户名针对性下载 2、支持选择保存下载的文件 保存的结构目录为: 选择的保存路径\CSDN用户名\img 该用户的头像保存路径 选择的保存路径\CSDN用户名\pdf 生成的PDF文件保存路径 选择的保存路径\CSDN用户名\doc 生成的DOC文件保存路径 选择的保存路径\CSDN用户名\txt 生成的TXT文件保存路径 3、支持获取用户博客信息 4、支持显示用户所有的帖子列表 5、可以自己选择需要下载的帖子,有全选、反选、重置按钮 6、支持下载的文件保存为 pdf、doc、txt三种格式 7、生成的pdf、doc文件支持图片 8、支持进度显示 #################################################### 制作时间:2012年07月17日 - 2012年07月18日 制 作:w397090770 个人博客:http://blog.csdn.net/w397090770 Email :wyphao.2007@163.com 版权所有,翻版不究 ####################################################
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值