Python爬取CSDN文章标题和访问量

本文介绍了如何使用Python的re、requests等模块爬取CSDN博客的文章标题和阅读量。通过查找网页源代码中的特定正则表达式,实现了对文章关键信息的提取,并利用time和random模块防止触发反爬机制。虽然方法较为基础,但对初学者具有参考价值。
摘要由CSDN通过智能技术生成

之前看了某位博主的访问量爬取代码,自己想在此基础上再爬一个文章标题。查阅一些博客和资料后选择正则表达式进行文章标题的爬取。方法比较笨拙,如有看官,还请多担待,本人不是很擅长爬虫。

  1. 语言:Python
  2. 版本:Python3.8
  3. 使用模块:re、requests、time、random、datetime
  4. 集成开发环境:Pycharm
一、模块介绍
  • re模块:re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。(python内置模块,无需单独安装)
    正则表达式语法:学习正则表达式
    正则表达式在线工具:可在编程环境外进行方便的单独测试,观察所书写的正则表达式是否合乎要求
    本次共用到两个正则表达式
    第一个是从网页数据中提取出阅读量的信息:<span.*?read-count.*?(\d+).*?</span>
    第二个是从网页数据中提取出标题的信息:>.{0,}</h1>(略显幼稚~)
    方法:随意打开一篇CSDN文章,按F12打开开发者工具,从中找到包含阅读量的标签。
    博客阅读量正则表达式
    方法:鼠标在右边的标签上移动时,左边对应的数据会高亮,移动到阅读量的数据高亮时,就找到了包含阅读量的标签,此刻可知包含阅读量的标签格式为:<span class="read-count">阅读量</span>,再根据这个标签写出正则表达式。

  • requests模块:该模块是用的比较多的HTTP请求库,可以方便的进行网页爬取。(非内置模块,需要安装)
    安装方法:pip install requests
    可能会有超时错误,原因是python官网是外国网站,国内访问速度较慢,此时可选择使用国内的豆瓣源进行安装:
    pip install requests -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
    requests库详解:有关该模块的详细介绍
    requests库的基本使用方法:该模块的基本的使用方法
    官方文档,一言难尽~

  • time模块:用于处理时间问题,提供了一系列的操作时间的函数。(Python内置模块,无需安装)
    time模块常用方法:有关time模块的简单用法介绍。
    本次只使用到了time模块的sleep(方法),主要用于延时,防止激发反爬机制

  • random模块:该模块用于生成随机数(用于延时用)
    random的用法:有关random模块的简单用法介绍。
    本次用到的方法是random.randint(60, 83),用于生成60-83之间的随机数

  • datetime模块:提供用于处理日期和时间的类,此处仅供输出时间作提醒用。
    datetime的使用方法:有关datatime的简单用法介绍。

爬取CSDN文章的标题和访问量代码如下所示

import re
import requests
from requests import RequestException
import time
import random
import datetime

def get_title(html):
    try:
        regex = ">.{0,}</h1>"
        read_title = re.compile(regex).search(html)
        read_title = read_title.__str__()
        lens = len(read_title)
        begin = read_title.index("match") + 8
        read_title = read_title[begin:lens - 7]
        # print("当前文章的标题是:"+read_title)
        return read_title
    except Exception:
        print('寻找标题出错')
        return None

def get_page(url):
    try:
        headers = {
            'Referer': 'https://blog.csdn.net',  # 伪装成从CSDN博客搜索到的文章
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
        # 伪装成浏览器
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('请求出错')
        return None

def parse_page(html):
    try:
        read_num = int(re.compile('<span.*?read-count.*?(\d+).*?</span>').search(html).group(1))
        return read_num
    except Exception:
        print('解析出错')
        return None

def dst(url):
    html = get_page(url)
    if html:
        read_title = get_title(html)
        if read_title != None:
            print('当前文章:', read_title)
        read_num = parse_page(html)
        if read_num:
            print('当前阅读量:', read_num)

def main():
    try:
        while 1:
            print("now time is : " + nowTime())
            url = "https://blog.csdn.net/CSDNsabo/article/details/104778542"
            dst(url)
            sleep_time = random.randint(60, 83)
            # sleep_time = random.randint(30, 50)
            url = "https://blog.csdn.net/CSDNsabo/article/details/112723065"
            dst(url)
            sleep_time = random.randint(60, 83)
            # sleep_time = random.randint(30, 50)
            print('please wait', sleep_time, 's')
            time.sleep(sleep_time)  # 设置访问频率,过于频繁的访问会触发反爬虫
    except Exception:
        print('出错啦!')

def  nowTime():
    curr_time = datetime.datetime.now()
    curr_time.date()
    return curr_time.__str__()

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值