Python 萌新-10分钟学会爬虫

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

声明:文章著作权归作者所有,如有侵权,请联系小编删除

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180127A0C24Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券