零基础自学Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha

上一回, 我学会了

  1. 用伪代码写出爬虫的主要框架;
  2. 用Python的urllib.request库抓取指定url的页面;
  3. 用Python的urllib.parse库对普通字符串转符合url的字符串.

这一回, 开始用Python将伪代码中的所有部分实现. 由于文章的标题就是”零基础”, 因此会先把用到的两种数据结构队列集合介绍一下. 而对于”正则表达式“部分, 限于篇幅不能介绍, 但给出我比较喜欢的几个参考资料.

Python的队列

在爬虫程序中, 用到了广度优先搜索(BFS)算法. 这个算法用到的数据结构就是队列.

Python的List功能已经足够完成队列的功能, 可以用 append() 来向队尾添加元素, 可以用类似数组的方式来获取队首元素, 可以用 pop(0) 来弹出队首元素. 但是List用来完成队列功能其实是低效率的, 因为List在队首使用 pop(0) 和 insert() 都是效率比较低的, Python官方建议使用collection.deque来高效的完成队列任务.

Python

1

2

3

4

5

6

7

8

9

10

from collections import deque

queue = deque(["Eric", "John", "Michael"])

queue.append("Terry")           # Terry 入队

queue.append("Graham")          # Graham 入队

queue.popleft()                 # 队首元素出队

#输出: ‘Eric‘

queue.popleft()                 # 队首元素出队

#输出: ‘John‘

queue                           # 队列中剩下的元素

#输出: deque([‘Michael‘, ‘Terry‘, ‘Graham‘])

(以上例子引用自官方文档)

Python的集合

在爬虫程序中, 为了不重复爬那些已经爬过的网站, 我们需要把爬过的页面的url放进集合中, 在每一次要爬某一个url之前, 先看看集合里面是否已经存在. 如果已经存在, 我们就跳过这个url; 如果不存在, 我们先把url放入集合中, 然后再去爬这个页面.

Python提供了set这种数据结构. set是一种无序的, 不包含重复元素的结构. 一般用来测试是否已经包含了某元素, 或者用来对众多元素们去重. 与数学中的集合论同样, 他支持的运算有交, 并, 差, 对称差.

创建一个set可以用 set() 函数或者花括号 {} . 但是创建一个空集是不能使用一个花括号的, 只能用 set() 函数. 因为一个空的花括号创建的是一个字典数据结构. 以下同样是Python官网提供的示例.

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

>>> basket = {‘apple‘, ‘orange‘, ‘apple‘, ‘pear‘, ‘orange‘, ‘banana‘}

>>> print(basket)                      # 这里演示的是去重功能

{‘orange‘, ‘banana‘, ‘pear‘, ‘apple‘}

>>> ‘orange‘ in basket                 # 快速判断元素是否在集合内

True

>>> ‘crabgrass‘ in basket

False

>>> # 下面展示两个集合间的运算.

...

>>> a = set(‘abracadabra‘)

>>> b = set(‘alacazam‘)

>>> a

{‘a‘, ‘r‘, ‘b‘, ‘c‘, ‘d‘}

>>> a - b                              # 集合a中包含元素

{‘r‘, ‘d‘, ‘b‘}

>>> a | b                              # 集合a或b中包含的所有元素

{‘a‘, ‘c‘, ‘r‘, ‘d‘, ‘b‘, ‘m‘, ‘z‘, ‘l‘}

>>> a & b                              # 集合a和b中都包含了的元素

{‘a‘, ‘c‘}

>>> a ^ b                              # 不同时包含于a和b的元素

{‘r‘, ‘d‘, ‘b‘, ‘m‘, ‘z‘, ‘l‘}

其实我们只是用到其中的快速判断元素是否在集合内的功能, 以及集合的并运算.

Python的正则表达式

在爬虫程序中, 爬回来的数据是一个字符串, 字符串的内容是页面的html代码. 我们要从字符串中, 提取出页面提到过的所有url. 这就要求爬虫程序要有简单的字符串处理能力, 而正则表达式可以很轻松的完成这一任务.

参考资料

虽然正则表达式功能异常强大, 很多实际上用的规则也非常巧妙, 真正熟练正则表达式需要比较长的实践锻炼. 不过我们只需要掌握如何使用正则表达式在一个字符串中, 把所有的url都找出来, 就可以了. 如果实在想要跳过这一部分, 可以在网上找到很多现成的匹配url的表达式, 拿来用即可.

Python网络爬虫Ver 1.0 alpha

有了以上铺垫, 终于可以开始写真正的爬虫了. 我选择的入口地址是Fenng叔的Startup News, 我想Fenng叔刚刚拿到7000万美金融资, 不会介意大家的爬虫去光临他家的小站吧. 这个爬虫虽然可以勉强运行起来, 但是由于缺乏异常处理, 只能爬些静态页面, 也不会分辨什么是静态什么是动态, 碰到什么情况应该跳过, 所以工作一会儿就要败下阵来.

Python

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

import re

import urllib.request

import urllib

from collections import deque

queue = deque()

visited = set()

url = ‘http://news.dbanotes.net‘  # 入口页面, 可以换成别的

queue.append(url)

cnt = 0

while queue:

url = queue.popleft()  # 队首元素出队

visited |= {url}  # 标记为已访问

print(‘已经抓取: ‘ + str(cnt) + ‘   正在抓取 <---  ‘ + url)

cnt += 1

urlop = urllib.request.urlopen(url)

if ‘html‘ not in urlop.getheader(‘Content-Type‘):

continue

# 避免程序异常中止, 用try..catch处理异常

try:

data = urlop.read().decode(‘utf-8‘)

except:

continue

# 正则表达式提取页面中所有队列, 并判断是否已经访问过, 然后加入待爬队列

linkre = re.compile(‘href=\"(.+?)\"‘)

for x in linkre.findall(data):

if ‘http‘ in x and x not in visited:

queue.append(x)

print(‘加入队列 --->  ‘ + x)

这个版本的爬虫使用的正则表达式是

Python

1

‘href=\"(.+?)\"‘

所以会把那些.ico或者.jpg的链接都爬下来. 这样read()了之后碰上decode(‘utf-8′)就要抛出异常. 因此我们用getheader()函数来获取抓取到的文件类型, 是html再继续分析其中的链接.

Python

1

2

if ‘html‘ not in urlop.getheader(‘Content-Type‘):

continue

但是即使是这样, 依然有些网站运行decode()会异常. 因此我们把decode()函数用try..catch语句包围住, 这样他就不会导致程序中止. 程序运行效果图如下:

时间: 2025-01-08 23:09:30

零基础自学Python 3开发网络爬虫(二): 用到的数据结构简介以及爬虫Ver1.0 alpha的相关文章

[零基础学python]集成开发环境(IDE)

当安装好python之后,其实就已经可以进行开发了.下面我们开始写第一行python代码. 值得纪念的时刻:Hello world 如果是用windows,请打开CMD,并执行python. 如果是UNIX类的,就运行shell,并执行python. 都会出现如下内容: Python 2.7.6 (default, Nov 13 2013, 19:24:16) [GCC 4.6.3] on linux2 Type "help", "copyright", "

零基础学习Python web开发、Python爬虫、Python数据分析,从基础到项目实战!

随着大数据和人工智能的发展,目前Python语言的上升趋势比较明显,而且由于Python语言简单易学,所以不少初学者往往也会选择Python作为入门语言. Python语言目前是IT行业内应用最为广泛的编程语言之一,尤其是近几年来随着大数据和人工智能(机器学习.自然语言处理.计算机视觉等)的发展,Python也得到了越来越广泛的应用,另外Python在Web开发.后端开发和嵌入式开发领域也有广泛的应用. 小编推荐一个学Python的学习裙,九三七六六七 五零九,无论你是大牛还是小白,是想转行还是

Python 3开发网络爬虫(四): 登录

原文出处: Jecvay Notes (@Jecvay) <零基础自学用Python 3开发网络爬虫(一)> <零基础自学用Python 3开发网络爬虫(二)> <零基础自学用Python 3开发网络爬虫(三)> 今天的工作很有意思, 我们用 Python 来登录网站, 用Cookies记录登录信息, 然后就可以抓取登录之后才能看到的信息. 今天我们拿知乎网来做示范. 为什么是知乎? 这个很难解释, 但是肯定的是知乎这么大这么成功的网站完全不用我来帮他打广告. 知乎网的

讨教大学:零基础自学编程,选JAVA,Python还是PHP?

越来越多非科班出身的人也义无反顾的投身到了IT互联网行业,加入了码农大军.但是对于非科班自学编程的朋友们来说,考虑的第一个问题一定是:我该从哪一个语言开始学起?在这里小编就为大家介绍一下零基础自学几大主流语言的优劣势. 首先从这几大语言的难度谈起,不同语言门槛和难度不同,Python<PHP<JavaScript<Java<C++.也就是说,Python是最好入门的一种语言,兼具易学性和趣味性,学几天就可以做出一些有意思的小功能出来.这也给了初学者学下去的信心和兴趣,不至于啃书几天

零基础写python爬虫之urllib2使用指南

零基础写python爬虫之urllib2使用指南 前面说到了urllib2的简单入门,下面整理了一部分urllib2的使用细节. 1.Proxy 的设置 urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy. 如果想在程序中明确控制 Proxy 而不受环境变量的影响,可以使用代理. 新建test14来实现一个简单的代理Demo: import urllib2   enable_proxy = True   proxy_handler = urllib2.Prox

Python服务器开发 -- 网络基础

Python服务器开发 -- 网络基础 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.... 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议. socket是对TCP/I

python零基础自学——前篇自白

首先声明,本人就是个菜鸟,小白一个,在这里记录我自学python时的点点滴滴,用于我的经验积累以及复习.当然,若有零基础自学的人看见,交流学习经验那就最好不过了. python其实对零基础的小白来说就再适合不过了,为什么这么说,个人对编程的理解就是高.大.上.总感觉都是些BT才可以玩这个的. 我自己创业,开公司有过好的时候,但最后都倒闭了,积累如此阅历,却回首发现,自己没有一项术语自己的专业既能.所以就想学习编程.跟专业朋友交流以后,都推荐我学习python.原因有以下几点: 一:简单. 因为是

小猿圈web前端开发讲师:零基础自学html5开发方法

web前端开发目前市场使用率随着需求逐年递增.越来越多的年轻人转行进入了web前端开发领取.html5强大的功能是有目共睹的,本属自身独特的优势让这一技术越来越受欢迎,相比于原生APP,html5已经逐渐在用户体验生无限接近,再加上低廉的开发成本和强大的适配功能,早已经可以俘获开发商和开发者的芳心,本文小猿圈web前端开发讲师介绍零基础如何自学html5开发? 小猿圈web前端开发讲师:零基础自学html5开发方法: 1.拒绝插件,遇到交互效果就选择扒插件,这是一种非常不可取的方法,在这种情况之

零基础学习Python需要用什么开发工具?

最近有不少读者私信我,这不刚开始学习Python就开始遇到难题了,对于Python IDE都比较纠结,希望找到一些适合自己的.Python开发工具.本篇给大家分享几款Python开发工具,供正在纠结用哪种开发工具的小伙伴们参考~ 对于学习Python的小伙伴,小编首推的Pycharm. 首先,PyCharm用于一般IDE具备的功能,比如, 调试.语法高亮.Project管理.代码跳转.智能提示.自动完成.单元测试.版本控制 另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持