专栏名称: python
隔天更新python文章,我希望用我的努力换来劳动的成果帮助更多的人掌握一门技术,因此我要更加努力。
目录
相关文章推荐
Python爱好者社区  ·  DeepSeek下棋靠忽悠赢了ChatGPT ... ·  3 天前  
Python爱好者社区  ·  太强了!35个python案例.pdf ·  2 天前  
Python爱好者社区  ·  DeepSeek上线国家超算平台!671B满 ... ·  2 天前  
Python中文社区  ·  用 DeepSeek 快速打造自己的 AI ... ·  2 天前  
逆行的狗  ·  碎片时间刷CIA题-Anki牌组 ·  2 天前  
逆行的狗  ·  碎片时间刷CIA题-Anki牌组 ·  2 天前  
51好读  ›  专栏  ›  python

如果十年前拥有这些技术,你可能比马云还要富:python3开发网络爬虫(二)

python  · 公众号  · Python  · 2017-07-28 00:23

正文

第一章,你学会了吗? 由此进

  1. 用伪代码写出爬虫的主要框架;

  2. 用Python的urllib.request库抓取指定url的页面;

  3. 用Python的urllib.parse库对普通字符串转符合url的字符串.

这一章, 开始用Python将伪代码中的所有部分实现. 由于部分”零基础”读者, 因此会先把用到的两种数据结构 队列 集合 介绍一下. 而对于” 正则表达式 “部分, 之后会更新。在文章开始之前;介绍下小编的 Python学习交流   643692991   群内每天更新相关资料

Python的队列

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

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

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

Python的集合

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

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

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

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

Python的正则表达式

在爬虫程序中, 爬回来的数据是一个字符串, 字符串的内容是页面的html代码. 我们要从字符串中, 提取出页面提到过的所有url. 这就要求爬虫程序要有简单的字符串处理能力, 而正则表达式可以很轻松的完成这一任务.
虽然正则表达式功能异常强大, 很多实际上用的规则也非常巧妙, 真正熟练正则表达式需要比较长的实践锻炼. 不过我们只需要掌握如何使用正则表达式在一个字符串中, 把所有的url都找出来, 就可以了. 如果实在想要跳过这一部分, 可以在网上找到很多现成的匹配url的表达式, 拿来用即可.

Python网络爬虫Ver 1.0 alpha

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

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







请到「今天看啥」查看全文