阅读文本大概需要 10 分钟。

很多人说爬虫这门技术非常有趣,但不知道如何入门。其实爬虫入门非常简单,难的部分在于各大网站的反爬机制。当然对于一些简单的网站,还是非常容易爬取。

学习爬虫首先要明确你的驱动力,是想爬一些知乎的数据,还是一些电影的资源。驱动力非常重要,这决定你是否有足够的兴趣继续学下去。

很多人学习爬虫的第一驱动力就是爬取各大网站的妹子图片,比如比较有名的 mzitu。在爬这些网站的时候,即可以欣赏漂亮的妹子图,又能学习到技术,非常的 nice。

今天我就结合非常好用的 scrapy 框架,去抓取一些妹子图片,并把爬取的数据保存到 mongodb 数据库中。本次要爬取的网站是 360 的图片搜索网站,

地址:http://images.so.com/

360 图片的妹子质量还是非常可以的,我随意放几张大家感受下。

清纯可爱的

文艺又气质的

仙气十足的

非常的赏心悦目。

程序思路

本次程序运行的环境是 windows 10 + python 3.6,运行本次程序前首先确保你已经安装好了 scrapy、pymongo 以及 mongodb 数据库。

简单的分析了下 360 图片网站,并没有很强的反爬措施,并且网站的数据是以 Ajax 请求呈现。

我们进一步查看请求的详情,观察返回的数据结构。

返回的是 JSON 数据格式,其中 list 字段把图片的一些信息都保存在这里面。比如我们需要的图片地址信息 cover_imgurl。另外观察 Ajax 请求的参数信息,还有一个 sn 一直在变化,这个参数很明显就是偏移量。当 sn  为 30 时,返回的是前 30 张图片,依次类推,我们只需要改变 sn 的值就可以一直获取图片的信息。

接下来我们只需要通过 scrapy 高性能的框架,把网站上的图片保存到本地即可。

新建项目

首先在本地创建一个 scrapy 项目并命名为 images360。通过已下的命名即可创建。

scrapy startproject images360

随后就会有如下的项目结构

接下来就是在 spiders 目录下新建一个 Spider,命令如下:

scrapy genspider images images.so.com

这样我们的项目都已创建好,最后项目的结构如下。

程序代码

settings.py

在 settings.py 里面会先定义一个变量 MAX_PAGE,表示我们需要爬取的最大页面,比如在此次的程序中我们设置的是 50,也就是爬取 50 页,每页 30 张,一共 1500 张图片。

MAX_PAGE = 50

settings.py 文件中我们还设置一些数据库相关的配置信息。

MONGO_URI = 'localhost'
MONGO_DB = 'test'
IMAGES_STORE = './images'

并且需要注意的是我们要修改 settings.py 中的 ROBOTSTXT_OBEY 变量,将其设置为 False,否则无法抓取。

ROBOTSTXT_OBEY = False

start_requests()

这个函数用来构造最开始的请求,用来生成 50 次请求。

    def start_requests(self):data = {'ch': 'photogtaphy', 'listtype': 'new'}base_url = 'https://image.so.com/zj?0'for page in range(1, self.settings.get('MAX_PAGE') + 1):data['sn'] = page * 30params = urlencode(data)url = base_url + paramsyield Request(url, self.parse

提取信息

我们会在 items.py 文件中定义一个 Images360Item 类,用来定义我们的数据结构。

class Images360Item(Item):# define the fields for your item here like:# name = scrapy.Field()collection = table = 'images'id = Field()url = Field()title = Field()thumb = Field()

其中包括图片的 ID、链接、标题、缩略图。另外还有两个属性 collection 和 table,都定义为 images 字符串,代表 MongoDB 存储的 Collection 名称。

接下来我们提取 Spider 里有关信息,在 parse() 方法改写成如下所示:

    def parse(self, response):result = json.loads(response.text)for image in result.get('list'):item = Images360Item()item['id'] = image.get('imageid')item['url'] = image.get('qhimg_url')item['title'] = image.get('group_title')item['thumb'] = image.get('qhimg_thumb_url')yield item

这样我们就完成了信息的提取,接下来就需要把抓取的信息保存到 MongoDB 中。

MongoDB

首先确保你本地已经安装好了 MongoDB,并且已经正常启动。我们用一个 MongoPipeline 将信息保存到 MongoDB 中,在 pipelines.py 里添加如下类的实现:

class MongoPipeline(object):def __init__(self, mongo_uri, mongo_db):self.mongo_uri = mongo_uriself.mongo_db = mongo_db@classmethoddef from_crawler(cls, crawler):return cls(mongo_uri=crawler.settings.get('MONGO_URI'),mongo_db=crawler.settings.get('MONGO_DB'))def open_spider(self, spider):self.client = pymongo.MongoClient(self.mongo_uri)self.db = self.client[self.mongo_db]def process_item(self, item, spider):self.db[item.collection].insert(dict(item))return itemdef close_spider(self, spider):self.client.close()</pre>

Scrapy 提供了专门处理下载的 Pipeline,包括文件下载和图片下载。下载文件和图片的原理与抓取页面的原理一样,因此下载过程支持异步和多线程,下载十分高效。

我们首先在 settings.py 定义一个 IMAGES_STORE 变量,用来表示图片存储的路径。

IMAGES_STORE = './images'

内置的 ImagesPipeline 会默认读取 Item 的 image_urls 字段,并认为该字段是一个列表形式,它会遍历 Item 的 image_urls 字段,然后取出每个 URL 进行图片下载。

但是现在生成的 Item 的图片链接字段并不是 image_urls 字符表示的,也不是列表形式,而是单个的 URL。所以为了实现下载,我们需要重新定义下载的部分逻辑,即要自定义 ImagePipeline,继承内置的 ImagesPipeline,从而实现我们自己的图片下载逻辑。

class ImagePipeline(ImagesPipeline):def file_path(self, request, response=None, info=None):url = request.urlfile_name = url.split('/')[-1]return file_namedef item_completed(self, results, item, info):image_paths = [x['path'] for ok, x in results if ok]if not image_paths:raise DropItem('Image Downloaded Failed')return itemdef get_media_requests(self, item, info):yield Request(item['url'])

最后我们需要在 settings.py 中把我们定义好的 Item Pipeline 打开,修改 settings.py 中的 ITEM_PIPELINES 即可。

ITEM_PIPELINES = {'images360.pipelines.ImagePipeline': 300,'images360.pipelines.MongoPipeline': 301
}

最后我们只需要运行程序,即可执行爬取,程序运行命名如下:

scrapy crawl images

完整代码我已上传到微信公众号后台,在「痴海」公众号后台回复「360」即可获取。

本文首发于公众号「痴海」,后台回复「1024」即可获取最新编程资源。

比如这样的:史上最全 Python 学习资料,PDF 电子书大合集

Scrapy 实战之爬取妹子图相关推荐

  1. 爬取妹子图(python):爬虫(bs+rq)+ gevent多线程

    爬取妹子图(python):爬虫(bs+rq)+ gevent多线程 简介 我观察爬取妹子图算是爬虫专业户必做的事情之一,所以我也做了一个,结果是有3.45GB,49847张图. 打算依靠这个图库做个 ...

  2. python多线程爬取妹子图

    python多线程爬取妹子图 python使用版本: 3.7 目的: 自己选择下载目录,逐个将主题图片保存到选定目录下. 效果: 一秒钟左右下载一张图片,下了七八十组图片暂时没什么问题,不放心的话,可 ...

  3. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  4. python爬虫-爬妹子图_Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  5. python爬虫妹子图_Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. 公众号:[智能制造社区].欢迎关注,分享智能制造与编程那些事. 爬虫成果 当你运行代码后,文件夹就会 ...

  6. python3 scrapy实战:爬取拉勾网招聘数据至数据库(反爬虫)

    首先注明:感谢拉勾网提供的权威.质量的数据,本人抱着学习的态度,不愿增加其服务器负担,与dos攻击. 由于后面准备做一个大一点的数据分析项目,所以前提需要获取大量的有质量和权威的信息,其中一个获取点便 ...

  7. Python之Scrapy爬虫实战--爬取妹子图

    1.前言 反正闲着也是闲着,不如来学习啊! 2.关键代码 新建项目 不会的同学可参考我的另一篇博文,这里不再赘述:Python之Scrapy爬虫实战–新建scrapy项目 这里只讲一下几个关键点,完整 ...

  8. python3 + scrapy爬取妹子图(meizitu.com)

    前言 在学会scrapy之前,都是用requests + BeautifulSoup + lxml来爬取的,这样也能爬到想要的东西,但缺点是代码有些乱,可能需要自己对项目进行梳理归类.而scrapy框 ...

  9. Python爬虫 - scrapy - 爬取妹子图 Lv1

    0. 前言 这是一个利用python scrapy框架爬取网站图片的实例,本人也是在学习当中,在这做个记录,也希望能帮到需要的人.爬取妹子图的实例打算分成三部分来写,尝试完善实用性. 系统环境 Sys ...

最新文章

  1. python爬虫实例-python 爬虫实例
  2. 图解命令行http工具curl使用初步
  3. 解决Jsp与Java后台之间url传值中文乱码问题
  4. Web 版 VS Code (Visual Studio Online) 即将来临!
  5. wangeditor html编辑,Vue整合wangEditor富文本编辑器
  6. 卷积神经网络CNN(8)—— Pix2Pix Application -- Aerialmap Lane Line Detection (Pix2Pix应用:航拍图车道线检测)
  7. Spring容器创建流程(4)调用beanFactory后置处理器
  8. linux分布式文件存储挂载使用_Linux - tmpfs内存文件系统使用
  9. 使用Node.JS,如何将JSON文件读入(服务器)内存?
  10. 如何创建xsl文件 xml_EXCEL知识分享 I 连载如何快速创建XML文件
  11. Mysql基础之 ALTER命令
  12. [Scikit-learn教程] 03.02 文本处理:分类与优化
  13. RTI_DDS自定义插件开发 7 资源
  14. ORA-20001: APP-SQLAP-10000: ORA-28115: policy with check option violation occurred
  15. 幼儿编程Scratch第31讲:垃圾车-乐高入门机器人-WeDo
  16. 讨论BUCK、BOOST、BUCK-BOOST电路CCM模式下的设计参数计算
  17. drupal主题开发_佐治亚理工学院Drupal Web开发人员的首要考虑
  18. 用mysql设计学籍管理系统_学生学籍管理系统(SQL数据库系统设计)(完整版).pdf...
  19. C语言中的常用循环语句
  20. radosgw-admin命令详细参数

热门文章

  1. 睡眠多少分钟一个循环_快速眼动周期-睡眠循环
  2. ITM_SendChar
  3. Effective C++ 条款11_不止于此
  4. RabbitMQ-客户端源码之ChannelManager
  5. 实施工程师日常必备技能
  6. 用Python每天自动给女朋友免费发短信
  7. 如何捕获access violation异常
  8. [TsinsenA1490] osu!(乔明达)
  9. PowerApps入门——PowerApps的3种打开方式
  10. 关于SN74HC14PW