Python爬虫之Scrapy框架入门1

环境搭建

在开始搭建scrapy爬虫的开发环境之前,建议已经安装Anaconda这个python发行版本,这个可以让以后的开发过程中,安装其他的模块环境不至于出现一堆的错误。

假定你安装好了Anaconda,也配置好了相应的环境变量,这是你可以用以下的命令安装scrapy框架:

  1. 在终端执行下面这条命令

conda install Scrapy

下面是安装过程的截图,是不是很简单

安装scrapy

2.通过python的包安装和管理工具pip来安装

pip install Scrapy

这样,scrapy就安装完成了, 不管通过哪种方式,是不是都很简单!当然此处推荐使用第一种安装方式,什么??你就要用第二种,ok,ok,你用好了,体验一把安装python模块库错综复杂,藕断丝连,欲罢不能,让人蛋疼依赖关系(有多疼??疼到你怀疑你有一颗假的蛋,没错,一颗),也是一种人生的历练!!

环境安装好了以后,下面就可以开始我们想入非非,性奋不已的scrapy基础之路了。
作为流程,下面请允许我从scrapy的官网借(程序员的事情不叫偷的)一些话来凑个字数

项目创建

在开始爬取之前,您必须创建一个新的Scrapy项目(废话,请忽略)
怎么创建项目??对,没错,就是这样,打开终端:

scrapy新建项目

注意注意 项目取名字的时候,不要像我的这个取得这么见名知意,万一你的领导或同事没有八年开发经验和汉语八级,你可能会被打的

见名知意

项目创建完成,可以看到下面的项目目录

项目结构

下面该写爬虫了??no!!在开始写爬虫之前还是来了解一下scrapy的工作流程!

scrapy工作流程图

没错我又从网上偷来的这张图

??图看不太懂?我艹,我就知道有人跟我一样,没关系,来来来,看看别人通俗形象的解释:

引擎:Hi!Spider, 你要处理哪一个网站?

Spiders:我要处理xxoo.com

引擎:你把第一个需要的处理的URL给我吧。

Spiders:给你第一个URL是XXXXXXX.com

引擎:Hi!调度器,我这有request你帮我排序入队一下。

调度器:好的,正在处理你等一下。

引擎:Hi!调度器,把你处理好的request给我,

调度器:给你,这是我处理好的request

引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request

下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)

引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)

Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。

引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,

注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)

以上就是Scrapy整个流程了。

注: 以上引用自博客http://cuiqingcai.com/3472.html

以上完成了对scrapy的工作流程的理解,下面开始进入正题,开始我们的小爬虫,用于scrapy官网给出的例子中的domz网站已经永久关闭,所以下面的例子,我们以http://quotes.toscrape.com/tag/humor/这个网站为例。

Item编写

观察网页的结构后,确定一下需要爬取的页面和想要爬取的内容字段,比如,你要要爬取番号,封面,还是种子呢?别激动,我们在这里只爬取上面的网站每个条目的标题链接作者标签四个字段,

确定要爬取的字段以后,就可以开始爬虫的编写,在==items.py==文件中加入我们要爬取的字段,如下图所示:

item定义

爬虫文件编写

确定以及定义好了我们需要提取的字段,下面就该开始爬虫的编写了,在spiders文件夹下新建自己的爬虫文件:

新建spider文件

对于这个文件里的几行代码,这里只简单的解释一下,详细的介绍以后再说,毕竟这里只是入门嘛!

开始我们导入scrapy模块(这行还看不懂的话)。。。。

我还能说什么

除了这个模块,我们还需要导入之前编写的item文件。之后是定义了一个spider类,该类继承自scrapy.Spider,下面的name = 'PachongSpider'是爬虫的名字,这个名字是唯一的,因为在完成代码后运行爬虫要用到这个名字,start_urls 列表里存放要爬取的链接地址,scrapy会自动从这个列表取出地址进行爬取,并将返回的response作为参数传递给self.parse,在self.parse里就可以从response解析出需要的数据字段(即item里定义的字段)。

关于数据的解析,scrapy提供了多种方式,xpath,css,re,都是可以的,这里先来试试xpath,如果对xpath不是很熟悉,可以先看一下http://www.w3school.com.cn/xpath/index.asp,看了,还不会用???多试几遍就会了,或者也可以借助强大的chrome浏览器

提取xpath

爬虫的编写如下:

#coding:utf-8

import scrapy
from pachong.items import PachongItem

class QuotesSpider(scrapy.Spider):
    name =  'pachong'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        base_url = 'http://quotes.toscrape.com'
        item = PachongItem()
        divs = response.xpath('//div[@class="quote"]')
        for div in divs:
            item['name'] = div.xpath('span[@class="text"]/text()').extract()[0]
            item['url'] = base_url+div.xpath('span/a/@href').extract()[0]
            item['tags'] = div.xpath('div[@class="tags"]/a/text()').extract()
            item['author'] = div.xpath('span/small[@class="author"]/text()').extract()[0]
            print(item)
            yield item

数据持久化

最后我们将爬取的数据持久化到本地,可以存储在文件中,csv,json,当然也可以是数据库,这里采用mongodb来存储(关于python使用mongodb,请自行百度),如同文章开始介绍的,数据持久化需要在pipelines.py文件中进行,
一下开始编写pipelines.py文件

import pymongo

class PachongPipeline(object):
    def __init__(self):
        self.client = pymongo.MongoClient('localhost', 27017)
        self.pchdb = self.client['pchdb']
        self.pchtab = self.pchdb['pchtab']

    def process_item(self, item, spider):
        self.pchtab.insert_one(dict(item))
        return item

首先导入mongodb的python依赖模块,在pipelines.py初始化方法中,连接到mongodb数据库,在process_item方法中向数据库插入数据。这个文件编写完成,需要在settings.py文件中配置该管道

ITEM_PIPELINES = {
   'pachong.pipelines.PachongPipeline': 1,
}

如果运行了程序,数据库没有数据,可能是没有在settings里配置ITEM_PIPELINES。

下面就是运行脚本了,打开终端,进入到爬虫的根目录(到达根目录,scrapy list命令查看爬虫的列表就是前面所说的spider里面的name对应的值),然后输入scrapy crawl pachong,脚本运行完成可以在数据库看到爬取到的数据了

爬取到的数据

最后说一下,每次都要打开终端输入命令来运行脚本多少有些不便,可以在项目的根目录下新建一个python文件输入下面的代码:

from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'pachong'])

execute方法的的参数list中的三个元素是不是很熟悉,没错,就是前面在终端输入过的命令,第三个元素是根据你爬虫的“name”来定的

至此一个简单的爬虫就完成了,至于怎么爬取有分页的网页,怎么设置代理,应对反爬,以及怎么爬取js动态加载的页面,将会在后面的博客中讲到。
最后是代码地址:https://github.com/lexyhp/pachong

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,333评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,812评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,016评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,293评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,650评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,788评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,003评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,741评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,462评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,681评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,168评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,528评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,169评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,119评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,846评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,719评论 2 274

推荐阅读更多精彩内容