Python爬虫简单实战(爬取CSDN博客阅读数)

        在这学期学习了java web的基础上,又学习了Python的基本语法,所以尝试着做了一个简单版的爬虫,爬取了我所有博客的阅读数。进阶版:https://blog.csdn.net/Q_M_X_D_D_/article/details/94732292

编程思路

        实现这个简单的爬虫大致分三步:

        1、先使用Python的第三方库requests来将整个页面下载下来,这时页面内的所有内容就会被我们读取出来了,当然也包括每篇文章的阅读数。

        2、使用第三方库re中的正则表达式来将页面中我们所需要的信息筛选出来。即把阅读数标签附近的代码抽取出来。在浏览器中右键点击审查元素即可查看网页源代码。将鼠标移到HTML代码上可以显示出这行代码的作用范围。例如:

        由此看到,每篇博客的阅读数被包含在一个<span>标签里,这时就可以使用正则表达式将这个span标签的内容全部选取出来。

        3、第二步可以将span标签中的所有内容选取出来,但是这时里面还有其他我们不需要的信息,我们只需要标签里阅读数这个数字,所以就再使用一次正则表达式将span标签中的阅读数选取出来。

实现过程

下载页面

        首先分析我们要爬取的页面,在我的博客首页中可以看出,我的所有博客被分到了7个页面中,而每个页面有20片博客:

        而这7个页面的网址非常相似:

        由此看出,每一页的网址就是“https://blog.csdn.net/Q_M_X_D_D_/article/list/”后面加上页数和一个问号。那么我们就将“https://blog.csdn.net/Q_M_X_D_D_/article/list/”当做基址,通过向后拼接字符串来得到每个页面的地址,然后下载每个页面。代码如下:

list=[]
def link_crwael(start_url):
    html=download(start_url)
    temp=get_num(get_span(html))
    for i in temp:
        if(int(i)>5):
            list.append(int(i))

def download(url):
    print(f"try to download url={url}")
    resp=requests.get(url)
    if resp.status_code==200:
        return resp.text


url="https://blog.csdn.net/Q_M_X_D_D_/article/list/"
for i in range(1,8):
    link_crwael(url+str(i)+"?")
    print(list)
    list.clear()

        首先是用download函数下载一个页面的所有内容,并将HTML代码送到link_crwael函数中。link_crwael函数用来将接收到的HTML代码进行筛选,将阅读数抽出存到一个list中,其中的get_span和get_num函数下面再讲。每页的所有文章阅读数输出到一行中,然后将list清空,方便输出下一页的阅读数。

爬取span标签

        下载好页面之后就该用正则表达式将span标签选取出来,在审查元素中,我首先将阅读数对应位置的span标签的内容先复制下来,是这样的:

<span class="read-num">阅读数 <span class="num">79</span> </span>

        然后提取特征,编写正则表达式:

r"<span class=\"num\">[0-9]*</span>"

        然后用这个正则表达式对所有HTML代码进行查询,返回所有符合正则表达式的内容,放到一个列表中,列表中存的是字符串。代码如下:

def get_span(html):
    # 将正则表达式编译之后可以使用findall函数 #
    web_regex=re.compile(r"<span class=\"num\">[0-9]*</span>")
    return web_regex.findall(html)

提取阅读数

        此时我们已经得到了所有符合条件的span标签,例如:

<span class="read-num">阅读数 <span class="num">79</span> </span>

        此时我们就该将这些字符串中的数字提取出来,再次编写一个提取数字的正则表达式:

r"[0-9]+"

        对列表中每个字符串进行提取,然后就得到了每篇博客的阅读数啦。代码如下:

def get_num(list):
    num_regex=re.compile(r"[0-9]+")
    s=""
    for i in list:
        s+=str(i)
    return num_regex.findall(s)

运行结果

源代码

import re
import requests

def get_span(html):
    # 将正则表达式编译之后可以使用findall函数 #
    web_regex=re.compile(r"<span class=\"num\">[0-9]*</span>")
    return web_regex.findall(html)

def get_num(list):
    num_regex=re.compile(r"[0-9]+")
    s=""
    for i in list:
        s+=str(i)
    return num_regex.findall(s)

list=[]
def link_crwael(start_url):
    html=download(start_url)
    temp=get_num(get_span(html))
    for i in temp:
        if(int(i)>5):
            list.append(int(i))

def download(url):
    print(f"try to download url={url}")
    resp=requests.get(url)
    if resp.status_code==200:
        return resp.text


url="https://blog.csdn.net/Q_M_X_D_D_/article/list/"
for i in range(1,8):
    link_crwael(url+str(i)+"?")
    print(list)
    list.clear()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值