前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫入门 --打造网站自生成系统(一)

爬虫入门 --打造网站自生成系统(一)

作者头像
Criss@陈磊
发布2019-12-05 14:59:11
5280
发布2019-12-05 14:59:11
举报
文章被收录于专栏:测试技术圈测试技术圈

iTesting,爱测试,爱分享

爬虫其实不算是新的东西了, 网上也有很多的教程,都很详尽,那么我为什么还要拿出来说呢?因为我发现大多数教材都是教你如何从网络上爬取内容,然后就结束了。但是我们爬下来的内容是要使用的啊? 这方面的就很少。还记得我之前分享过的博客开发系列吗?正好,我们把这两个结合起来,一起来看看,如何用爬虫打造专属自己的自动化博客生成系统。

本系列分为如下模块: 1.介绍爬虫框架scrapy的原理,及简单使用。 2.自动分析爬取的文章,分类并转化格式为适合博客的markdown格式。 3.自动发布博客,并介绍如何绑定域名。 4.每天躺在床上看自己的博客“更新”。

今天我们先看第一个, 爬虫框架Scrapy。

首先,爬虫是什么呢?爬虫的原理是什么?

爬虫是一个程序,用来获取网站的信息。爬虫的原理一般是根据一定的分析算法找出用户想要的URL,放到一个队列里,然后按照一定的策略选择进一步要抓取的URL,直到满足停止条件。然后对所有抓取的网页进行分析,过滤,存储并建立索引,方便后续查询,检索。

什么是scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

scrapy原理 (此部分为官网文档,及网络摘抄)

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下(绿线是数据流向):

部分详细说明如下:

一此完整的运行流程如下:

如何安装

代码语言:javascript
复制

入门教程(官网摘取架构各部分作用,个人提供练习)

创建项目

在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:

代码语言:javascript
复制
代码语言:javascript
复制

定义Item

Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。

类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。(如果不了解ORM, 不用担心,您会发现这个步骤非常简单)

首先根据需要从dmoz.org获取到的数据对item进行建模。我们需要从dmoz中获取名字,url,以及网站的描述。对此,在item中定义相应的字段。编辑 _myspider 目录中的 items.py 文件:

代码语言:javascript
复制

一开始这看起来可能有点复杂,但是通过定义item, 您可以很方便的使用Scrapy的其他方法。而这些方法需要知道您的item的定义。

编写第一个爬虫(Spider)

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

为了创建一个Spider,您必须继承 scrapy.Spider 类, 且定义以下三个属性: name: 用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。 start_urls: 包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。 parse() 是spider的一个方法。被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

以下为我们的第一个Spider代码,保存在 _myspider/spiders 目录下的 mine.py 文件中: 我们要从10tiao.com这个网站爬取首页上的所有公号文章,并按照如下方式保存

代码语言:javascript
复制

start_requests 这个请求接收需要爬取的第一个页面,然后交给parse()处理,

代码语言:javascript
复制

注意: Request中meta参数的作用是传递信息给下一个函数,使用过程可以理解成:把需要传递的信息赋值给这个叫meta的变量,但meta只接受字典类型的赋值,因此要把待传递的信息改成“字典”的形式,即:meta={‘key1’:value1,’key2’:value2}

如果想在下一个函数中取出value1,只需得到上一个函数的meta[‘key1’]即可,因为meta是随着Request产生时传递的,下一个函数得到的Response对象中就会有meta,即response.meta,取value1则是value1=response.meta[‘key1’]

存储结果(Pipeline)

Item pipeline 的主要责任是负责处理 spider 抽取的 Item,主要任务是清理、验证和持久化数据。当页面被 spider 解析后,将被发送到 pipeline,每个 pipeline 的组件都是由一个简单的方法组成的Python类。pipeline 获取Item,执行相应的方法,并确定是否需要在 pipeline中继续执行下一步或是直接丢弃掉不处理。

代码语言:javascript
复制

激活Item Pipeline组件

在settings.py文件中,往ITEM_PIPELINES中添加项目管道的类名,激活项目管道组件

代码语言:javascript
复制

运行爬虫

代码语言:javascript
复制

写在最后

  1. 看下我们的运行结果, result.json节选:
  2. 是不是很简单?确实简单, 爬虫的爬取,收集信息比较直观,但是爬虫最重要的的问题就是经常被ban,至于如何解决,目前没有一劳永逸的方法,读者朋友们可以网络上搜索解决。
  3. 本文未涉及登录问题有些网站需要登录获取authentication token后才能继续爬取(我比较喜欢这个,方便控制), 有两个办法,一个是用requests直接发请求获取后保存使用。第二scrapy貌似提供了登录的方法,这个我还没有研究, 大家可以自行研究。

文末惯例放赞赏码:)

时人莫小池中水, 浅处不妨有卧龙

作者: Kevin Cai, 江湖人称蔡老师。 两性情感专家,非著名测试开发。 技术路线的坚定支持者,始终相信Nobody can be somebody。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 质问 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先,爬虫是什么呢?爬虫的原理是什么?
  • 什么是scrapy
  • scrapy原理 (此部分为官网文档,及网络摘抄)
  • 入门教程(官网摘取架构各部分作用,个人提供练习)
  • 创建项目
  • 定义Item
  • 编写第一个爬虫(Spider)
  • 存储结果(Pipeline)
  • 激活Item Pipeline组件
  • 运行爬虫
  • 写在最后
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档