zoukankan      html  css  js  c++  java
  • 使用scrapy进行数据爬取

    1.scrapy是一个python进行网页爬取的库

      文档:http://scrapy-chs.readthedocs.org/zh_CN/latest/index.html

      安装:sudo pip easy_install scrapy

    2.生成项目

      scrapy startproject projectname

      目录结构:

    tutorial/
        scrapy.cfg
        tutorial/
            __init__.py
            items.py
            pipelines.py
            settings.py
            spiders/
                __init__.py
                ...
    • scrapy.cfg: 项目的配置文件
    • tutorial/: 该项目的python模块。之后您将在此加入代码。
    • tutorial/items.py: 项目中的item文件.
    • tutorial/pipelines.py: 项目中的pipelines文件.
    • tutorial/settings.py: 项目的设置文件.
    • tutorial/spiders/: 放置spider代码的目录.

    3.定义item

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

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

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

    from scrapy.item import Item, Field
    
    class CnblogItem(Item):
        title = Field()
        link = Field()
        url = Field()

    3.编辑spider

      为了创建一个Spider,您必须继承 scrapy.spider.Spider 类, 且定义以下三个属性: 

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

      以下为我们的第一个Spider代码,保存在 tutorial/spiders 目录下的 dmoz_spider.py 文件中:

    from scrapy.selector import Selector
    from scrapy.contrib.spiders import CrawlSpider,Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    
    from cnblog.items import CnblogItem
    
    class DmozSpider(CrawlSpider):
        name = 'dmoz'
        allowed_domains = ['cnblogs.com']
        start_urls = ['http://www.cnblogs.com/yu-zhang']
    
        rules = [
            Rule(SgmlLinkExtractor(allow=('yu-zhang/default.html?page=([w]+)', ),)),
            Rule(SgmlLinkExtractor(allow=('yu-zhang/p/', )), callback='parse_item'),
        ]
    
        def parse_item(self, response):
            sel = Selector(response)
            sites = sel.xpath('//h1')
            items = []
            for site in sites:
                item = CnblogItem()
                item['title'] = sel.xpath('/html/head/title/text()').extract()
                item['link'] = site.xpath('a/@href').extract()
                item['url'] = response.url
                items.append(item)
                return items

    4.抓取

      执行命令 scrapy crawl dmoz 便可进行抓取

      执行命令 scrapy crawl dmoz -o items.json -t json 可将抓取内容保存在item.json文件中

      

  • 相关阅读:
    [cf1038E][欧拉路]
    [最小费用最大流(板子)]
    [网络流24题]
    [ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018)]
    [Split The Tree][dfs序+树状数组求区间数的种数]
    [CSL 的魔法][求排序最少交换次数]
    [CSL 的字符串][栈,模拟]
    ZOJ 3949 Edge to the Root 树形DP
    第十三周 Leetcode 363. Max Sum of Rectangle No Larger Than K(HARD)
    POJ 2104 HDU 2665 主席树 解决区间第K大
  • 原文地址:https://www.cnblogs.com/jeesezhang/p/3723126.html
Copyright © 2011-2022 走看看