首页 > 其他 > 详细

使用 Scrapy 爬取去哪儿网景区信息

时间:2019-12-21 14:44:20      阅读:106      评论:0      收藏:0      [点我收藏+]

前言

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

作者: 程序员野客

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 运行该文件即可。

使用 Scrapy 爬取去哪儿网景区信息

原文:https://www.cnblogs.com/Qqun821460695/p/12076759.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!