zoukankan      html  css  js  c++  java
  • 使用 Scrapy 爬取去哪儿网景区信息

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者: 程序员野客

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

    实现过程

    制作 Scrapy 爬虫需如下四步:

    • 创建项目 :创建一个爬虫项目

    • 明确目标 :明确你想要抓取的目标(编写 items.py)

    • 制作爬虫 :制作爬虫开始爬取网页(编写 xxspider.py)

    • 存储内容 :设计管道存储爬取内容(编写pipelines.py)

    我们以爬取去哪儿网北京景区信息为例,如图所示:

    在这里插入图片描述

    创建项目

    在我们需要新建项目的目录,使用终端命令 scrapy startproject 项目名 创建项目,我创建的目录结构如图所示:

    在这里插入图片描述

    • spiders 存放爬虫的文件

    • items.py 定义数据类型

    • middleware.py 存放中间件

    • piplines.py 存放数据的有关操作

    • settings.py 配置文件

    • scrapy.cfg 总的控制文件

    定义 Item

    Item 是保存爬取数据的容器,使用的方法和字典差不多。我们计划提取的信息包括:area(区域)、sight(景点)、level(等级)、price(价格),在 items.py 定义信息,源码如下:

    1 import scrapy
    2 3 class TicketspiderItem(scrapy.Item):
    4     area = scrapy.Field()
    5     sight = scrapy.Field()
    6     level = scrapy.Field()
    7     price = scrapy.Field()
    8     pass

    爬虫实现

    在 spiders 目录下使用终端命令 scrapy genspider 文件名 要爬取的网址 创建爬虫文件,然后对其修改及编写爬取的具体实现,源码如下:

     1 import scrapy
     2 from ticketSpider.items import TicketspiderItem
     3  4 class QunarSpider(scrapy.Spider):
     5     name = 'qunar'
     6     allowed_domains = ['piao.qunar.com']
     7     start_urls = ['https://piao.qunar.com/ticket/list.htm?keyword=%E5%8C%97%E4%BA%AC&region=&from=mpl_search_suggest']
     8  9     def parse(self, response):
    10         sight_items = response.css('#search-list .sight_item')
    11         for sight_item in sight_items:
    12             item = TicketspiderItem()
    13             item['area'] = sight_item.css('::attr(data-districts)').extract_first()
    14             item['sight'] = sight_item.css('::attr(data-sight-name)').extract_first()
    15             item['level'] = sight_item.css('.level::text').extract_first()
    16             item['price'] = sight_item.css('.sight_item_price em::text').extract_first()
    17             yield item
    18         # 翻页
    19         next_url = response.css('.next::attr(href)').extract_first()
    20         if next_url:
    21             next_url = "https://piao.qunar.com" + next_url
    22             yield scrapy.Request(
    23                 next_url,
    24                 callback=self.parse
    25             )

    简单介绍一下:

    • name:爬虫名

    • allowed_domains:允许爬取的域名

    • atart_urls:爬取网站初始请求的 url(可定义多个)

    • parse 方法:解析网页的方法

    • response 参数:请求网页后返回的内容

    yield

    在上面的代码中我们看到有个 yield,简单说一下,yield 是一个关键字,作用和 return 差不多,差别在于 yield 返回的是一个生成器(在 Python 中,一边循环一边计算的机制,称为生成器),它的作用是:有利于减小服务器资源,在列表中所有数据存入内存,而生成器相当于一种方法而不是具体的信息,占用内存小。

    爬虫伪装

    通常需要对爬虫进行一些伪装

    • 使用终端命令 pip install scrapy-fake-useragent 安装

    • 在 settings.py 文件中添加如下代码:

    DOWNLOADER_MIDDLEWARES = {
        # 关闭默认方法
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 
        # 开启
        'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400, 
    }

    保存数据

    我们将数据保存到本地的 csv 文件中,csv 具体操作可以参考:CSV 文件读写,下面看一下具体实现。

    首先,在 pipelines.py 中编写实现,源码如下:

     1 import csv
     2  3 class TicketspiderPipeline(object):
     4     def __init__(self):
     5         self.f = open('ticker.csv', 'w', encoding='utf-8', newline='')
     6         self.fieldnames = ['area', 'sight', 'level', 'price']
     7         self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
     8         self.writer.writeheader()
     9     def process_item(self, item, spider):
    10         self.writer.writerow(item)
    11         return item
    12 13     def close(self, spider):
    14         self.f.close()

    然后,将 settings.py 文件中如下代码:

    ITEM_PIPELINES = {
        'ticketSpider.pipelines.TicketspiderPipeline': 300,
    }

    放开即可。

    运行

    我们在 settings.py 的同级目录下创建运行文件,名字自定义,放入如下代码:

    from scrapy.cmdline import execute
    execute('scrapy crawl 爬虫名'.split())

    这个爬虫名就是我们之前在爬虫文件中的 name 属性值,最后在 Pycharm 运行该文件即可。

  • 相关阅读:
    AcceptEx与完成端口(IOCP)结合实例
    GMap.NET实现电子围栏功能(WPF版)
    十余年软件开发经历,经验总结和程序一览(涉及Socket、WPF、vc++、CAD、图像、GIS)
    AutoCAD 凸度(bulge)的概念及使用WPF函数画图
    WinForm版图像编辑小程序(实现图像拖动、缩放、旋转、抠图)
    使用GMap.NET类库,实现地图轨迹回放。(WPF版)
    使用 GMap.NET 实现添加标注、移动标注功能。(WPF版)
    关于组织召开 “2015中国职业经理人大会”的通知
    Windows平台下使用ffmpeg和segmenter实现m3u8直播点播
    【求职必备】知名互联网公司常见面试问题和应答策略--通用篇
  • 原文地址:https://www.cnblogs.com/Qqun821460695/p/12076759.html
Copyright © 2011-2022 走看看