崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。
曾经有大神告诫说:没事别瞎写文章;所以,很认真的写的是能力范围内的,看客要是看不懂,不是你的问题,问题在我,得持续输入,再输出。
今天的主题是:实战爬取. (涉及python文件操作,requests,BeautifulSoup,结构化数据)
序号 | 内容 | 解释 |
---|---|---|
01 | 内容介绍 | -- |
02 | 分解如何操作 | -- |
03 | 参考及介绍 | -- |
url = http://xlzd.me/
昨天在学习基于github搭建博客的时候,无意间查看到这个人的博客,里面也有好些python和爬虫知识。xlzd杂谈
进一步发现是个罗粉。
你懂的。
先总结下爬虫的大概步骤是什么:
http://xlzd.me/
查看网页翻页:
002.png
网页源代码:
003.png
得出网页的组成特征:给出两种自己构造url的方法
# 方法1:
def search_url_one(self):
self.all_url = ["http://xlzd.me/page/{}/".format(i) for i in range(1, 8)]
return self.all_url
pass
# 方法2:
def search_url_two(self):
for one in range(1, 8):
url = "http://xlzd.me/page/" + str(one) + '/'
self.all_url.append(url)
return self.all_url
当然也可以自己在网页中匹配,每抓取一页,把下一页的url抓取出来,总共7页,抓最后一页进行判断,说明这是最后一页。
004.png
all_title = Soup.find_all(class_="post-title")
all_abstract = Soup.find_all(class_="post-content")
# 上面已经把所需要的目标都容纳下来了。
# 具体的url 和标题 的匹配规则是:
for one_title in all_title:
one_title.a.get('href')) # 获取 一个url
one_title.get_text() # 获取 一个title
# 具体的摘要匹配规则是:
for one_abstract in all_abstract:
one_abstract.get_text() #获取一个abstract
具体方法参考BeautifulSoup文档
大概的任务已经完成了。 一页中有8篇文章,一共有7页。 循环操作就可以实现抓取任务了。
001.png
全部抓取的时候发现有些标题不规则会出错。所以进行了简化操作。 第一篇:1.txt 依次类推到最后一篇。
005.png
# 文本写入总会出现编码问题,注意下。
def save(self, passage):
global name
for one in range(len(passage)):
with codecs.open("Blog\\" + str(name) + ".txt", 'wb', encoding='utf-8') as f:
f.write(passage[one]["url"])
f.write("\n")
f.write(passage[one]["title"])
f.write("\n")
f.write(passage[one]["abstract"])
f.write("\n")
name +=1
具体一篇的显示如下:
006.png
结果:7页网页,1页8篇文章,最后一页只有1篇文章。
007.png
全部抓取完成。
获取到的全部文章的url还可以进行分析,比如如何把每篇文章的内容都抓取下来。
代码还可以进行重构。 你懂的。
大致流程走下来。爬虫的整体思路应该明朗了。
完整代码:完整代码
关于本人: 国内小硕,半路出家的IT学习者。 兴趣领域:爬虫 , 数据科学 本人正在构建一个共同成长爬虫小型社群。有兴趣私信 答疑及分享。