抓取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热门文章爬取

猜你喜欢

转载自blog.csdn.net/weixin_42961082/article/details/109843858
今日推荐