Scrapy初识

创建Scrapy项目

首先打开命令行,进入你想存放scrapy项目的目录下,输入以下命令

scrapy startproject firstscrapy 

将会创建firstscrapy文件夹,其目录结构如下:

firstscrapy/  
    scrapy.cfg            # 部署配置文件  
  
    coolscrapy/           # Python模块,你所有的代码都放这里面  
        __init__.py  
  
        items.py          # Item定义文件  
  
        pipelines.py      # pipelines定义文件  
  
        settings.py       # 配置文件  
  
        spiders/          # 所有爬虫spider都放这个文件夹下面  
            __init__.py  
            ...  

Item讲解与创建


Item含义:我们爬取网页后得到的数据需要保存,而Item对象是一种简单的容器,可以保存我们爬取得到的数据,让我们可以以字典格式将数据进行保存

Item实例


我们通过创建一个scrapy.Item类,并定义它的类型为scrapy.Field的属性,我们准备将虎嗅网新闻列表的名称、链接地址和摘要爬取下来。

import scrapy  
  
class HuxiuItem(scrapy.Item):  
    title = scrapy.Field()    # 标题  
    link = scrapy.Field()     # 链接  
    desc = scrapy.Field()     # 简述  
    posttime = scrapy.Field() # 发布时间

第一个Spider

在这个类中我们定义了一个初始化的url下载列表,以及怎样跟踪链接,如何解析页面内容来提取Item。

  • name: Spider名称,必须是唯一的
  • start_urls: 初始化下载链接URL
  • parse(): 用来解析下载后的Response对象,该对象也是这个方法的唯一参数。它负责解析返回页面数据并提取出相应的Item(返回Item对象),还有其他合法的链接URL(返回Request对象)。

我们在firstscrapy/spiders文件夹下面新建huxiu_spider.py,内容如下:

#!/usr/bin/env python  
# -*- encoding: utf-8 -*-  
""" 
Topic: sample 
Desc : 
"""  
from firstscrapy.items import HuxiuItem  
import scrapy  
  
class HuxiuSpider(scrapy.Spider):  
    name = "huxiu"  
    allowed_domains = ["huxiu.com"]  
    start_urls = [  
        "http://www.huxiu.com/index.php"  
    ]  
  
    def parse(self, response):  
        for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):  
            item = HuxiuItem()  
            item['title'] = sel.xpath('h3/a/text()')[0].extract()  
            item['link'] = sel.xpath('h3/a/@href')[0].extract()  
            url = response.urljoin(item['link'])  
            item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()  
            print(item['title'],item['link'],item['desc'])  

运行爬虫


在根目录执行下面的命令,其中huxiu是你定义的spider名字:


scrapy crawl huxiu 

处理链接


如果想继续跟踪每个新闻链接进去,看看它的详细内容的话,那么可以在parse()方法中返回一个Request对象,然后注册一个回调函数来解析新闻详情。

from firstscrapy.items import HuxiuItem  
import scrapy  
  
class HuxiuSpider(scrapy.Spider):  
    name = "huxiu"  
    allowed_domains = ["huxiu.com"]  
    start_urls = [  
        "http://www.huxiu.com/index.php"  
    ]  
  
    def parse(self, response):  
        for sel in response.xpath('//div[@class="mod-info-flow"]/div/div[@class="mob-ctt"]'):  
            item = HuxiuItem()  
            item['title'] = sel.xpath('h3/a/text()')[0].extract()  
            item['link'] = sel.xpath('h3/a/@href')[0].extract()  
            url = response.urljoin(item['link'])  
            item['desc'] = sel.xpath('div[@class="mob-sub"]/text()')[0].extract()  
            # print(item['title'],item['link'],item['desc'])  
            yield scrapy.Request(url, callback=self.parse_article)  
  
    def parse_article(self, response):  
        detail = response.xpath('//div[@class="article-wrap"]')  
        item = HuxiuItem()  
        item['title'] = detail.xpath('h1/text()')[0].extract()  
        item['link'] = response.url  
        item['posttime'] = detail.xpath(  
            'div[@class="article-author"]/span[@class="article-time"]/text()')[0].extract()  
        print(item['title'],item['link'],item['posttime'])  
        yield item  

最后我们可以再次运行爬虫

你可能感兴趣的:(Scrapy初识)