不小心看到了龚肇智老先生对明清望族的考证,感觉内容质量很高,但新浪博客的搜索功能实在是太垃圾,故而把所有的博文都爬取下来,然后在本地搜索。
爬虫定位时需要用到bs4,如果没装的话需要装一下,注意别装错了
pip install beautifulsoup4
首先获取文章链接,新浪博客的博文目录页面安排的十分规整,所以直接生成一组目录url;而博客链接必以http://blog.sina.com.cn/s/blog 开头,故而用正则表达式定位。
import urllib.request as ur
from bs4 import BeautifulSoup
import re
urls = [f'http://blog.sina.com.cn/s/articlelist_2671649282_0_{i}.html' for i in range(206)]
links = []
for url in urls:
res = ur.urlopen(url)
bs = BeautifulSoup(res.read(),"html.parser")
tmpLinks = bs.find_all(name='a',attrs={"href":re.compile(r'^http://blog.sina.com.cn/s/blog')})
links += [L.get("href") for L in tmpLinks]
这样就得到了所有文章的链接,总共10300篇,老先生也够肝的。
>>> len(links)
10300
接下来获取所有文章的内容,其中,文章标题被放置在<title> 中,正文则在class="articleContent" 的div 里。在获取div 内容之后,做一点简单的处理,删除多余的空行。然后,将标题和内容存放在一个字典中,就算大功告成了。
由于需要读取一万多个网页,所以速度可能比较一般。但这些文字内容相对来说比较小,就算每次爬取的内容有5kB,那么所有内容的总和也不过50M,对于内存开支来说是小意思了。
blogs = {}
for L in links:
res = ur.urlopen(L)
bs = BeautifulSoup(res.read(),"html.parser")
title = bs.find('title').text.replace("_龚肇智_新浪博客","")
cmt = bs.find('div',class_='articalContent').text
cmt = cmt.replace("\xa0","")
while("\n \n" in cmt):
cmt = cmt.replace("\n \n","\n")
blogs[title] = cmt
|