前言
在学会scrapy
之前,都是用requests + BeautifulSoup + lxml
来爬取的,这样也能爬到想要的东西,但缺点是代码有些乱,可能需要自己对项目进行梳理归类。而scrapy
框架很好的解决了这个问题,它将爬虫的整个工序都分离开,各司其职,项目结构看起来很优雅。并且框架提供了很多非常实用的方法,不必再自己去单独写了,简直是良心。爬虫的乐趣在于爬取感兴趣的东西,下面将以爬取妹子图(meizitu.com)
来实践下。
了解网站,理清爬虫思路
进入妹子图,可以看到网站首页,中间有一条美女分类的标签,如图:
然后当点进某个分类之后,会得到很多分页,每个分页有很多图片专辑,点击每个专辑进去就会看到很多图片,这个图片就是我们需要的,那大致思路可以出来了,即:
- 通过首页 (
http://www.meizitu.com/
),爬取标签名称tag_name
和标签链接tag_href
- 通过标签链接,爬取当前标签下全部页面
page_list
- 通过页面,爬取当前页面的图片专辑名称
album_name
和图片专辑链接album_href
- 通过专辑链接,爬取该专辑里面所有图片名称
img_title
、图片链接img_src
及图片链接列表img_urls
- 通过图片链接,
ImagesPipeline
下载图片到设定的文件夹
通过以上思路,可以确定几点,
items
应该包含哪些?毫无疑问,
tag_name
tag_href
page_list
album_name
album_href
imgs
img_title
img_urls
就是需要定义的item
爬虫的入口是什么?
网站首页,即
http://www.meizitu.com/
爬虫应该分几层?
根据思路,我们前面 4 步,都是通过不同的链接爬取相关信息,那爬虫也相应的需要 4 层。
第一层,爬取标签链接:
parse_tag
第二层,爬取标签下页面链接:
parse_page
第三层,爬取页面下专辑链接:
parse_album
第四层,爬取专辑下图片链接:
parse_img
怎么保存图片?
scrapy
框架提供一个item pipeline
来保存图片,即ImagesPipeline
,我们只需要重写一个管道继承ImagesPipeline
,并且重写get_media_requests
(item, info) 和item_completed
(results, items, info) 这两个方法即可
代码实践
1、首先定义item
items.py
import scrapy
class MeizituItem(scrapy.Item):
# 标签名称
tag_name = scrapy.Field()
# 标签链接
tag_href = scrapy.Field()
# 进入某标签后的所有链接,加页码的
page_list = scrapy.Field()
# 图片专辑名称
album_name = scrapy.Field()
# 图片专辑链接
album_href = scrapy.Field()
# 照片标题
img_title = scrapy.Field()
# 照片链接
img_src = scrapy.Field()
# 照片链接集合,用于ImagesPipeline下载图片
img_urls = scrapy.Field()
2、完成提取数据代码
mzt.py