前言
其实这个爬虫程序已经写好大半年了,中途有做过一些修改,现在觉得有必要记录一下过程。
说到爬虫,大多为了批量爬取各种信息,但我写这个爬虫的初衷倒不是为了妹子图片(虽然真的下载了不少妹子图片⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄,更多是为了练习 Python 算法和常用库,顺带还了解了 HTTP 请求的一些细节。
工具介绍
- Requests :用来发送 HTTP 请求,获取 HTTP 响应
- Beautiful Soup :从获取到的 HTML 文件中提取数据
- Chrome开发者工具:查看 HTTP 通信过程,读取 HTML 源码
爬虫程序分析
本爬虫程序的目标是爬取妹子图(www.meizitu.com)网站上的妹子图片,并按标题分类保存到本地计算机
GitHub 项目地址:
爬取结果
爬虫代码:
程序包含直接下载图片到本地的版本和保存图片链接到 SQLite 数据库的版本,后者已经使用面向对象的编程方法重写,重写后结构更加清晰,可以点击上面的项目地址查看。
重写后:
|
|
meizitu.py 分为 5个函数
- collect_url()
- collect_picture_link()
- create_directory()
- download_picture()
- run()
collect_url()
根据妹子图网站页面的 URL 规律,设置需要爬取的起止 URL,最后返回需要将要爬取的 URL 列表
|
|
collect_picture_link()
使用 Beautiful Soup 的
find_all方法搜索 HTML 文档树,返回图片的 URL 列表
|
|
create_directory()
创建以网页标题为名称的文件夹来存放图片
|
|
download_picture()
将图片保存到以网页标题为名称的文件夹
|
|
run()
程序的主函数。
使用 Requests 库的
get方法发送请求,并用 BeautifulSoup 库和解析器解析网页的响应。
|
|
保存到 SQLite
对于练习 Python 算法来说,其实没有必要真正把图片下载下来,毕竟下载图片比较费时间。倒是可以先把图片的 URL 等信息保存到数据库,将来可以用多线程下载。
将
create_directory()函数替换为database(),去掉download_picture()函数即可。
database()
将网页 URL、网页标题、图片 URL 保存到 SQLite 数据库
|
|
To Do
- 多线程爬取网页、多线程下载图片(加快下载速度)
- 加入 gzip 压缩格式支持(加快下载速度)
- 增加代理 IP 地址池(防止 IP 被禁用)