每一秒钟的时间都值得铭记

0%

使用Python原生爬虫爬取博客文章的简单信息

今天我们使用Python的原生方式,来爬取我们自己的博客的一些简单信息。

准备

在制作一个简单的Python爬虫之前,我们需要先分析一下我们需要使用爬虫来爬取什么信息,又该通过什么方式来解析出我们所需要的信息。

因为今天制作的是一个简单的Python爬虫,所以我们想要爬取的信息也不是非常复杂。
我们需要爬取博客中的5个信息,分别是:文章URL,文章标题,文章上传时间,文章阅读数,文章评论数
因为我们使用的是Python原生的方式来爬取信息,所以我们也直接使用正则表达式来解析爬取的数据,从数据中获取我们所需要的信息。

项目结构

在这里插入图片描述

article.py模块(信息对象)

为了便于封装爬取的信息,我们在article.py模块下创建一个信息类,里面封装了我们需要爬取的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Article(object):
url = ''
title = ''
date = ''
read_num = 0
comment_num = 0

def __init__(self, url, title, date, read_num, comment_num):
self.url = url
self.title = title
self.date = date
self.read_num = read_num
self.comment_num = comment_num

spider.py模块(爬虫)

我们在spider.py模块下创建一个爬虫类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import re
from urllib import request

from article import Article


class Spider():
# 博客路径
url = 'https://blog.csdn.net/qq_45193304/article/list/'
# 单个博客文章内容块的正则表达式
article_pattern = '<div class="article-item-box csdn-tracking-statistics" data-articleid="[\d]*?">[\s\S]*?</div>[\S\s]*?</div>'
# 单个博客文章URL和标题的正则表达式
title_pattern = '<a href="([\s\S]*?)" target="_blank">[\S\s]*?<span class="article-type type-1 float-none">原创</span>([\s\S]*?)</a>'
# 单个博客文章上传时间的正则表达式
date_pattern = '<span class="date">([\d\D]*?)</span>'
# 单个博客文章阅读次数的正则表达式
read_num_pattern = '<span class="read-num">阅读数 <span class="num">([\d]*?)</span> </span>'
# 单个博客文章评论次数的正则表达式
comment_num_pattern = '<span class="read-num">评论数 <span class="num">([\d]*?)</span> </span>'

# 通过url获取html页面内容,并通过utf-8进行解码
def __fetch_content(self, url):
r = request.urlopen(url)
html = r.read()
return str(html, encoding='utf-8')

# 通过html页面获取页面中的文章内容块
def __get_article(self, html):
article_html = re.findall(self.article_pattern, html)
return article_html

# 对每个文章内容块进行处理,获取博客的url和标题
def __get_url_and_title(self, article):
r = re.search(self.title_pattern, article)
url = r.group(1).strip()
title = r.group(2).strip()
return url, title

# 对每个文章内容块进行处理,获取博客的上传时间
def __get_date(self, article):
r = re.search(self.date_pattern, article)
date = r.group(1).strip()
return date

# 对每个文章内容块进行处理,获取博客的阅读数
def __get_read_num(self, article):
r = re.search(self.read_num_pattern, article)
read_num = int(r.group(1))
return read_num

# 对每个文章内容块进行处理,获取博客的评论数
def __get_comment_num(self, article):
r = re.search(self.comment_num_pattern, article)
comment_num = int(r.group(1))
return comment_num

# 对博客文章列表进行遍历,然后分别处理每一个博客文章内容,进行封装处理
def __do_package(self, article_html, article_list):
for article in article_html:
url, title = self.__get_url_and_title(article)
date = self.__get_date(article)
read_num = self.__get_read_num(article)
comment_num = self.__get_comment_num(article)
article = Article(url, title, date, read_num, comment_num)
article_list.append(article)

# 爬虫的入口函数
def go(self):
page = 1
article_list = []
while page:
url = self.url + str(page)
page += 1
html = self.__fetch_content(url)
article_html = self.__get_article(html)
if len(article_html) == 0:
break
self.__do_package(article_html,article_list)
return article_list

# 实例化一个Spider对象
spider = Spider()
# 调用spider的go()方法,获取一个article对象的列表
article_list = spider.go()

# 一共爬取了多少条信息
print('爬虫一共爬取了' + str(len(article_list)) + '条博客文章信息')

# 遍历列表,打印列表中的数据
for article in article_list:
print(article.__dict__)

结束

通过上面的代码,我们使用Python原生的方式爬取的信息,就会直接在控制台打印出来。
如果我们需要爬取其他博客用户的信息,只需要修改url的值即可。

最后需要说一句的是,CSDN没有对博客内容进行反爬虫,但是对于访问量等博客数据却有着反爬虫机制,可以防止用户通过爬虫来恶意刷访问量,所以那些想通过爬虫来刷访问量的同学可以洗洗睡了。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------