Python scrapy学习入门

Scrapy 是使用Python编写的一个用来爬取网站数据,提取结构性数据的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。如果不熟悉可以在以下网站学习其基础知识。http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/overview.html

使用Scrapy编写爬虫能大大提高工作效率。在安装好Scrapy之后我们可以在命令行中输入如:scrapy startproject bbs创建一个爬虫项目,在项目中会自动生成如下所示的一些文件。

bbs/

scrapy.cfg

bbs/

init.py

items.py

pipelines.py

settings.py

spiders/

init.py

结合这些生成的文件我们编写一个简单的bbs爬虫主要可以分为3个步骤:1、定义我们需要爬取的数据,这部分主要在items.py中实现。

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

如图所示我们要抓取论坛中的:论坛名称、今日登陆人数、帖子、会员、新会员、今日格言等数据。

所以items.py代码如下:

import scrapy
class BbsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name=scrapy.Field()
    today=scrapy.Field()
    posting=scrapy.Field()
    member=scrapy.Field()
    vanfan_geyan=scrapy.Field()
    newmember=scrapy.Field()

2、编写自己的Spider

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。对spider来说,爬取的循环类似下文:以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者的可迭代容器。 返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。在回调函数内,您可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。最后,由spider返回的item将被存到数据库(由某些 Item Pipeline 处理)或使用 Feed exports 存入到文件中。虽然该循环对任何类型的spider都(多少)适用,但Scrapy仍然为了不同的需求提供了多种默认spider。 之后将讨论这些spider。

我们在spiders文件夹中创建自己的spider.py文件,在这个文件中我们可以编写自己的爬虫类。这里我们自己编写的爬虫类是从scrapy框架的Spider类中继承的。在我们这个最基本的爬虫中我们需要定义自己的爬虫名:name、限制爬虫爬取数据的域名范围:allowed_domain、爬虫开始工作的起始地址:start_urls。然后就可以在parse函数中对返回的response内容进行处理。在Scrapy中提取数据有自己的一套机制,它们被称作选择器(seletors),因为他们通过特定的 XPath 或者CSS 表达式来“选择” HTML文件中的某个部分。在这里我们选用xpath,xpath路径我们可以自己编写也可以使用firedebug中自带的提取xpath路径功能,如图所示,选择需要提取内容的部分右键选择xpath路径即可自动生成,但有时候这样生成的路径可能无法使用,建议自己手动编写。

为了验证我们的xpath路径是否正确,我们可以在shell中进行验证,输入scrapy shell “url”如下图所示:

In中我们输入要提取的xpath路径,Out中就会输出对应位置的文本。

具体的spider代码如下所示:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy import log
from bbs.items import BbsItem

class bbsSpider(Spider):
    name="bbs"
    allowed_domain=["bbs.uestc.edu.cn/"]
    start_urls=[
        "http://bbs.uestc.edu.cn/"
    ]
    def parse(self,response):
        sel=Selector(response)
        item=BbsItem()
        item[‘name‘]=sel.xpath(‘//title/text()‘).extract()
        item[‘today‘]=sel.xpath(‘/html/body/div[6]/div[4]/div[1]/p/em[1]/text()‘).extract()
        item[‘posting‘]=sel.xpath(‘/html/body/div[6]/div[4]/div[1]/p/em[3]/text()‘).extract()
        item[‘member‘]=sel.xpath(‘/html/body/div[6]/div[4]/div[1]/p/em[4]/text()‘).extract()
        item[‘vanfan_geyan‘]=sel.xpath(‘/html/body/div[6]/div[4]/div[1]/div/div/div[1]/a/span/text()‘).extract()
        item[‘newmember‘]=sel.xpath(‘/html/body/div[6]/div[4]/div[1]/p/em[5]/a/text()‘).extract()
        return item

3、编写pipelines、以及配置settings

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

清理HTML数据

(1)验证爬取的数据(检查item包含某些字段)

(2)查重(并丢弃)

(3)将爬取结果保存到数据库中

我们在pipelines.py中主要将spider抓取返回的item数据以utf-8形式保存到一个json文件中。并且在settings.py文件中添加配置项ITEM_PIPELINES = {

‘bbs.pipelines.BbsPipeline’:300,

}

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import codecs
import json
from scrapy import signals

class BbsPipeline(object):
    def __init__(self):
    self.file=codecs.open(‘data.json‘,‘w‘,encoding=‘utf-8‘)

    def process_item(self, item, spider):
    line=json.dumps(dict(item))+‘\n‘
    self.file.write(line.decode("unicode_escape"))
        return item

    def spider_closed(self,spider):
    self.file.close()

最后在该项目的根目录运行scrapy crawl +爬虫名 开始运行爬虫,得到如下所示结果:

在爬虫运行完之后,在项目文件中会生成一个data.json文件,这个就是我们在pipelines.py文件中写的用来保存抓取数据的文件。文件内容如图所示:

时间: 2024-11-12 13:08:18

Python scrapy学习入门的相关文章

python scrapy学习笔记(二)

使用scrapy批量抓取,参考http://python.jobbole.com/87155 一.创建项目 # scrapy startproject comics 创建完成后的目录结构 . ├── comics │   ├── __init__.py │   ├── items.py │   ├── middlewares.py │   ├── pipelines.py │   ├── settings.py │   └── spiders │       └── __init__.py └─

Python 3学习入门一

Python 3版本的相关简介安装参见廖雪峰老师的官方网站,具有一定的指导学习意义. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 安装完毕之后,直接打开Python shell,首先作为程序猿最喜欢的最初始的程序莫过于hello word程序了,Python3中对于输出已经不同于2版本的输出写法,而是 python2中 print 'hello, world'python3中

python scrapy学习笔记

scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型. 一.安装scrapy # pip install scrapy 二.基本使用 1.初始化scrapy项目 # scrapy startproject myscrapy 初始化完成后的目录结构 # tree . ├── myscrapy │   ├── __init__.py │   ├── items.py                      # 设置数据存储模板,用于结构化数据 │   

python scrapy爬虫入门

Scrapy 是一个python下的网络爬虫工具,目前只有python2.x的版本. 安装 Scrapy需要的支持库比较多,安装时挺繁琐的,测试直接用easy_install 或者 pip安装会自动下载安装需要的支持库,但是因为网络或其他种种原因总是安装失败,最好还是各个安装包分开安装. 下载安装Microsoft Visual C++ 2008 Redistributable Package(注意链接是64位)  http://www.microsoft.com/en-us/download/

Python学习笔记之Scrapy框架入门

创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行站点,并提取Items 写一个Item Pipeline用来存储提取出的Items 新建工程 在抓取之前,你需要新建一个Scrapy工程.进入一个你想用来保存代码的目录,然后执行:scrapy startproject tutorial 这个命令会在当前目录下创建一个新目录tutorial,它的结构如下: T:. │  scrapy.cfg │ └─tutorial │  items.py │  pipelines.py

Python学习入门笔记(一):Python文件类型

1.源代码 扩展名:.py,由Python程序解释,不需要编译. --创建hello.py源文件 # cat hello.py  print 'Hello World!' --执行hello.py [[email protected] study]# chmod a+x hello.py  [[email protected] study]# python hello.py  Hello World! [[email protected] study]# ./hello.py  ./hello.

Python学习入门笔记(二):Python运算符

1.算术运算符 "+"加法:3+2=5 "-"减法:3-2=1 "*"乘法:3*2=6 "/"实数除法:3/2=1,3.0/2=1.5 "//"整数除法:5.6//2=2.0 "%"求余数:17%6=5 "**"求幂运算:2**3=8 2.赋值运算符 "="等于:x=3 "+="加等于:x+=2 "-="减等

大牛整理最全Python零基础入门学习资料

大牛整理最全Python零基础入门学习资料 0 发布时间:『 2017-11-12 11:56 』     帖子类别:『人工智能』  阅读次数:3504 (本文『大牛整理最全Python零基础入门学习资料』的责任编辑:老王) 摘要:大牛整理最全Python零基础入门学习资料 Python数据类型--数字 Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. var1 = 1 var2 = 10 您也可以使

给深度学习入门者的Python快速教程

基础篇 numpy和Matplotlib篇 本篇部分代码的下载地址: https://github.com/frombeijingwithlove/dlcv_for_beginners/tree/master/chap5 5.3 Python的科学计算包 – Numpy numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算.这个库的前身是1995年就开始开发的一个用于数组运算的库.经过了长时间的发展,基本上成了绝大部分Python科学计算