1:任务步骤:抓取博客的(标题,简要内容,发布人,发布时间)
首先直接上手requests获取网站数据,发现可以直接获取。
因此不需要进行多余的反爬措施,只需要专注于数据的获取逻辑。
数据是直接放在源代码中的。
数据获取:观察页面源代码可知
数据都是存放在 ”<div class="post_item">“标签下,可以选择先获取某个博客的所有内容随后再进行信息的获取
数据的获取则是使用select函数,css选择器来获取信息
这里我定义了两个函数
其一是获取网页页面链接的函数
def return_url_list(page): """ 生成博客园博客url列表并返回 """ url_list = [] for i in range(1,page+1): url_list.append("https://www.cnblogs.com/cate/python/#p" + str(i)) # 将两个页数不同的url比较可以知道其不同点在于最后的一个数字,因此可以通过for循环构建链接
# 但其实我想到了一种更为节省空间的方法,即使用生成器,每生成一个就抓起一个 return url_list
其二是根据链接获取网页信息并输出的函数
def get_data(url,m): """ 获取博客园中python栏目下的200页数据 数据包括: 1:博客标题 2:博客简述 3:发布人 4:发布日期 5:阅读数量和评论数量 """ rsp = requests.get(url,headers={'user-agent':"chrome/10"}) rsp.encoding = rsp.apparent_encoding soup = bs(rsp.text) k = 0 for tag in soup.select("div.post_item_body"): print("博客标题:",tag.h3.text) print("博客链接:",tag.h3.a["href"]) for t in tag.select("div.post_item_foot"): t = t.get_text() l = t.split(" ") for i in l:# 这里主要是对div标签下的数据简单地获取了 i_list = i.split(" ") for i in i_list: if len(i) >= 2: print(i) k = k + 1 print("==============第 {} 个博客成功================".format((m-1)*20+k))
结果展示;
2:存在的缺陷
标签的获取没有充分的经验,总是使用落后的select来获取标签,一遇到比较少见的标签就不知所措,毫无头绪,这是需要改正的地方。
3:优点
表示我这次对代码进行了分门别类的优秀操作,因为我使用的是jupyter,所以我将需要导入模块的代码放在了第一个块,将第一个函数放在了第二块,将第二个函数放在了第三块,最后的主函数放在了第四块,这样编码之后我发现不仅思路更加清晰了,其美观程度也是上升了一大截,不再是一团糟的感觉了,我用起来也是舒服很多。
希望继续保持,加油加油。