专栏:006:实战爬取博客

系列爬虫专栏

崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。

曾经有大神告诫说:没事别瞎写文章;所以,很认真的写的是能力范围内的,看客要是看不懂,不是你的问题,问题在我,得持续输入,再输出。

今天的主题是:实战爬取. (涉及python文件操作,requests,BeautifulSoup,结构化数据)


1:框架

序号

内容

解释

01

内容介绍

--

02

分解如何操作

--

03

参考及介绍

--

2:内容介绍

  • 目标 抓取目标网站的全部博文: 01: 博文的链接 02: 博文的标题 03: 博文的摘要
  • 由来

url = http://xlzd.me/ 昨天在学习基于github搭建博客的时候,无意间查看到这个人的博客,里面也有好些python和爬虫知识。xlzd杂谈 进一步发现是个罗粉。 你懂的。

  • 时间花销 一般写一篇专栏,需要花费80min,今天又是放假时间,所以效率不高,光从零开始写代码就花了60min。水平还是不够。 原则上,基本的爬虫知识已经快属于我的舒适区。最近持续的专栏写作,一系列的总结,意味着,写出的多,输入的少,甚至写完这个系列,会写不出像样的其他专栏... 但我的理念是:持续精进。 所以,会尽快写完这个系列,进行输入数据科学知识。

3:步骤分解

先总结下爬虫的大概步骤是什么:

  1. 获取url : 不管是自己构造的符合要求的url还是抓取的url.
  2. 下载网页源代码:requests 或者 urllib模块
  3. 对网页源代码进行解析:re, BeautifulSoup系列,xpath系列等
  4. 结构化数据,存储:本地,数据等
  • 原始:url 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页,抓最后一页进行判断,说明这是最后一页。

  • 对第一页分析抓取的目标: 文章的url 文章的标题 文章的摘要 网页源代码显示:

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页。 循环操作就可以实现抓取任务了。

  • 写入文本操作 具体要求是每篇文章的url,title,abstract 写入一个文本中。 刚开始我的想法是把title当做 文本的名称: 如下显示:

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还可以进行分析,比如如何把每篇文章的内容都抓取下来。

代码还可以进行重构。 你懂的。

4:参考及总结

大致流程走下来。爬虫的整体思路应该明朗了。

完整代码:完整代码

专栏地址

关于本人: 国内小硕,半路出家的IT学习者。 兴趣领域:爬虫 , 数据科学 本人正在构建一个共同成长爬虫小型社群。有兴趣私信 答疑及分享。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java 性能优化的五大技巧

要对你的 java 代码进行优化,需要理解 java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的。使用下面这五个技巧和资源,开始学习如何...

973
来自专栏吉浦迅科技

DAY47:阅读read only cache和Time Function

The read-only data cache load function is only supported by devices of compute c...

701
来自专栏奇点大数据

python需要系统学习一下

1、python是脚本语言,作为程序员我觉得至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效率。

1282
来自专栏PHP在线

PHP中的防御性编程

菲纳格动态逆定律: 会出错的,终将会出错 —- 在最糟糕的时刻。 防御性编程是什么意思 防御性编程,简单的说,就是在编程的时候有目的地预测可能的故障点。目的是...

2936
来自专栏张善友的专栏

CAP理论十二年回顾:"规则"变了

CAP理论断言任何基于网络的数据共享系统,最多只能满足数据一致性、可用性、分区容忍性三要素中的两个要素。但是通过显式处理分区情形,系统设计师可以做到优化数据一致...

2739
来自专栏AI研习社

如何在 Kaggle 中高效搜索数据集?快吃下这枚安利

对于关注数据科学的同学来说,Kaggle 上庞大的数据集是一个极好的资源池,但是这么多的数据,如何进行更精准的搜索?近日,Kaggle 官方博客就刊登了 Rac...

2824
来自专栏Python数据科学

你知道Jupyter notebook还可以用来做 “视频聊天室” 吗?

Ipywidgets在Jupyter生态系统中扮演着重要角色,它带来了用户和数据之间的互动。小工具组件是多种的Python对象,通常在Jupyter Noteb...

1101
来自专栏腾讯移动品质中心TMQ的专栏

测试建模兵器谱

0.引子 有人的地方就有江湖,有测试的地方就有建模。 每个产品都是一片江湖,每一次迭代就是一场武林大会,而一个个的需求,就是一封封战书。 测试同学在面对复杂的...

2836
来自专栏数据和云

Oracle Database 18c 的10大新特性一览

在 2017 Oracle OpenWorld大会上,关于 Oracle 18c 的一系列新特性已经被披露出来,借助分散在各个会场的公开分享主题和内容、OOW提...

54711
来自专栏ATYUN订阅号

【学术】厉害了我的哥,国外技术大咖仿造了谷歌的Arts &Culture,找到古代的“你”

当我激动的室友第一次向我展示肖像搜索功能时,我对结果感到很惊讶(也觉得有点受侮辱)。对于那些不熟悉它的人来说,谷歌Arts & Culture的这一功能让你可以...

3474

扫码关注云+社区