使用 Scrapy 爬取去哪兒網景區信息

前言

本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取

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



使用 Scrapy 爬取去哪兒網景區信息

實現過程

製作 Scrapy 爬蟲需如下四步:

  • 創建項目 :創建一個爬蟲項目
  • 明確目標 :明確你想要抓取的目標(編寫 items.py)
  • 製作爬蟲 :製作爬蟲開始爬取網頁(編寫 xxspider.py)
  • 存儲內容 :設計管道存儲爬取內容(編寫pipelines.py)

我們以爬取去哪兒網北京景區信息為例,如圖所示:

使用 Scrapy 爬取去哪兒網景區信息

創建項目

在我們需要新建項目的目錄,使用終端命令 scrapy startproject 項目名 創建項目,我創建的目錄結構如圖所示:

使用 Scrapy 爬取去哪兒網景區信息

  • spiders 存放爬蟲的文件
  • items.py 定義數據類型
  • middleware.py 存放中間件
  • piplines.py 存放數據的有關操作
  • settings.py 配置文件
  • scrapy.cfg 總的控制文件

定義 Item

Item 是保存爬取數據的容器,使用的方法和字典差不多。我們計劃提取的信息包括:area(區域)、sight(景點)、level(等級)、price(價格),在 items.py 定義信息,源碼如下:

<code>import scrapy
class TicketspiderItem(scrapy.Item):
area = scrapy.Field()
sight = scrapy.Field()
level = scrapy.Field()
price = scrapy.Field()
pass/<code>

爬蟲實現

在 spiders 目錄下使用終端命令 scrapy genspider 文件名 要爬取的網址 創建爬蟲文件,然後對其修改及編寫爬取的具體實現,源碼如下:

<code>import scrapy
from ticketSpider.items import TicketspiderItem
class QunarSpider(scrapy.Spider):
name = 'qunar'
allowed_domains = ['piao.qunar.com']
start_urls = ['https://piao.qunar.com/ticket/list.htm?keyword=%E5%8C%97%E4%BA%AC®ion=&from=mpl_search_suggest']
def parse(self, response):
sight_items = response.css('#search-list .sight_item')
for sight_item in sight_items:

item = TicketspiderItem()
item['area'] = sight_item.css('::attr(data-districts)').extract_first()
item['sight'] = sight_item.css('::attr(data-sight-name)').extract_first()
item['level'] = sight_item.css('.level::text').extract_first()
item['price'] = sight_item.css('.sight_item_price em::text').extract_first()
yield item
# 翻頁
next_url = response.css('.next::attr(href)').extract_first()
if next_url:
next_url = "https://piao.qunar.com" + next_url
yield scrapy.Request(
next_url,
callback=self.parse
)/<code>

簡單介紹一下:

  • name:爬蟲名
  • allowed_domains:允許爬取的域名
  • atart_urls:爬取網站初始請求的 url(可定義多個)
  • parse 方法:解析網頁的方法
  • response 參數:請求網頁後返回的內容

yield

在上面的代碼中我們看到有個 yield,簡單說一下,yield 是一個關鍵字,作用和 return 差不多,差別在於 yield 返回的是一個生成器(在 Python 中,一邊循環一邊計算的機制,稱為生成器),它的作用是:有利於減小服務器資源,在列表中所有數據存入內存,而生成器相當於一種方法而不是具體的信息,佔用內存小。

爬蟲偽裝

通常需要對爬蟲進行一些偽裝

  • 使用終端命令 pip install scrapy-fake-useragent 安裝
  • 在 settings.py 文件中添加如下代碼:
<code>DOWNLOADER_MIDDLEWARES = {
# 關閉默認方法
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
# 開啟
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
}/<code>

保存數據

我們將數據保存到本地的 csv 文件中,csv 具體操作可以參考:CSV 文件讀寫,下面看一下具體實現。

首先,在 pipelines.py 中編寫實現,源碼如下:

<code>import csv
class TicketspiderPipeline(object):
def __init__(self):
self.f = open('ticker.csv', 'w', encoding='utf-8', newline='')
self.fieldnames = ['area', 'sight', 'level', 'price']
self.writer = csv.DictWriter(self.f, fieldnames=self.fieldnames)
self.writer.writeheader()
def process_item(self, item, spider):
self.writer.writerow(item)
return item
def close(self, spider):
self.f.close()/<code>

然後,將 settings.py 文件中如下代碼:

<code>ITEM_PIPELINES = {
'ticketSpider.pipelines.TicketspiderPipeline': 300,
}/<code>

放開即可。

運行

我們在 settings.py 的同級目錄下創建運行文件,名字自定義,放入如下代碼:

<code>from scrapy.cmdline import execute
execute('scrapy crawl 爬蟲名'.split())/<code>

這個爬蟲名就是我們之前在爬蟲文件中的 name 屬性值,最後在 Pycharm 運行該文件即可。


分享到:


相關文章: