Python 萌新 - 10分钟学会爬虫
python空白2018-01-27 14:07
Python 新手入门很多时候都会写个爬虫练手,本教程使用 Scrapy 框架,帮你简单快速实现爬虫,并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的,我的数据科学老师曾经说过,好算法不如好数据。
介绍
Scrapy ,Python 开发的一个快速、高层次的屏幕抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。文件结构清晰,即使是小白也能够快速上手,总之非常好用:joy:。
XPath ,它是一种用来查找 XML 文档中节点位置的语言。 XPath 基于 XML 的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。
MySQL 是一种关系数据库管理系统,它的优势:它是免费的。作者是下载了MAMP for Mac ,内嵌MySQL和Apache。首先通过 Scrapy 爬取到网页后, 通过 XPath 来定位指定元素,获取到你想要的数据,得到数据之后可以将数据存入数据库( MySQL )。简单了解之后就可以开始编写你的爬虫。
准备工作
安装 Scrapy(系统默认安装了 Python):
在当前目录新建工程
新建工程文件结构如下:
简单的爬虫主要使用了 spiders 、 items 、 pipelines
这三个文件:
spider :爬虫的主要逻辑。
items :爬虫的数据模型。
pipelines : 爬虫获取到的数据的加工工厂,可以进行数据筛选或保存。
数据模型:items
先看看我们要爬取的网站,这个是 Scrapy 官方 Demo 爬取数据用的网站,我们先用这个来练手。
分析网页的信息我们可以看到网页主体是一个列表,列表每一行都包含可一句引用、作者名字、标签等信息。作者名右边点击(about)可以看到作者的详细信息,包括介绍、出生年月日、地点等等。根据上面的数据,我们可以先创建如下数据模型:
items.py
所有的模型必须继承 scrapy.Item ,完成这一步我们就可以开始写爬虫的逻辑了。
爬虫:spider
既然是爬虫,自然需要去爬取网页,爬虫部分的几个要点:
引入你创建的数据模型
首先爬虫类要继承 scrapy.Spider 。
设置爬虫的名字 name ,启动爬虫时要用。
将你要爬取的网址放入 start_requests() ,作为爬虫的起点。
爬取的网页信息成功后,在的请求响应 parse() 中解析。
spiders/init.py在顶部引入创建的数据模型。
爬虫类, name ->爬虫名字, allowed_domains ->爬取网页的白名单。
在 start_requests() 中记录你要爬取的网址。
可以只放入一个网址,然后让爬虫自己爬取起始网址中下一页的链接。也可以在这里把所有需要爬的网址直接放入,比如说 page 一般是从1开始,并且有序的,写一个 for 循环可以直接输入所有页面的网址。
本文使用的是让爬虫自己去爬取下一页网址的方式,所以只写入了一个起始网址。
如下代码,爬取网页成功之后,我们要分析网页结构,找到我们需要的数据。
我们先来看XPath语法, //div[@class="col-md-8"]/div[@class="quote" :这是表示查找 class 为 "col-md-8" 的 div 节点下的一个子节点,并且子节点是一个 class 为 "quote" div 节点。如果在当前页面找到了这样一个节点,则返回节点信息,如果没有找到则返回 None 。
这段注释不是很详细,如果看不懂可能需要补一下相关知识。
爬取作者详细信息
成功获取作者详细信息 AuthorItem 后并且赋值给 QuoteItem 的属性author,这样一个完整的引述信息 QuoteItem 就组装完成了。
爬虫自己找到出路(下一页网页链接)
通过查看器我们可以找到 下一页 按钮元素,找到该节点并提取链接,爬虫即奔向下一个菜园。
爬虫的主要逻辑到这里就结束了,我们可以看到,一小段代码就可以实现一个简单的爬虫。一般主流网页都针对防爬虫做了一些处理,实操过程中也许并不会这么顺利,我们可能需要模仿浏览器的User-Agent,或者做访问延时防止请求过于频繁等等处理。
数据处理:pipelines
pipelines是 Scrapy 用来后续处理的管道,可以同时存在多个,并且可以自定义顺序执行,通常用来做数据处理和数据保存。我们需要在 settings.py 文件中设置需要需要执行的管道和执行顺序。
在这里我只使用了一个管道 ScrapySamplePipeline ,用来将数据保存到数据库当中,后面的数字 300 是表示该管道的优先级,数字越小优先级越高。
由于我们要保存数据到数据库,所以我们需要先在本地搭建起数据库服务,我这里用的是 MySQL ,如果没有搭建的小伙伴可以下个MAMP 免费版本,安装好傻瓜式操作一键启动 Apache 、 MySQL 服务。当然,数据库和表还是要自己建的。
我们可以在 __init__() 函数里做一些初始化工作,比如说连接数据库。
然后 process_item() 函数是管道处理事件的函数,我们要在这里将数据保存入数据库,我在这个函数里写了一些插入数据库操作。
close_spider() 函数是爬虫结束工作时候调用,我们可以在这里关闭数据库。
如果不需要保存数据库或者对数据处理的话,pipelines这部分是可以忽略的。这个时候在命令行切换到工程目录下,输入开始执行爬虫命令:
部分不保存到数据库的小伙伴可以使用下方命令,将爬取的数据以 Json 格式导出到该工程目录下。
最后贴上数据库数据成功录入的截图。
文章
声明
作者:xietao3
源自:https://juejin.im/post/5a65cc02f265da3e2a0db641
声明:文章著作权归作者所有,如有侵权,请联系小编删除
领取专属 10元无门槛券
私享最新 技术干货