Python 爬虫(一)scrapy框架

前几周学习了简单的Python爬虫,准备分两个部分进行总结;第一部分:使用scrapy框架进行简单的爬虫。

首先,讲一下啥叫scrapy?

百度百科:Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

一.安装:(安装必要的包和软件)

1.win系统安装pywin32

2.执行pip install scrapy

二.scrapy的执行流程

1、创建一个Scrapy项目
2、引擎从调度器取出一个URL用于抓取
3、引擎把URL封装成一个Requests请求然后传给下载器把相应结果下载下来并封装成应答包
4、解析应答包
5、定义解析规则(Item)
6、根据定义规则解析内容后交给实体管道等待处理
7、解析出URL交给调度器继续等待被抓取


三.实战!

1.进到你想创建项目的目录下使用下命令
scrapy startproject glory#glory是项目名称
查看项目下目录
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.

tutorial/spiders/: 放置spider代码的目录.

2.定义item

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

3.提取item

Selectors选择器

Scrapy使用了一种基于 XPath 和 CSS 表达式机制: 

Scrapy Selectors示例:

/html/head/title#选择html文档head标签内title元素
/html/head/title/text(): 选择上面提到的 <title> 元素的文字
//td: 选择所有的 <td> 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。
Selector有四个基本的方法:
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.
extract(): 序列化该节点为unicode字符串并返回list。

re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

4.保存爬取数据

scrapy crawl dmoz -o items.json

该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。

5.过程

通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。
首先根据需要从groads.org获取到的数据对item进行建模。 我们需要从groads中获取有效连接,无效连接。 对此,在item中定义相应的字段。编辑 groad目录中的 items.py 文件:
Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。
Spider将爬取到的数据以 Item 对象返回。根据定义的item解析方法,就能把最终爬去数据返回。
最后保存数据。
定义筛选内容
在项目目录下直接编写items脚本

import scrapy
    class GroadItem(scrapy.Item):
    # 定义项目的字段
        valid_link = scrapy.Field()#定义筛选有效连接对象模板
        invalid_link = scrapy.Field()#定义筛选无效连接对象模板
定义爬虫方法
在\spiders目录下建立爬虫工作脚本
# -*- coding: utf-8 -*-
import scrapy
import re
from groad.items import GroadItem


class DmozSpider(scrapy.Spider):
    name = "groads"#项目名称
    allowed_domains = ["sohu.com"]#爬虫作用范围,主要作用于首页之后的页面
    start_urls = ["http://www.sohu.com"]#开始url


    def parse(self, response):
        for sel in re.findall(r'href="(.*?)"', response.xpath("/*").extract_first()):#对响应结果做正则筛选
            item = GroadItem()#获取item解析方法


            if re.findall(r"(\.jpg)|(\.jpeg)|(\.gif)|(\.ico)|(\.png)|(\.js)|(\.css)$", sel.strip()):  # 资源连接筛选出来
                print 6, sel.strip()
                item['invalid_link']=sel.strip()#将爬取数据返回到items解析模板内
                yield item#将数据更新到item对象并做输出


            elif sel.strip().startswith("//"):
                item['valid_link'] = "".join(["http:",sel.strip()])#将爬取数据返回到items解析模板内=
                yield item#将数据更新到item对象并做输出
在项目根目录下执行
scrapy crawl groads -o items.json
自动运行脚本并且把item筛选结果保存到项目根目录下items.json文件内


猜你喜欢

转载自blog.csdn.net/qq_30758629/article/details/80404218