今天我们使用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>' 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>'
def __fetch_content(self, url): r = request.urlopen(url) html = r.read() return str(html, encoding='utf-8')
def __get_article(self, html): article_html = re.findall(self.article_pattern, html) return article_html
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()
article_list = spider.go()
print('爬虫一共爬取了' + str(len(article_list)) + '条博客文章信息')
for article in article_list: print(article.__dict__)
|
结束
通过上面的代码,我们使用Python原生的方式爬取的信息,就会直接在控制台打印出来。
如果我们需要爬取其他博客用户的信息,只需要修改url
的值即可。
最后需要说一句的是,CSDN没有对博客内容进行反爬虫,但是对于访问量等博客数据却有着反爬虫机制,可以防止用户通过爬虫来恶意刷访问量,所以那些想通过爬虫来刷访问量的同学可以洗洗睡了。