Scrapy初识

<h2>创建Scrapy项目<h2>

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

scrapy startproject firstscrapy 

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

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

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

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

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

<h2>第一个Spider<h2>

在这个类中我们定义了一个初始化的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'])  

<h2>运行爬虫<h2>
在根目录执行下面的命令,其中huxiu是你定义的spider名字:


scrapy crawl huxiu 

<h2>处理链接<h2>
如果想继续跟踪每个新闻链接进去,看看它的详细内容的话,那么可以在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  

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容