概述


在上一篇文章《爬虫学习之一个简单的网络爬虫》中我们对爬虫的概念有了一个初步的认识,并且通过Python的一些第三方库很方便的提取了我们想要的内容,但是通常面对工作当作复杂的需求,如果都按照那样的方式来处理效率非常的低,这通常需要你自己去定义并实现很多非常基础的爬虫框架上的功能,或者需要组合很多Python第三方库来做。不过不用担心,Python中有很多非常优秀的爬虫框架,比如我们接下来要学习到的Scrapy。Scrapy官方有很经典的入门文档说明,这一篇仅仅是通过一个简单的实例来了解Scrapy这个库是如何来进行网络内容提取的,更深入的学习请阅读Scrapy官方文档

建立目标


同样在做任何事情之前都需要明确目标,那这次我们的目标是爬取一些技术性的文章并存储到数据库中。这就需要有目标网址和数据库结构,数据库我们选择使用MySql,目标网站我们找了一个叫脚本之家的内容站。我们这里首先准备好一张用于存储文章的表结构:

CREATE TABLE `articles` (
`id` mediumint(8) AUTO_INCREMENT NOT NULL,
`title` varchar(255) DEFAULT NULL,
`content` longtext,
`add_date` int(11) DEFAULT 0,
`hits` int(11) DEFAULT '0',
`origin` varchar(500) DEFAULT '',
`tags` varchar(45) DEFAULT '',
PRIMARY KEY (`id`),
KEY `add_date` (`add_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

分析目标结构

这里我们首先需要爬取得入口是“网络编程”这个节点,主入口网址为(http://www.jb51.net/list/index_1.htm) 打开这个网站我们通过Chrome或者其他浏览器的查看元素来分析当前页面的HTML语义结构,如下图所示:

从图中红色框线的部分可以看出,这里是我们需要在“网络编程”这个节点下需要提取的所有文章的主分类入口,通过这些入口可以进去到不同文章分类的列表中。所以根据初步结构分析,我们得出本次爬虫的爬取路线为:

从主入口进去 -> 提取当前入口中的所有分类 -> 通过分类入口进入到分类列表 -> 通过列表进入到文章页

分类入口确定了接下来看看我们的分类列表,随意点开一个分类入口,打开列表如下图所示:

这里我框出了两个主要部分,第一个是文章的标题,第二个是分页,文章对应的URL就是我们接下来需要爬取文章内容的入口,这里需要注意的是分页的处理,通过分页的最后一页我们可以知道当前这类列表共有多少页文章。结合以上分析我们基本确定了本次爬虫的各个路线入口,接下来我们就开始通过程序来实现本次的目标。

实现爬虫


在实现爬虫之前我们通过一张图来对Scrapy有个基本的认识,为了保持本章内容的简洁性,我们这里暂时不会讨论Item Pipeline部分,Scrapy架构图如下所示(图片来自网络):

从图中可以很清晰的看到Scrapy所包含的几大块,下面我们通过代码来演示我们所用到的基础功能部分。

主要依赖第三方库:

web.py web框架,这里只用到了database部分,将来会用来进行内容展示

scrapy 爬虫框架,这里只用到了最基本的内容提取

这里还会用到一些xpath相关知识,请自行Google了解xpath语法

# -*- coding:utf-8 -*-
'''by sudo rm -rf http://imchenkun.com'''
import scrapy
from scrapy.http import Request
import web
import time db = web.database(dbn='mysql', host='127.0.0.1', db='imchenkun', user='root', pw='root') # 允许的站点域
allow_domain = "jb51.net" base_url = "http://www.jb51.net" # 列表页
list_url = "http://www.jb51.net/list/list_%d_%d.htm" # 列表分页
list_page = 1 # 文章页
crawl_url = "http://www.jb51.net/article/%d.htm" class JB51Spider(scrapy.Spider):
name = "jb51"
start_urls = [
"http://www.jb51.net/list/index_1.htm"
] cate_list = [] def parse(self, response):
cate_id = response.selector.xpath('//div[@class="index_bor clearfix"]/div[@class="index_con"]/span/a/@href').re('(\\\\d+)')[::2]
for id in cate_id:
cate_url = list_url % (int(id), 1)
yield Request(cate_url, callback=self.parse_page) def parse_page(self, response):
_params = response.selector.xpath('//div[@class="dxypage clearfix"]/a[last()]/@href').re('(\\\\d+)')
cate_id = int(_params[0]) # 分类编号
count = int(_params[1]) # 总页数 article_urls = response.selector.xpath('//div[@class="artlist clearfix"]/dl/dt/a/@href').extract()
# 处理第一页
for article_url in article_urls:
yield Request(base_url + article_url, callback=self.parse_article) # 处理其他页
for page in range(1, count):
url = (list_url % (cate_id, page + 1))
yield Request(url, callback=self.parse_list) def parse_list(self, response):
"""解析文章列表"""
article_urls = response.selector.xpath('//div[@class="artlist clearfix"]/dl/dt/a/@href').extract()
for article_url in article_urls:
yield Request(base_url + article_url, callback=self.parse_article) def parse_article(self, response):
"""解析文章内容"""
title = response.selector.xpath('//div[@class="title"]/h1/text()').extract()[0]
content = response.selector.xpath('//div[@id="content"]').extract()[0]
tags = ','.join(response.selector.xpath('//div[@class="tags mt10"]/a/text()').extract()) results = db.query('select count(0) as total from articles where origin=$origin', vars = { 'origin': response.url })
if results[0].total <= 0:
db.insert('articles',
title=title,
origin=response.url,
content=content,
add_date=int(time.time()),
hits=0,
tags=tags
)

安装Scrapy后以上代码通过以下命令执行:

scrapy runspider jb51_spider.py

本次运行后的效果在数据库中可以见如下图所示:

Github地址

总结


本篇文章我们主要了解了基本的Scrapy Spider部分,而且通过对目标网站的结构分析使用xpath进行内容的提取,以及分页的处理。这里我们的目的是建立一种写爬虫的思路,而不在于怎么使用工具来爬数据。首先确定目标,然后分析目标,再借助现有工具进行内容提取,提取内容的过程中会遇到各种问题,这个时候我们再来逐个解决这些问题,直到我们的爬虫能够无障碍的运行。接下来我会使用Scrapy更多的功能将继续探索Item的定义,Pipeline的实现以及如何使用代理。

特别申明:本文所提到的脚本之家网站只是拿来进行爬虫的技术交流学习,读者涉及到的所有侵权问题都与本人无关,也希望大家在学习实战的过程中不要大量的爬取内容对服务器造成负担

本文首发在sudo rm -rf 转载请注明原作者

爬虫学习之基于Scrapy的网络爬虫的更多相关文章

  1. 爬虫学习之基于Scrapy的爬虫自动登录

    ###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...

  2. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    TP5_Splider 一个基于Thinkphp5+phpQuery 网络爬虫抓取数据接口 统一输出接口数据api.适合正在学习Vue,AngularJs框架学习 开发demo,需要接口并保证接口不跨 ...

  3. 【java爬虫】---爬虫+基于接口的网络爬虫

    爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网站 ...

  4. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码

    随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...

  5. 基于scrapy框架的爬虫

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

  6. 基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

    原文地址http://blog.csdn.net/qy20115549/article/details/52203722 本文为原创博客,仅供技术学习使用.未经允许,禁止将其复制下来上传到百度文库等平 ...

  7. 从0到1学习node之简易的网络爬虫

    本文地址: http://www.xiabingbao.com/node/2017/01/19/node-spider.html 我们这节的目标是学习完本节课程后,能进行网页简单的分析与抓取,对抓取到 ...

  8. Scrapy (网络爬虫框架)入门

    一.Scrapy 简介: Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,Scrapy 使用了 Twisted['twɪstɪd](其主要对手是Tornado) ...

  9. 基于HttpClient实现网络爬虫~以百度新闻为例

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/40891791 基于HttpClient4.5实现网络爬虫请訪问这里:http:/ ...

随机推荐

  1. 用VB操作Excel的方法

    VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报 ...

  2. [辛酸历程]在Mac中使用Python获取屏幕截图

    一.起因 最近想做个小外挂玩玩,技术倒是不难,就是通过图片匹配加上一些判断方法来刷分.但是在最不起眼(却最容易出问题)的准备阶段卡住了. 为什么卡住了呢,简单说,因为我需要获取截屏的数据,所以就要找一 ...

  3. PL/SQL developer 使用技巧汇总

    为了快速的使用PL/SQL developer 进行 oracle数据库相关开发,将一些使用频率较高的使用技巧进行汇总如下,以下转自网络和自己的测试 1.切换schema --switch schem ...

  4. 物理CPU、物理核跟逻辑核的区分

    一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术 ,所以您的电脑是双核的. 一 概念① 物理CPU 实际Server中插槽上的CPU个数 ...

  5. 【Irrlicht鬼火引擎】掌握引擎使用流程,入门程序HelloWorld

    分析 一.简述使用步骤 一般而言,对于一个简单的程序,Irrlicht引擎的一般使用步骤如下: 预处理:(1)包含 <irrlicht.h> 头文件#include <irrlich ...

  6. 回溯(UVA129)

    POINT: 如何判断是否包含连续重复子串? 判断 当前串 的 后缀 啦~~~ You have been employed by the organisers of a Super Krypton ...

  7. unity3d首次倒入工程文件出错Opening file Library/FailedAssetImports.txt failed解决方法

    打开unity3d,首次倒入工程到unity编辑器,但是频繁弹出“Opening file Library/FailedAssetImports.txt failed”的错误对话框,很麻烦. 解决方法 ...

  8. Entity Framework 6.1-Code First

    原文:Entity Framework 6.1-Code First Code First-代码优先,先创建好领域模型.新建MyDbContext继承DbContext.根据代码自动生成数据库 Cod ...

  9. jQuery 自定义事件的学习笔记

    jquery中提供了两种方法可以绑定自定义事件: bind()和one()而绑定的自定义事件的触发,必须得用jquery中的trigger()方法才能触发. 我们先来看on事件  代码如下 复制代码 ...

  10. C# 微信扫码支付 回调页面

    .NET版 微信扫码支付,官方推荐使用[模式二] 一.微信扫码支付模式一: 1.回调页面:官方demo中example文件下的NativeNotifyPage.aspx 2.微信回调地址:http:/ ...